package middleware import ( "net/http" "strings" "xboard-go/internal/database" "xboard-go/internal/model" "xboard-go/internal/service" "xboard-go/pkg/utils" "github.com/gin-gonic/gin" ) func Auth() gin.HandlerFunc { return func(c *gin.Context) { authHeader := c.GetHeader("Authorization") if authHeader == "" { c.JSON(http.StatusUnauthorized, gin.H{"message": "unauthorized"}) c.Abort() return } parts := strings.SplitN(authHeader, " ", 2) if len(parts) != 2 || parts[0] != "Bearer" { c.JSON(http.StatusUnauthorized, gin.H{"message": "invalid authorization header"}) c.Abort() return } claims, err := utils.VerifyToken(parts[1]) if err != nil { c.JSON(http.StatusUnauthorized, gin.H{"message": "token expired or invalid"}) c.Abort() return } if service.IsSessionTokenRevoked(parts[1]) { c.JSON(http.StatusUnauthorized, gin.H{"message": "session has been revoked"}) c.Abort() return } c.Set("user_id", claims.UserID) c.Set("is_admin", claims.IsAdmin) c.Set("auth_token", parts[1]) c.Set("session", service.TrackSession(claims.UserID, parts[1], c.ClientIP(), c.GetHeader("User-Agent"))) c.Next() } } func AdminAuth() gin.HandlerFunc { return func(c *gin.Context) { isAdmin, exists := c.Get("is_admin") if !exists || !isAdmin.(bool) { c.JSON(http.StatusForbidden, gin.H{"message": "admin access required"}) c.Abort() return } c.Next() } } func ClientAuth() gin.HandlerFunc { return func(c *gin.Context) { token := c.Query("token") if token == "" { token = c.Param("token") } if token == "" { c.JSON(http.StatusForbidden, gin.H{"message": "token is required"}) c.Abort() return } var user model.User if err := database.DB.Where("token = ?", token).First(&user).Error; err != nil { c.JSON(http.StatusForbidden, gin.H{"message": "invalid token"}) c.Abort() return } c.Set("user", &user) c.Set("user_id", user.ID) c.Set("is_admin", user.IsAdmin) c.Next() } }