Initial commit
This commit is contained in:
@@ -0,0 +1,115 @@
|
||||
package middlewares
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/sujit-baniya/fiber-boilerplate/pkg/auth"
|
||||
"github.com/sujit-baniya/fiber-boilerplate/pkg/models"
|
||||
)
|
||||
|
||||
func MenuMiddleware(c *fiber.Ctx) error {
|
||||
// Verificar si el usuario está logueado
|
||||
if !auth.IsLoggedIn(c) {
|
||||
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
|
||||
"error": true,
|
||||
"message": "Usuario no autenticado",
|
||||
})
|
||||
}
|
||||
|
||||
// Obtener los datos del usuario autenticado
|
||||
user, err := auth.User(c)
|
||||
if err != nil {
|
||||
// Si ocurre un error al obtener el usuario, finalizar la solicitud
|
||||
fmt.Printf("Error al obtener usuario: %v\n", err)
|
||||
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
|
||||
"error": true,
|
||||
"message": "Usuario no válido o sesión expirada",
|
||||
})
|
||||
}
|
||||
|
||||
// Buscar los módulos y submódulos del usuario
|
||||
userModules, err := models.FindUserByID(user.ID)
|
||||
if err != nil {
|
||||
fmt.Printf("Error al buscar datos del usuario: %v\n", err)
|
||||
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
|
||||
"error": true,
|
||||
"message": "Error al obtener datos del usuario",
|
||||
})
|
||||
}
|
||||
|
||||
// Organizar los módulos y submódulos
|
||||
moduleMap := make(map[string][]map[string]string)
|
||||
|
||||
for _, submodule := range userModules.Role.Submodules {
|
||||
// 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
|
||||
submoduleData := map[string]string{
|
||||
"title": submodule.Title,
|
||||
"url": submodule.Url, // Suponiendo que el submódulo tiene un campo `URL`
|
||||
}
|
||||
// Agregar el submódulo a la lista correspondiente del módulo
|
||||
moduleMap[moduleName] = append(moduleMap[moduleName], submoduleData)
|
||||
}
|
||||
|
||||
// Ordenar los módulos alfabéticamente
|
||||
var sortedModules []string
|
||||
for module := range moduleMap {
|
||||
sortedModules = append(sortedModules, module)
|
||||
}
|
||||
sort.Strings(sortedModules)
|
||||
|
||||
// Ordenar los submódulos de cada módulo alfabéticamente
|
||||
for _, moduleName := range sortedModules {
|
||||
// Ordenar los submódulos alfabéticamente por título
|
||||
sort.Slice(moduleMap[moduleName], func(i, j int) bool {
|
||||
return moduleMap[moduleName][i]["title"] < moduleMap[moduleName][j]["title"]
|
||||
})
|
||||
}
|
||||
c.Locals("userModules", moduleMap)
|
||||
|
||||
// Obtener un array solo con las URLs
|
||||
var urls []string
|
||||
for _, submodules := range moduleMap {
|
||||
for _, submoduleData := range submodules {
|
||||
urls = append(urls, submoduleData["url"])
|
||||
}
|
||||
}
|
||||
|
||||
// Opcional: adjuntar la lista de URLs al contexto
|
||||
c.Locals("urls", urls)
|
||||
|
||||
// Verificar si la URL de la solicitud está en la lista de URLs permitidas
|
||||
requestURL := c.Path()
|
||||
|
||||
// Obtener el índice del último '/' en la URL de la solicitud
|
||||
lastSlashIndex := strings.LastIndex(requestURL, "/")
|
||||
if lastSlashIndex != -1 {
|
||||
// Obtener solo la parte de la URL después del último '/'
|
||||
requestURL = requestURL[lastSlashIndex+1:]
|
||||
}
|
||||
|
||||
// Verificar si la URL modificada está en la lista de URLs permitidas
|
||||
urlAllowed := false
|
||||
for _, url := range urls {
|
||||
// Comparar solo la parte de la URL después del último '/'
|
||||
if requestURL == url[strings.LastIndex(url, "/")+1:] {
|
||||
urlAllowed = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// Si la URL no está permitida, devolver un error
|
||||
if !urlAllowed {
|
||||
return c.Status(fiber.StatusForbidden).JSON(fiber.Map{
|
||||
"error": true,
|
||||
"message": "Acceso no permitido a esta ruta",
|
||||
})
|
||||
}
|
||||
|
||||
// Continuar con la siguiente función de middleware o manejador
|
||||
return c.Next()
|
||||
}
|
||||
Reference in New Issue
Block a user