fix(menu): el administrador no veía los módulos a los que sí puede entrar

El módulo Facturas tiene ruta, vista y seed, pero no aparecía en el menú.
No faltaba: MenuMiddleware arma el menú solo con los submódulos del rol del
usuario, y esa parte corre ANTES del bypass de IsAdmin.

O sea que un administrador entra a cualquier ruta escribiéndola, pero solo
ve en el menú lo que su rol tenga asignado. Un módulo completo puede
parecer inexistente por eso, y no hay nada en pantalla que lo explique.

Ahora, si el usuario es administrador, el menú se arma con todos los
submódulos: coincide con el acceso que ya tiene. Para el resto no cambia
nada — siguen viendo solo lo suyo.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-08-15 20:56:21 -05:00
co-authored by Claude Sonnet 5
parent 351454c018
commit 0100986a46
2 changed files with 26 additions and 1 deletions
+11
View File
@@ -82,3 +82,14 @@ func DeleteSumodule(id uint) error {
}
return nil
}
// AllSubmodulesConModulo devuelve todos los submódulos con su módulo cargado.
//
// Lo usa el menú para los administradores: como entran a todas las rutas,
// tienen que ver todos los enlaces. Con Preload porque el menú agrupa por el
// título del módulo, y sin él quedaría todo bajo un grupo vacío.
func AllSubmodulesConModulo() ([]Submodules, error) {
var items []Submodules
err := app.Http.Database.DB.Preload("Module").Order("id ASC").Find(&items).Error
return items, err
}
+15 -1
View File
@@ -2,6 +2,7 @@ package middlewares
import (
"fmt"
"log"
"sort"
"strings"
@@ -43,7 +44,20 @@ func MenuMiddleware(c *fiber.Ctx) error {
// Organizar los módulos y submódulos
moduleMap := make(map[string][]map[string]string)
for _, submodule := range userModules.Role.Submodules {
// El administrador entra a todas las rutas (ver más abajo), pero el menú
// se armaba solo con los submódulos de SU rol: podía acceder a una
// pantalla y no tener el enlace por ningún lado. Es lo que hacía que un
// módulo existente —con ruta, vista y seed— pareciera no existir.
visibles := userModules.Role.Submodules
if user.IsAdmin {
if todos, err := models.AllSubmodulesConModulo(); err == nil {
visibles = todos
} else {
log.Printf("[MENU] no se pudo cargar el menú completo para el administrador: %v", err)
}
}
for _, submodule := range visibles {
// Recuperar el nombre del módulo
moduleName := submodule.Module.Title
// Crear un mapa para cada submódulo que contenga el título y la URL