package middlewares import ( "github.com/gofiber/fiber/v2" "github.com/sujit-baniya/fiber-boilerplate/pkg/auth" "github.com/sujit-baniya/fiber-boilerplate/pkg/models" ) // PortalAuth protege las rutas del portal de clientes. // Si no hay sesión válida, destruye la sesión obsoleta y redirige a /portal/login. func PortalAuth() fiber.Handler { return func(c *fiber.Ctx) error { user, err := auth.PortalUser(c) if err != nil || user == nil { // Limpiar sesión inválida/obsoleta para romper posibles redirect loops _ = auth.DestroyPortalSession(c) return c.Redirect("/portal/login") } c.Locals("portalUser", user) return c.Next() } } // LoadPortalUserMiddleware carga el portal user en locals (sin redirigir). func LoadPortalUserMiddleware(c *fiber.Ctx) error { user, err := auth.PortalUser(c) if err == nil && user != nil { c.Locals("portalUser", user) } return c.Next() } // PortalUserFromLocals extrae el portal user del contexto (helper para controladores). func PortalUserFromLocals(c *fiber.Ctx) *models.PortalUser { u, _ := c.Locals("portalUser").(*models.PortalUser) return u } // PortalPartnerOnly permite el acceso solo a usuarios con rol "partner". func PortalPartnerOnly() fiber.Handler { return func(c *fiber.Ctx) error { u := PortalUserFromLocals(c) if u == nil || u.Rol != "partner" { return c.Status(fiber.StatusForbidden).JSON(fiber.Map{"error": "Acceso exclusivo para partners"}) } return c.Next() } }