package sync import ( "fmt" "log" "github.com/robfig/cron/v3" "gitm/internal/database" "gitm/internal/models" ) type Scheduler struct { cron *cron.Cron engine *Engine serverJobs map[int64]cron.EntryID } func NewScheduler(engine *Engine) *Scheduler { return &Scheduler{ cron: cron.New(), engine: engine, serverJobs: make(map[int64]cron.EntryID), } } func (s *Scheduler) Start() { s.cron.Start() log.Println("Scheduler started") } func (s *Scheduler) Stop() { s.cron.Stop() log.Println("Scheduler stopped") } func (s *Scheduler) UpdateServer(server *models.GiteaServer) { if entryID, exists := s.serverJobs[server.ID]; exists { s.cron.Remove(entryID) delete(s.serverJobs, server.ID) } if server.SyncInterval <= 0 || server.Status != "active" { return } schedule := fmt.Sprintf("*/%d * * * *", server.SyncInterval) entryID, err := s.cron.AddFunc(schedule, func() { log.Printf("Scheduled sync for server %d (%s)", server.ID, server.Name) if err := s.engine.SyncServer(server.ID); err != nil { log.Printf("Scheduled sync failed for server %d: %v", server.ID, err) } }) if err != nil { log.Printf("Failed to schedule for server %d: %v", server.ID, err) return } s.serverJobs[server.ID] = entryID } func (s *Scheduler) RemoveServer(serverID int64) { if entryID, exists := s.serverJobs[serverID]; exists { s.cron.Remove(entryID) delete(s.serverJobs, serverID) } } func (s *Scheduler) ReloadAll() error { servers, err := database.GetServers() if err != nil { return err } for _, server := range servers { s.UpdateServer(&server) } return nil }