diff --git a/errors.go b/errors.go index f42af5e6e1d2abe15bed93db9a497319d4311cc0..55c23675d45429134096295dec1cf05f967ffb03 100644 --- a/errors.go +++ b/errors.go @@ -45,4 +45,5 @@ var ( ErrNoManager = fmt.Errorf("no manager") ErrCannotLoadStatsFromDatabase = fmt.Errorf("errors while loading stats from database") ErrInvalidTime = fmt.Errorf("invalid time") + ErrSchedulerMisconfiguration = fmt.Errorf("scheduler misconfiguration") ) diff --git a/persistence.go b/persistence.go index 72a2c4848c67ab09d8191a9b9ea2df4078b26a31..f46426804d3417d32112a36d7f28579d67336f66 100644 --- a/persistence.go +++ b/persistence.go @@ -3,6 +3,7 @@ package jobqueue import ( "encoding/json" "fmt" + "github.com/robfig/cron/v3" "gopkg.in/yaml.v3" "gorm.io/gorm" "io" @@ -253,9 +254,26 @@ func CreateJobAndSchedulerFromPersistence(jobImport JobPersistence, manager *Man var scheduler Scheduler switch sType { case "interval": + + if jobImport.Scheduler.Interval == 0 { + return nil, nil, fmt.Errorf("%w: interval is 0", ErrSchedulerMisconfiguration) + } + scheduler = &IntervalScheduler{Interval: jobImport.Scheduler.Interval} case "cron": + + if jobImport.Scheduler.Spec == "" { + return nil, nil, fmt.Errorf("%w: spec is empty", ErrSchedulerMisconfiguration) + } + + // check spec + parser := cron.NewParser(cron.Second | cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow | cron.Descriptor) + _, err := parser.Parse(jobImport.Scheduler.Spec) + if err != nil { + return nil, nil, fmt.Errorf("%w: %v", ErrSchedulerMisconfiguration, err) + } + scheduler = &CronScheduler{ Spec: jobImport.Scheduler.Spec, } @@ -266,14 +284,28 @@ func CreateJobAndSchedulerFromPersistence(jobImport JobPersistence, manager *Man case "delay": + if jobImport.Scheduler.Delay == 0 { + return nil, nil, fmt.Errorf("%w: delay is 0", ErrSchedulerMisconfiguration) + } + scheduler = &DelayScheduler{Delay: jobImport.Scheduler.Delay} + case "event": + + if jobImport.Scheduler.Event == "" { + return nil, nil, fmt.Errorf("%w: event is empty", ErrSchedulerMisconfiguration) + } + scheduler = &EventScheduler{Event: EventName(jobImport.Scheduler.Event)} case "instant": scheduler = &InstantScheduler{} case "time": + if jobImport.Scheduler.Time == nil { + return nil, nil, fmt.Errorf("%w: time is nil", ErrSchedulerMisconfiguration) + } + scheduler = &TimeScheduler{Time: *jobImport.Scheduler.Time} default: