package scheduler import ( "context" "github.com/redis/go-redis/v9" "github.com/robfig/cron/v3" "github.com/tuusuario/go-sync-service/internal/config" "github.com/tuusuario/go-sync-service/internal/domain/dto" "github.com/tuusuario/go-sync-service/internal/domain/ports" fetcher "github.com/tuusuario/go-sync-service/internal/sync" "github.com/tuusuario/go-sync-service/internal/utils" "gorm.io/gorm" ) var currentCron *cron.Cron func Start(ctx context.Context, redisClient *redis.Client, cfg ports.RedisConfigProvider, database *gorm.DB) { config.Log.Info("πŸš€ Iniciando Scheduler...") if err := loadAndStartJobs(ctx, cfg, database); err != nil { config.Log.Errorf("❌ Error inicializando jobs: %v", err) } go listenCronReload(ctx, redisClient, cfg, database) } func loadAndStartJobs(ctx context.Context, cfg ports.RedisConfigProvider, dbConn *gorm.DB) error { lista, err := utils.CargarDesdeRedis[dto.CronConfigList](cfg, config.CronConfig) if err != nil { return err } if currentCron != nil { currentCron.Stop() } newCron := cron.New() for _, job := range lista.Crons { //Valida si el cron esta habilitado if !job.Configuracion.Enabled { config.Log.WithField("job", job.Nombre).Warn("⏸️ Job desactivado") continue } job := job // closure-safe _, err := newCron.AddFunc(job.Configuracion.Ejecucion, func() { config.Log.Infof("πŸš€ Ejecutando job: %s", job.Nombre) //cargar Job fetcher.SyncData(cfg, dbConn, job) }) if err != nil { config.Log.Errorf("❌ Error registrando job %s: %v", job.Nombre, err) } } newCron.Start() currentCron = newCron config.Log.Info("βœ… Jobs registrados exitosamente") return nil }