mirror of
https://github.com/idanoo/autobrr
synced 2025-07-23 16:59:12 +00:00
90 lines
1.6 KiB
Go
90 lines
1.6 KiB
Go
package scheduler
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/autobrr/autobrr/internal/logger"
|
|
|
|
"github.com/robfig/cron/v3"
|
|
)
|
|
|
|
type Service interface {
|
|
Start()
|
|
Stop()
|
|
AddJob(job cron.Job, interval string, identifier string) (int, error)
|
|
RemoveJobByID(id cron.EntryID) error
|
|
RemoveJobByIdentifier(id string) error
|
|
}
|
|
|
|
type service struct {
|
|
log logger.Logger
|
|
cron *cron.Cron
|
|
|
|
jobs map[string]cron.EntryID
|
|
}
|
|
|
|
func NewService(log logger.Logger) Service {
|
|
return &service{
|
|
log: log,
|
|
cron: cron.New(cron.WithChain(
|
|
cron.Recover(cron.DefaultLogger),
|
|
)),
|
|
jobs: map[string]cron.EntryID{},
|
|
}
|
|
}
|
|
|
|
func (s *service) Start() {
|
|
s.log.Debug().Msg("scheduler.Start")
|
|
|
|
s.cron.Start()
|
|
return
|
|
}
|
|
|
|
func (s *service) Stop() {
|
|
s.log.Debug().Msg("scheduler.Stop")
|
|
s.cron.Stop()
|
|
return
|
|
}
|
|
func (s *service) AddJob(job cron.Job, interval string, identifier string) (int, error) {
|
|
|
|
id, err := s.cron.AddJob(interval, cron.NewChain(
|
|
cron.SkipIfStillRunning(cron.DiscardLogger)).Then(job),
|
|
)
|
|
if err != nil {
|
|
return 0, fmt.Errorf("scheduler: add job failed: %w", err)
|
|
}
|
|
|
|
s.log.Debug().Msgf("scheduler.AddJob: job successfully added: %v", id)
|
|
|
|
// add to job map
|
|
s.jobs[identifier] = id
|
|
|
|
return int(id), nil
|
|
}
|
|
|
|
func (s *service) RemoveJobByID(id cron.EntryID) error {
|
|
v, ok := s.jobs[""]
|
|
if !ok {
|
|
return nil
|
|
}
|
|
|
|
s.cron.Remove(v)
|
|
return nil
|
|
}
|
|
|
|
func (s *service) RemoveJobByIdentifier(id string) error {
|
|
v, ok := s.jobs[id]
|
|
if !ok {
|
|
return nil
|
|
}
|
|
|
|
s.log.Debug().Msgf("scheduler.Remove: removing job: %v", id)
|
|
|
|
// remove from cron
|
|
s.cron.Remove(v)
|
|
|
|
// remove from jobs map
|
|
delete(s.jobs, id)
|
|
|
|
return nil
|
|
}
|