58 lines
1.4 KiB
Go
58 lines
1.4 KiB
Go
package middleware
|
|
|
|
import (
|
|
"web-qudo-be/app/database/entity/users"
|
|
"web-qudo-be/app/module/users/repository"
|
|
utilSvc "web-qudo-be/utils/service"
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
"github.com/rs/zerolog"
|
|
)
|
|
|
|
const (
|
|
UserContextKey = "user"
|
|
UserLevelContextKey = "user_level_id"
|
|
)
|
|
|
|
// UserMiddleware extracts user information from JWT token and stores in context
|
|
func UserMiddleware(usersRepo repository.UsersRepository) fiber.Handler {
|
|
return func(c *fiber.Ctx) error {
|
|
// Skip if no Authorization header
|
|
authHeader := c.Get("Authorization")
|
|
if authHeader == "" {
|
|
return c.Next()
|
|
}
|
|
|
|
// Get user info from token
|
|
// Create a default logger if not available in context
|
|
log := zerolog.Nop()
|
|
if logFromCtx, ok := c.Locals("log").(zerolog.Logger); ok {
|
|
log = logFromCtx
|
|
}
|
|
user := utilSvc.GetUserInfo(log, usersRepo, authHeader)
|
|
if user != nil {
|
|
// Store user in context
|
|
c.Locals(UserContextKey, user)
|
|
c.Locals(UserLevelContextKey, user.UserLevelId)
|
|
}
|
|
|
|
return c.Next()
|
|
}
|
|
}
|
|
|
|
// GetUser retrieves the user from the context
|
|
func GetUser(c *fiber.Ctx) *users.Users {
|
|
if user, ok := c.Locals(UserContextKey).(*users.Users); ok {
|
|
return user
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// GetUserLevelID retrieves the user level ID from the context
|
|
func GetUserLevelID(c *fiber.Ctx) *uint {
|
|
if userLevelId, ok := c.Locals(UserLevelContextKey).(uint); ok {
|
|
return &userLevelId
|
|
}
|
|
return nil
|
|
}
|