mirror of https://github.com/usememos/memos
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
1.5 KiB
Go
59 lines
1.5 KiB
Go
package scheduler
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
// JobHandler is the function signature for scheduled job handlers.
|
|
// The context passed to the handler will be canceled if the scheduler is shutting down.
|
|
type JobHandler func(ctx context.Context) error
|
|
|
|
// Job represents a scheduled task.
|
|
type Job struct {
|
|
// Name is a unique identifier for this job (required).
|
|
// Used for logging and metrics.
|
|
Name string
|
|
|
|
// Schedule is a cron expression defining when this job runs (required).
|
|
// Supports standard 5-field format: "minute hour day month weekday"
|
|
// Examples: "0 * * * *" (hourly), "0 0 * * *" (daily at midnight)
|
|
Schedule string
|
|
|
|
// Timezone for schedule evaluation (optional, defaults to UTC).
|
|
// Use IANA timezone names: "America/New_York", "Europe/London", etc.
|
|
Timezone string
|
|
|
|
// Handler is the function to execute when the job triggers (required).
|
|
Handler JobHandler
|
|
|
|
// Description provides human-readable context about what this job does (optional).
|
|
Description string
|
|
|
|
// Tags allow categorizing jobs for filtering/monitoring (optional).
|
|
Tags []string
|
|
}
|
|
|
|
// Validate checks if the job definition is valid.
|
|
func (j *Job) Validate() error {
|
|
if j.Name == "" {
|
|
return errors.New("job name is required")
|
|
}
|
|
|
|
if j.Schedule == "" {
|
|
return errors.New("job schedule is required")
|
|
}
|
|
|
|
// Validate cron expression using parser
|
|
if _, err := ParseCronExpression(j.Schedule); err != nil {
|
|
return errors.Wrap(err, "invalid cron expression")
|
|
}
|
|
|
|
if j.Handler == nil {
|
|
return errors.New("job handler is required")
|
|
}
|
|
|
|
return nil
|
|
}
|