fix: seeds ya no reasignan módulos a roles restringidos + Query Runner con alcance real

- Los seeds que creaban módulos nuevos asignaban esos submódulos a TODOS los
  roles en cada arranque (idempotente contra re-agregar lo ya quitado, pero
  igual tocaba roles personalizados/restringidos por primera vez apenas
  existían). Ahora solo se asignan automáticamente al rol "Administrador";
  cualquier rol restringido que crees para un empleado ya no recibe módulos
  nuevos sin que tú se los habilites a propósito desde /app/roles.

- Se revierte el bloqueo "solo administrador" que había puesto en
  /query-runner/run y /run-batch: bloqueaba también a usuarios con el
  submódulo Query Runner correctamente asignado a su rol. En su lugar se
  agrega la validación real que faltaba — RunQuery/RunBatchQuery no
  verificaban que el conx_db_id recibido perteneciera al rol del usuario
  (solo el listado de conexiones del selector estaba filtrado); ahora si no
  es admin, se verifica contra Role.ConxDBs antes de ejecutar cualquier SQL.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Lizandro GD
2026-08-03 19:56:48 +00:00
co-authored by Claude Opus 5
parent 5ac70a4d6e
commit 21f968c532
3 changed files with 101 additions and 53 deletions
+59 -49
View File
@@ -238,14 +238,15 @@ func SeedStatuspage() {
insertados = append(insertados, sub)
}
var roles []models.Roles
if err := db.Find(&roles).Error; err != nil {
log.Printf("[SEED] Error obteniendo roles: %v", err)
// Solo se asigna al rol Administrador: los demás roles pueden estar
// restringidos a propósito y no deben recibir módulos nuevos por su cuenta
// — hay que habilitarlos manualmente desde /app/roles si corresponde.
var rolAdmin models.Roles
if err := db.Where("name = ?", "Administrador").First(&rolAdmin).Error; err != nil {
log.Printf("[SEED] Rol 'Administrador' no encontrado: %v", err)
return
}
for _, rol := range roles {
asignarSubmodulosSiFaltan(&rol, insertados)
}
asignarSubmodulosSiFaltan(&rolAdmin, insertados)
log.Println("[SEED] Seed de Statuspage completado.")
}
@@ -582,14 +583,15 @@ func SeedIntegraciones() {
}
// 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)
// Solo se asigna al rol Administrador: los demás roles pueden estar
// restringidos a propósito y no deben recibir módulos nuevos por su cuenta
// — hay que habilitarlos manualmente desde /app/roles si corresponde.
var rolAdmin models.Roles
if err := db.Where("name = ?", "Administrador").First(&rolAdmin).Error; err != nil {
log.Printf("[SEED] Rol 'Administrador' no encontrado: %v", err)
return
}
for _, rol := range roles {
asignarSubmodulosSiFaltan(&rol, insertados)
}
asignarSubmodulosSiFaltan(&rolAdmin, insertados)
log.Println("[SEED] Seed de Integraciones completado.")
}
@@ -632,14 +634,15 @@ func SeedPasarelas() {
insertados = append(insertados, sub)
}
var roles []models.Roles
if err := db.Find(&roles).Error; err != nil {
log.Printf("[SEED] Error obteniendo roles: %v", err)
// Solo se asigna al rol Administrador: los demás roles pueden estar
// restringidos a propósito y no deben recibir módulos nuevos por su cuenta
// — hay que habilitarlos manualmente desde /app/roles si corresponde.
var rolAdmin models.Roles
if err := db.Where("name = ?", "Administrador").First(&rolAdmin).Error; err != nil {
log.Printf("[SEED] Rol 'Administrador' no encontrado: %v", err)
return
}
for _, rol := range roles {
asignarSubmodulosSiFaltan(&rol, insertados)
}
asignarSubmodulosSiFaltan(&rolAdmin, insertados)
log.Println("[SEED] Seed de Pasarelas completado.")
}
@@ -705,14 +708,15 @@ func SeedServidores() {
}
// 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)
// Solo se asigna al rol Administrador: los demás roles pueden estar
// restringidos a propósito y no deben recibir módulos nuevos por su cuenta
// — hay que habilitarlos manualmente desde /app/roles si corresponde.
var rolAdmin models.Roles
if err := db.Where("name = ?", "Administrador").First(&rolAdmin).Error; err != nil {
log.Printf("[SEED] Rol 'Administrador' no encontrado: %v", err)
return
}
for _, rol := range roles {
asignarSubmodulosSiFaltan(&rol, insertados)
}
asignarSubmodulosSiFaltan(&rolAdmin, insertados)
log.Println("[SEED] Seed de Servidores completado.")
}
@@ -772,14 +776,15 @@ func SeedAdministracion() {
insertados = append(insertados, sub)
}
var roles []models.Roles
if err := db.Find(&roles).Error; err != nil {
log.Printf("[SEED] Error obteniendo roles: %v", err)
// Solo se asigna al rol Administrador: los demás roles pueden estar
// restringidos a propósito y no deben recibir módulos nuevos por su cuenta
// — hay que habilitarlos manualmente desde /app/roles si corresponde.
var rolAdmin models.Roles
if err := db.Where("name = ?", "Administrador").First(&rolAdmin).Error; err != nil {
log.Printf("[SEED] Rol 'Administrador' no encontrado: %v", err)
return
}
for _, rol := range roles {
asignarSubmodulosSiFaltan(&rol, insertados)
}
asignarSubmodulosSiFaltan(&rolAdmin, insertados)
log.Println("[SEED] Seed de Administración completado.")
}
@@ -823,14 +828,15 @@ func SeedSaas() {
insertados = append(insertados, sub)
}
var roles []models.Roles
if err := db.Find(&roles).Error; err != nil {
log.Printf("[SEED] Error obteniendo roles: %v", err)
// Solo se asigna al rol Administrador: los demás roles pueden estar
// restringidos a propósito y no deben recibir módulos nuevos por su cuenta
// — hay que habilitarlos manualmente desde /app/roles si corresponde.
var rolAdmin models.Roles
if err := db.Where("name = ?", "Administrador").First(&rolAdmin).Error; err != nil {
log.Printf("[SEED] Rol 'Administrador' no encontrado: %v", err)
return
}
for _, rol := range roles {
asignarSubmodulosSiFaltan(&rol, insertados)
}
asignarSubmodulosSiFaltan(&rolAdmin, insertados)
log.Println("[SEED] Seed de SaaS completado.")
}
@@ -896,13 +902,15 @@ func SeedTelegram() {
log.Printf("[SEED] Submódulo 'Telegram' ya existe (ID %d)", sub.ID)
}
var roles []models.Roles
if err := db.Find(&roles).Error; err != nil {
// Solo se asigna al rol Administrador: los demás roles pueden estar
// restringidos a propósito y no deben recibir módulos nuevos por su cuenta
// — hay que habilitarlos manualmente desde /app/roles si corresponde.
var rolAdmin models.Roles
if err := db.Where("name = ?", "Administrador").First(&rolAdmin).Error; err != nil {
log.Printf("[SEED] Rol 'Administrador' no encontrado: %v", err)
return
}
for _, rol := range roles {
asignarSubmodulosSiFaltan(&rol, []models.Submodules{sub})
}
asignarSubmodulosSiFaltan(&rolAdmin, []models.Submodules{sub})
log.Println("[SEED] Seed de Telegram completado.")
}
@@ -954,13 +962,15 @@ func SeedPortalClientes() {
insertados = append(insertados, sub)
}
var roles []models.Roles
if err := db.Find(&roles).Error; err != nil {
// Solo se asigna al rol Administrador: los demás roles pueden estar
// restringidos a propósito y no deben recibir módulos nuevos por su cuenta
// — hay que habilitarlos manualmente desde /app/roles si corresponde.
var rolAdmin models.Roles
if err := db.Where("name = ?", "Administrador").First(&rolAdmin).Error; err != nil {
log.Printf("[SEED] Rol 'Administrador' no encontrado: %v", err)
return
}
for _, rol := range roles {
asignarSubmodulosSiFaltan(&rol, insertados)
}
asignarSubmodulosSiFaltan(&rolAdmin, insertados)
log.Println("[SEED] Seed de Portal de Clientes completado.")
}
@@ -1134,7 +1144,7 @@ func SeedWebSms() {
if err := db.Where("name = ?", "Administrador").First(&rolAdmin).Error; err != nil {
log.Printf("[SEED] Rol 'Administrador' no encontrado, se omite asignación: %v", err)
} else {
db.Model(&rolAdmin).Association("Submodules").Append(&[]models.Submodules{sub})
asignarSubmodulosSiFaltan(&rolAdmin, []models.Submodules{sub})
log.Printf("[SEED] Submódulo 'WebSMS' asignado al rol 'Administrador'")
}
log.Println("[SEED] Seed de WebSMS completado.")
@@ -1170,7 +1180,7 @@ func SeedUrlMonitor() {
if err := db.Where("name = ?", "Administrador").First(&rol).Error; err != nil {
log.Printf("[SEED] Rol 'Administrador' no encontrado, se omite asignación: %v", err)
} else {
db.Model(&rol).Association("Submodules").Append(&[]models.Submodules{sub})
asignarSubmodulosSiFaltan(&rol, []models.Submodules{sub})
log.Printf("[SEED] Submódulo 'Monitor de URLs' asignado al rol 'Administrador'")
}
log.Println("[SEED] Seed de Monitor de URLs completado.")
@@ -1206,7 +1216,7 @@ func SeedTareas() {
if err := db.Where("name = ?", "Administrador").First(&rol).Error; err != nil {
log.Printf("[SEED] Rol 'Administrador' no encontrado, se omite asignación: %v", err)
} else {
db.Model(&rol).Association("Submodules").Append(&[]models.Submodules{sub})
asignarSubmodulosSiFaltan(&rol, []models.Submodules{sub})
log.Printf("[SEED] Submódulo 'Tareas' asignado al rol 'Administrador'")
}
log.Println("[SEED] Seed de Tareas completado.")