package controllers import ( "log" "time" "github.com/gofiber/fiber/v2" "github.com/sujit-baniya/fiber-boilerplate/app" "github.com/sujit-baniya/fiber-boilerplate/pkg/models" ) // RunSeed ejecuta el seed de módulos/submodulos del sistema de forma idempotente. // GET /app/run-seed — requiere sesión activa. func RunSeed(c *fiber.Ctx) error { if err := seedModulo("Integraciones", "Conexión con servicios externos: Hostinger, Cloudflare y más", []seedEntry{ {"Hostinger", "Panel de VPS, dominios, hosting y DNS de Hostinger", "/app/hostinger"}, {"Cloudflare", "Gestión de zonas, DNS, SSL y firewall en Cloudflare", "/app/cloudflare"}, {"Pasarelas de Pago", "Configuración de Bold, dLocal y otras pasarelas", "/app/pasarelas-pago"}, }); err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()}) } if err := seedModulo("Conexiones", "Gestión de servidores y conexiones de base de datos", []seedEntry{ {"Conexiones DB", "Lista y configuración de conexiones de base de datos", "/app/conexion_db"}, {"Query Runner", "Editor SQL: ejecutar consultas, exportar y ver historial", "/app/query-runner"}, {"Conexiones SSH", "Gestión de conexiones SSH a servidores", "/app/conexion_ssh"}, }); err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()}) } if err := seedModulo("Renovaciones", "Gestión de contratos, clientes y notificaciones de vencimiento", []seedEntry{ {"Contratos", "Gestión de contratos y vencimientos", "/app/contratos"}, {"Clientes", "Clientes y datos de contacto", "/app/clientes"}, {"Servicios", "Catálogo de servicios", "/app/servicios"}, {"Plantillas Correo", "Editor de plantillas de correo", "/app/plantillas-correo"}, {"Reglas de Aviso", "Reglas de notificación automática", "/app/reglas-notificacion"}, {"Historial Notif.", "Historial de correos enviados", "/app/historial-notificaciones"}, {"Config. SMTP", "Configuración del servidor de correo", "/app/smtp-config"}, }); err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()}) } return c.JSON(fiber.Map{ "ok": true, "message": "Seed ejecutado correctamente. Recarga la página de Roles.", }) } type seedEntry struct{ title, desc, url string } func seedModulo(titulo, descripcion string, entries []seedEntry) error { db := app.Http.Database.DB var modulo models.Modules if err := db.Where("title = ?", titulo).First(&modulo).Error; err != nil { modulo = models.Modules{ Title: titulo, Description: descripcion, ModifiedAt: time.Now(), } if err := db.Create(&modulo).Error; err != nil { log.Printf("[SEED] Error creando módulo '%s': %v", titulo, err) return err } log.Printf("[SEED] Módulo '%s' creado (ID %d)", titulo, modulo.ID) } else { log.Printf("[SEED] Módulo '%s' ya existe (ID %d)", titulo, modulo.ID) } var insertados []models.Submodules for _, e := range entries { var sub models.Submodules if err := db.Where("url = ?", e.url).First(&sub).Error; err != nil { sub = models.Submodules{ Title: e.title, Description: e.desc, Url: e.url, ModuleId: modulo.ID, ModifiedAt: time.Now(), } if err := db.Create(&sub).Error; err != nil { log.Printf("[SEED] Error creando submódulo '%s': %v", e.title, err) continue } log.Printf("[SEED] Submódulo '%s' creado (ID %d)", e.title, sub.ID) } else { if sub.ModuleId != modulo.ID { db.Model(&sub).Update("module_id", modulo.ID) } log.Printf("[SEED] Submódulo '%s' ya existe (ID %d)", e.title, sub.ID) } insertados = append(insertados, sub) } var roles []models.Roles if err := db.Find(&roles).Error; err != nil { return err } for _, rol := range roles { if err := db.Model(&rol).Association("Submodules").Append(&insertados); err != nil { log.Printf("[SEED] Error asignando submódulos al rol '%s': %v", rol.Name, err) } } return nil }