Files
GitM/internal/sync/scheduler.go
2026-03-31 16:17:50 +08:00

75 lines
1.6 KiB
Go

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
}