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"}, {"Coolify", "Gestión de aplicaciones, servicios, bases de datos y deployments con Coolify", "/app/coolify"}, {"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()}) } if err := seedModulo("Integraciones", "Conexión con servicios externos: Hostinger, Cloudflare y más", []seedEntry{ {"Telegram", "Notificaciones y alertas por Telegram", "/app/telegram"}, }); err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()}) } if err := seedModulo("SaaS", "Gestión de productos SaaS e integraciones de pago", []seedEntry{ {"Productos SaaS", "Gestión de productos SaaS y su documentación asociada", "/app/saas"}, {"Integraciones SaaS", "Callbacks de pago hacia APIs externas y logs de despacho", "/app/saas-api"}, }); err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()}) } if err := seedModulo("Portal de Clientes", "Portal de clientes: proyectos, facturas y accesos", []seedEntry{ {"Proyectos", "Gestión de proyectos y avances del portal", "/app/proyectos"}, {"Facturas", "Gestión de facturas y pagos por cliente", "/app/facturas"}, {"Portal Usuarios", "Usuarios con acceso al portal de clientes", "/app/portal-usuarios"}, }); 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 }