package scheduler import ( "context" email "github.com/tuusuario/go-sync-service/internal/email" "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, email email.SMTPEmailService) { config.Log.Info("πŸš€ Iniciando Scheduler...") if err := loadAndStartJobs(ctx, cfg, database, email); err != nil { config.Log.Errorf("❌ Error inicializando jobs: %v", err) _ = email.PrepareEmail("ERROR AL OBTENER CRONS", err.Error(), cfg) } go listenCronReload(ctx, redisClient, cfg, database, email) } func loadAndStartJobs(ctx context.Context, cfg ports.RedisConfigProvider, dbConn *gorm.DB, email email.SMTPEmailService) 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, email) }) if err != nil { config.Log.Errorf("❌ Error registrando job %s: %v", job.Nombre, err) _ = email.PrepareEmail("ERROR AL REGISTRAR EL JOB: "+job.Nombre, err.Error(), cfg) } } newCron.Start() currentCron = newCron config.Log.Info("βœ… Jobs registrados exitosamente") return nil }