Spaces:
Runtime error
Runtime error
File size: 2,725 Bytes
32ac45b b55a115 32ac45b b55a115 32ac45b b55a115 32ac45b b55a115 32ac45b b55a115 32ac45b b55a115 32ac45b b55a115 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | package middleware
import (
"strings"
http_error "abdanhafidz.com/go-boilerplate/models/error"
"abdanhafidz.com/go-boilerplate/services"
utils "abdanhafidz.com/go-boilerplate/utils"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
)
type AuthorizationMiddleware interface {
AuthorizeUserToEvent(ctx *gin.Context)
VerifyAdmin(ctx *gin.Context)
VerifySuperAdmin(ctx *gin.Context)
}
type authorizationMiddleware struct {
eventService services.EventService
jwtService services.JWTService
}
func NewAuthorizationMiddleware(eventService services.EventService, jwtService services.JWTService) AuthorizationMiddleware {
return &authorizationMiddleware{
eventService: eventService,
jwtService: jwtService,
}
}
func (m *authorizationMiddleware) AuthorizeUserToEvent(c *gin.Context) {
eventSlug := c.Param("slug")
accountId, exists := c.Get("account_id")
if !exists {
utils.ResponseFAILED(c, eventSlug, http_error.NOT_FOUND_ERROR)
c.Abort()
return
}
err := m.eventService.AuthorizeUserToEvent(c.Request.Context(), eventSlug, accountId.(uuid.UUID))
if err != nil {
utils.ResponseFAILED(c, eventSlug, err)
c.Abort()
return
}
c.Next()
}
func (m *authorizationMiddleware) VerifyAdmin(c *gin.Context) {
authHeader := c.GetHeader("Authorization")
if authHeader == "" {
utils.ResponseFAILED(c, "Authorization header missing", http_error.UNAUTHORIZED)
c.Abort()
return
}
tokenString := strings.Split(authHeader, " ")[1]
claims, err := m.jwtService.ValidateToken(c.Request.Context(), tokenString)
if err != nil {
utils.ResponseFAILED(c, "Invalid token", http_error.UNAUTHORIZED)
c.Abort()
return
}
if claims.Role != "admin" && claims.Role != "super_admin" {
utils.ResponseFAILED(c, "Forbidden: Admin access required", http_error.FORBIDDEN_ERROR)
c.Abort()
return
}
c.Set("role", claims.Role)
c.Set("account_id", claims.AccountId)
c.Next()
}
func (m *authorizationMiddleware) VerifySuperAdmin(c *gin.Context) {
authHeader := c.GetHeader("Authorization")
if authHeader == "" {
utils.ResponseFAILED(c, "Authorization header missing", http_error.UNAUTHORIZED)
c.Abort()
return
}
tokenString := strings.Split(authHeader, " ")[1]
claims, err := m.jwtService.ValidateToken(c.Request.Context(), tokenString)
if err != nil {
utils.ResponseFAILED(c, "Invalid token", http_error.UNAUTHORIZED)
c.Abort()
return
}
if claims.Role != "super_admin" {
utils.ResponseFAILED(c, "Forbidden: Superadmin access required", http_error.FORBIDDEN_ERROR)
c.Abort()
return
}
c.Set("role", claims.Role)
c.Set("account_id", claims.AccountId)
c.Next()
}
|