package middlewares import ( "net/http" "strings" "github.com/Caknoooo/go-gin-clean-starter/modules/auth/service" "github.com/Caknoooo/go-gin-clean-starter/modules/user/dto" "github.com/Caknoooo/go-gin-clean-starter/pkg/utils" "github.com/gin-gonic/gin" ) func Authenticate(jwtService service.JWTService) gin.HandlerFunc { return func(ctx *gin.Context) { authHeader := ctx.GetHeader("Authorization") if authHeader == "" { response := utils.BuildResponseFailed(dto.MESSAGE_FAILED_PROSES_REQUEST, dto.MESSAGE_FAILED_TOKEN_NOT_FOUND, nil) ctx.AbortWithStatusJSON(http.StatusUnauthorized, response) return } if !strings.Contains(authHeader, "Bearer ") { response := utils.BuildResponseFailed(dto.MESSAGE_FAILED_PROSES_REQUEST, dto.MESSAGE_FAILED_TOKEN_NOT_VALID, nil) ctx.AbortWithStatusJSON(http.StatusUnauthorized, response) return } authHeader = strings.Replace(authHeader, "Bearer ", "", -1) token, err := jwtService.ValidateToken(authHeader) if err != nil { response := utils.BuildResponseFailed(dto.MESSAGE_FAILED_PROSES_REQUEST, dto.MESSAGE_FAILED_TOKEN_NOT_VALID, nil) ctx.AbortWithStatusJSON(http.StatusUnauthorized, response) return } if !token.Valid { response := utils.BuildResponseFailed(dto.MESSAGE_FAILED_PROSES_REQUEST, dto.MESSAGE_FAILED_DENIED_ACCESS, nil) ctx.AbortWithStatusJSON(http.StatusUnauthorized, response) return } tokenInfo, err := jwtService.GetUserIDByToken(authHeader) if err != nil { response := utils.BuildResponseFailed(dto.MESSAGE_FAILED_PROSES_REQUEST, err.Error(), nil) ctx.AbortWithStatusJSON(http.StatusUnauthorized, response) return } ctx.Set("token", authHeader) ctx.Set("client_id", tokenInfo.ClientID) ctx.Set("user_id", tokenInfo.UserID) ctx.Set("role_id", tokenInfo.RoleID) ctx.Set("warehouse_id", tokenInfo.WarehouseID) ctx.Next() } }