package utils import ( "errors" "time" "lokideploy/config" "github.com/golang-jwt/jwt/v5" "github.com/gin-gonic/gin" ) type Claims struct { UserID uint `json:"userId"` Username string `json:"username"` Role string `json:"role"` jwt.RegisteredClaims } func GenerateToken(userID uint, username, role string) (string, error) { cfg := config.GetConfig() claims := Claims{ UserID: userID, Username: username, Role: role, RegisteredClaims: jwt.RegisteredClaims{ ExpiresAt: jwt.NewNumericDate(time.Now().Add(24 * time.Hour)), IssuedAt: jwt.NewNumericDate(time.Now()), Subject: username, }, } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString([]byte(cfg.JWTSecret)) } func ParseToken(tokenString string) (*Claims, error) { cfg := config.GetConfig() token, err := jwt.ParseWithClaims(tokenString, &Claims{}, func(token *jwt.Token) (interface{}, error) { return []byte(cfg.JWTSecret), nil }) if err != nil { return nil, err } if claims, ok := token.Claims.(*Claims); ok && token.Valid { return claims, nil } return nil, errors.New("invalid token") } func GetUserFromContext(c *gin.Context) (*Claims, bool) { user, exists := c.Get("user") if !exists { return nil, false } claims, ok := user.(*Claims) return claims, ok } func IsAdmin(c *gin.Context) bool { claims, ok := GetUserFromContext(c) return ok && claims.Role == "admin" }