2025-10-15 10:43:58 -04:00

63 lines
1.7 KiB
Go

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
}