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