From 0100986a46ba96ba0f496384446e22ce5ca7bf6c Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Sat, 15 Aug 2026 20:56:21 -0500 Subject: [PATCH] =?UTF-8?q?fix(menu):=20el=20administrador=20no=20ve=C3=AD?= =?UTF-8?q?a=20los=20m=C3=B3dulos=20a=20los=20que=20s=C3=AD=20puede=20entr?= =?UTF-8?q?ar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- pkg/models/submodules.go | 11 +++++++++++ rest/middlewares/menu.go | 16 +++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/pkg/models/submodules.go b/pkg/models/submodules.go index 1f786a7..bc84560 100755 --- a/pkg/models/submodules.go +++ b/pkg/models/submodules.go @@ -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 +} diff --git a/rest/middlewares/menu.go b/rest/middlewares/menu.go index aa5f37b..64cd8ff 100755 --- a/rest/middlewares/menu.go +++ b/rest/middlewares/menu.go @@ -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