66 lines
1.9 KiB
Go
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
|
|
}
|