Files
GoMFT/internal/scheduler/metadata.go
T
StarFleetCPTN b35174f857 feat: Introduce scheduler and notification enhancements
- Integrated new components for job scheduling, including a cron-based scheduler and improved job execution logic.
- Refactored job executor to utilize interfaces for better dependency management and testing.
- Enhanced notification system with a new Notifier interface, allowing for flexible notification service integration.
- Added comprehensive unit tests for job executor, scheduler, and notification components to ensure reliability and correctness.
- Updated metadata handling to support new database interfaces, improving testability and maintainability.
2025-03-29 21:23:52 -07:00

76 lines
2.7 KiB
Go

package scheduler
import (
"errors"
"fmt"
"github.com/starfleetcptn/gomft/internal/db"
"gorm.io/gorm"
)
// MetadataDB defines the database methods needed by MetadataHandler.
// This allows for easier mocking during testing.
type MetadataDB interface {
GetFileMetadataByHash(hash string) (*db.FileMetadata, error)
GetFileMetadataByJobAndName(jobID uint, fileName string) (*db.FileMetadata, error)
}
// MetadataHandler handles checking file processing history.
type MetadataHandler struct {
db MetadataDB // Use the interface type
logger *Logger // Added logger dependency
}
// NewMetadataHandler creates a new MetadataHandler.
func NewMetadataHandler(database MetadataDB, logger *Logger) *MetadataHandler { // Accept the interface type
return &MetadataHandler{
db: database,
logger: logger,
}
}
// hasFileBeenProcessed checks if a file with the same hash has been processed before.
func (mh *MetadataHandler) hasFileBeenProcessed(jobID uint, fileHash string) (bool, *db.FileMetadata, error) {
if fileHash == "" {
return false, nil, nil
}
// First try to find by hash (most reliable)
metadata, err := mh.db.GetFileMetadataByHash(fileHash) // Calls the interface method
if err == nil && metadata != nil {
// Optional: Add logging here if needed
mh.logger.LogDebug("Found existing metadata by hash for job %d, hash %s", jobID, fileHash)
return true, metadata, nil
}
// Handle DB errors
if err != nil {
// If the error is specifically "record not found", it means not processed, which is not an error for this function.
if errors.Is(err, gorm.ErrRecordNotFound) {
return false, nil, nil // Not found, no error to return
}
// For any other DB error, log it and return it.
mh.logger.LogError("Error checking metadata by hash for job %d, hash %s: %v", jobID, fileHash, err)
return false, nil, err // Return the actual DB error
}
// Should not be reached if err is nil and metadata is nil, but return false just in case.
return false, nil, nil
}
// checkFileProcessingHistory checks processing history for a given file name within a specific job.
func (mh *MetadataHandler) checkFileProcessingHistory(jobID uint, fileName string) (*db.FileMetadata, error) {
// Try to find by job and filename
metadata, err := mh.db.GetFileMetadataByJobAndName(jobID, fileName) // Calls the interface method
if err == nil && metadata != nil {
mh.logger.LogDebug("Found existing metadata by name for job %d, file %s", jobID, fileName)
return metadata, nil
}
if err != nil {
mh.logger.LogError("Error checking metadata by name for job %d, file %s: %v", jobID, fileName, err)
// Don't return error here, just indicate not found
}
return nil, fmt.Errorf("no history found for file %s in job %d", fileName, jobID)
}