From 92ac8419fecf40f5f10629964d8388df1addec2f Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Fri, 1 May 2026 12:25:21 -0500 Subject: [PATCH] =?UTF-8?q?feat:=20seed=20m=C3=B3dulo=20Servidores=20con?= =?UTF-8?q?=20Conexi=C3=B3nDB,=20SSH,=20Query=20Runner=20y=20cat=C3=A1logo?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.go | 1 + migrations/migrate.go | 77 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) diff --git a/main.go b/main.go index 479ba61..22fb0d9 100755 --- a/main.go +++ b/main.go @@ -57,6 +57,7 @@ func main() { migrations.SeedRenovaciones() migrations.SeedIntegraciones() migrations.SeedPasarelas() + migrations.SeedServidores() // Iniciar cron de vencimientos services.IniciarCron() defer services.DetenerCron() diff --git a/migrations/migrate.go b/migrations/migrate.go index 39eb7c0..6a8a26c 100755 --- a/migrations/migrate.go +++ b/migrations/migrate.go @@ -319,3 +319,80 @@ func SeedPasarelas() { log.Println("[SEED] Seed de Pasarelas completado.") } + +// SeedServidores crea el módulo "Servidores" con los submódulos de gestión +// de servidores, conexiones SSH/DB, tipos y el Query Runner. Es idempotente. +func SeedServidores() { + db := app.Http.Database.DB + + // 1. Crear/obtener módulo + var modulo models.Modules + if err := db.Where("title = ?", "Servidores").First(&modulo).Error; err != nil { + modulo = models.Modules{ + Title: "Servidores", + Description: "Gestión de servidores, conexiones de base de datos y Query Runner", + ModifiedAt: time.Now(), + } + if err := db.Create(&modulo).Error; err != nil { + log.Printf("[SEED] Error creando módulo Servidores: %v", err) + return + } + log.Printf("[SEED] Módulo 'Servidores' creado con ID %d", modulo.ID) + } else { + log.Printf("[SEED] Módulo 'Servidores' ya existe (ID %d)", modulo.ID) + } + + // 2. Definir submódulos + entries := []struct{ title, desc, url string }{ + {"Servidores", "Lista y gestión de servidores registrados", "/app/servidor"}, + {"Conexión DB", "Conexiones de base de datos a servidores", "/app/conexion_db"}, + {"Conexión SSH", "Conexiones SSH a servidores", "/app/conexion_ssh"}, + {"Tipo DB", "Catálogo de tipos de base de datos", "/app/tipo_db"}, + {"Tipo Servidor", "Catálogo de tipos de servidor", "/app/tipo_servidor"}, + {"Proveedor Servidor", "Catálogo de proveedores de servidor", "/app/prov_servidor"}, + {"Query Runner", "Editor SQL con historial y exportación", "/app/query-runner"}, + } + + 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' reasignado a módulo Servidores", sub.Title) + } else { + log.Printf("[SEED] Submódulo '%s' ya existe (ID %d)", sub.Title, sub.ID) + } + } + insertados = append(insertados, sub) + } + + // 3. Asignar a todos los roles existentes + var roles []models.Roles + if err := db.Find(&roles).Error; err != nil { + log.Printf("[SEED] Error obteniendo roles: %v", err) + return + } + 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) + } else { + log.Printf("[SEED] Submódulos de Servidores asignados al rol '%s'", rol.Name) + } + } + + log.Println("[SEED] Seed de Servidores completado.") +}