diff --git a/database-1_test.go b/database-1_test.go index 47348a9f8119d80e94abe0e9db0b4881aa6bd8e0..1a53e86c8da62309a118f8a72318301a0a49a95b 100644 --- a/database-1_test.go +++ b/database-1_test.go @@ -6,11 +6,12 @@ package jobqueue import ( + "testing" + "time" + "github.com/stretchr/testify/assert" "gorm.io/driver/sqlite" "gorm.io/gorm" - "testing" - "time" ) func TestWriteToDB1(t *testing.T) { diff --git a/errors.go b/errors.go index d04724af46c2ea6396e035990680582a0314c3de..999a0d85c552fb7f891893fdcdc54a4785e37559 100644 --- a/errors.go +++ b/errors.go @@ -8,58 +8,64 @@ import ( ) var ( - ErrMissingDependency = fmt.Errorf("missing dependency") - ErrCycleDetected = fmt.Errorf("cycle detected") - ErrQueueEmpty = fmt.Errorf("queue is empty") - ErrJobAlreadyExists = fmt.Errorf("job already exists") - ErrWorkerNotRunning = fmt.Errorf("worker is not running") - ErrMaxJobsReached = fmt.Errorf("maximum number of jobs reached") - ErrWorkerAlreadyRunning = fmt.Errorf("worker is already running") - ErrWorkerAlreadyAdded = fmt.Errorf("worker is already added") - ErrWorkerNotAdded = fmt.Errorf("worker is not added") - ErrNoWorkers = fmt.Errorf("no workers") - ErrWorkerAlreadyStopped = fmt.Errorf("worker is already stopped") - ErrManagerAlreadyStopped = fmt.Errorf("manager is already stopped") - ErrManagerAlreadyRunning = fmt.Errorf("manager is already running") - ErrManagerNotRunning = fmt.Errorf("manager is not running") - ErrJobNotScheduled = fmt.Errorf("job is not scheduled") - ErrCronNotInitialized = fmt.Errorf("cron is not initialized") - ErrCPUPercentage = fmt.Errorf("cpu percentage must be between 0 and 100") - ErrIntervalIsZero = fmt.Errorf("interval must be greater than 0") - ErrUnknownRunnableType = fmt.Errorf("unknown runnable type") - ErrUnknownSchedulerType = fmt.Errorf("unknown scheduler type") - ErrUnsupportedDatabaseType = fmt.Errorf("unsupported database type") - ErrUnsupportedFileOption = fmt.Errorf("unsupported file option") - ErrUnsupportedCredentialType = fmt.Errorf("unsupported credential type") - ErrUnsupportedTransferDirection = fmt.Errorf("unsupported transfer direction") - ErrInvalidData = fmt.Errorf("invalid data") - ErrUnknownFormat = fmt.Errorf("unknown format") - ErrFailedToCreateTempFile = fmt.Errorf("failed to create temp file") - ErrFailedToWriteTempFile = fmt.Errorf("failed to write temp file") - ErrJobAlreadyScheduled = fmt.Errorf("job already scheduled") - ErrNoDatabaseConnection = fmt.Errorf("no database connection") - ErrDBSaverNotRunning = fmt.Errorf("dbsaver is not running") - ErrDBSaverNotInitialized = fmt.Errorf("dbsaver is not initialized") - ErrSchedulerNotSet = fmt.Errorf("scheduler is not set") - ErrJobNotActive = fmt.Errorf("job is not active") - ErrJobAlreadyActive = fmt.Errorf("job is already active") - ErrChannelAlreadyClosed = fmt.Errorf("the channel is already closed") - ErrUnknownScheduleType = fmt.Errorf("unknown schedule type") - ErrNoManager = fmt.Errorf("no manager") - ErrCannotLoadStatsFromDatabase = fmt.Errorf("errors while loading stats from database") - ErrInvalidTime = fmt.Errorf("invalid time") - ErrSchedulerMisconfiguration = fmt.Errorf("scheduler misconfiguration") - ErrInvalidDuration = fmt.Errorf("invalid duration") - ErrJobSyncerAlreadyRunning = fmt.Errorf("JobSyncer is already running") - ErrJobSyncerNotRunning = fmt.Errorf("JobSyncer is not running") - ErrMaxRetriesReached = fmt.Errorf("maximum number of retries reached") - ErrTimeoutReached = fmt.Errorf("timeout reached") - ErrFailedToCreate = fmt.Errorf("failed to create") - ErrFailedToQueryExistingJob = fmt.Errorf("failed to query an existing job") - ErrFailedToSaveJob = fmt.Errorf("failed to save a job") - ErrScheduleTimeIsInThePast = fmt.Errorf("scheduled time is in the past") - ErrParameterIsNil = fmt.Errorf("parameter is nil") - ErrJobIDEmpty = fmt.Errorf("job ID is empty") - ErrManagerNotInitialized = fmt.Errorf("manager is not initialized") - ErrJobSyncerNotInitialized = fmt.Errorf("JobSyncer is not initialized") + ErrMissingDependency = newUIError("missing dependency") + ErrCycleDetected = newUIError("cycle detected") + ErrQueueEmpty = newUIError("queue is empty") + ErrJobAlreadyExists = newUIError("job already exists") + ErrWorkerNotRunning = newUIError("worker is not running") + ErrMaxJobsReached = newUIError("maximum number of jobs reached") + ErrWorkerAlreadyRunning = newUIError("worker is already running") + ErrWorkerAlreadyAdded = newUIError("worker is already added") + ErrWorkerNotAdded = newUIError("worker is not added") + ErrNoWorkers = newUIError("no workers") + ErrWorkerAlreadyStopped = newUIError("worker is already stopped") + ErrManagerAlreadyStopped = newUIError("manager is already stopped") + ErrManagerAlreadyRunning = newUIError("manager is already running") + ErrManagerNotRunning = newUIError("manager is not running") + ErrJobNotScheduled = newUIError("job is not scheduled") + ErrCronNotInitialized = newUIError("cron is not initialized") + ErrCPUPercentage = newUIError("cpu percentage must be between 0 and 100") + ErrIntervalIsZero = newUIError("interval must be greater than 0") + ErrUnknownRunnableType = newUIError("unknown runnable type") + ErrUnknownSchedulerType = newUIError("unknown scheduler type") + ErrUnsupportedDatabaseType = newUIError("unsupported database type") + ErrUnsupportedFileOption = newUIError("unsupported file option") + ErrUnsupportedCredentialType = newUIError("unsupported credential type") + ErrUnsupportedTransferDirection = newUIError("unsupported transfer direction") + ErrInvalidData = newUIError("invalid data") + ErrUnknownFormat = newUIError("unknown format") + ErrFailedToCreateTempFile = newUIError("failed to create temp file") + ErrFailedToWriteTempFile = newUIError("failed to write temp file") + ErrJobAlreadyScheduled = newUIError("job already scheduled") + ErrNoDatabaseConnection = newUIError("no database connection") + ErrSchedulerNotSet = newUIError("scheduler is not set") + ErrJobNotActive = newUIError("job is not active") + ErrJobAlreadyActive = newUIError("job is already active") + ErrChannelAlreadyClosed = newUIError("the channel is already closed") + ErrUnknownScheduleType = newUIError("unknown schedule type") + ErrCannotLoadStatsFromDatabase = newUIError("errors while loading stats from database") + ErrInvalidTime = newUIError("invalid time") + ErrSchedulerMisconfiguration = newUIError("scheduler misconfiguration") + ErrMaxRetriesReached = newUIError("maximum number of retries reached") + ErrTimeoutReached = newUIError("timeout reached") + ErrFailedToCreate = newUIError("failed to create") + ErrFailedToQueryExistingJob = newUIError("failed to query an existing job") + ErrFailedToSaveJob = newUIError("failed to save a job") + ErrParameterIsNil = newUIError("parameter is nil") + ErrJobIDEmpty = newUIError("job ID is empty") + ErrManagerNotInitialized = newUIError("manager is not initialized") + ErrScheduleTimeIsInThePast = newUIError("scheduled time is in the past") ) + +// UIError is an error that can be displayed to the user +type UIError struct { + msg string +} + +func newUIError(msg string, args ...any) *UIError { + return &UIError{msg: fmt.Sprintf(msg, args...)} +} + +func (e *UIError) Error() string { + return e.msg +} diff --git a/persistence.go b/persistence.go index 012552f1f655484fe1f4954a11fe9aeecc2c5dea..df6857514a1b93601cea2a8acba98ae5b7e54f21 100644 --- a/persistence.go +++ b/persistence.go @@ -5,6 +5,7 @@ package jobqueue import ( "encoding/json" + "errors" "fmt" "github.com/robfig/cron/v3" "gopkg.in/yaml.v3" @@ -247,11 +248,8 @@ func ReadFromGORM(db *gorm.DB) ([]JobPersistence, error) { } if len(wrappedErr) > 0 { - returnErr := ErrCannotLoadStatsFromDatabase - for _, err := range wrappedErr { - returnErr = fmt.Errorf("%w: %v", returnErr, err) - } - return returnErr + wrappedErr = append(wrappedErr, ErrCannotLoadStatsFromDatabase) + return errors.Join(wrappedErr...) } return nil