package trigger import ( "time" . "github.com/mickael-kerjean/filestash/server/common" ) var ( cron_name = "schedule" cron_event = make(chan ITriggerEvent, 10) ) func init() { Hooks.Register.WorkflowTrigger(&ScheduleTrigger{}) } type ScheduleTrigger struct{} func (this *ScheduleTrigger) Manifest() WorkflowSpecs { return WorkflowSpecs{ Name: cron_name, Title: "On a Schedule", Subtitle: "frequency", Icon: ``, Specs: Form{ Elmnts: []FormElement{ { Name: "frequency", Type: "select", Opts: []string{"per-minute", "hourly", "daily", "weekly", "monthly"}, Value: "daily", }, }, }, Order: 1, } } func (this *ScheduleTrigger) Init() (chan ITriggerEvent, error) { go func() { for { if err := triggerEvents(cron_event, cron_name, scheduleCallback); err != nil { Log.Error("[workflow] trigger=schedule step=triggerEvents err=%s", err.Error()) } time.Sleep(60 * time.Second) } }() return cron_event, nil } func scheduleCallback(params map[string]string) (map[string]string, bool) { shouldTrigger := false now := time.Now() out := map[string]string{"frequency": params["frequency"]} switch params["frequency"] { case "per-minute": shouldTrigger = true case "hourly": shouldTrigger = now.Minute() == 0 case "daily": shouldTrigger = now.Hour() == 0 && now.Minute() == 0 case "weekly": shouldTrigger = now.Weekday() == time.Sunday && now.Hour() == 0 && now.Minute() == 0 case "monthly": shouldTrigger = now.Day() == 1 && now.Hour() == 0 && now.Minute() == 0 } return out, shouldTrigger }