2025-10-29 10:36:36 -04:00

66 lines
1.9 KiB
Go

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
}