package handlers import ( models "api-service/internal/models/auth" services "api-service/internal/services/auth" "net/http" "github.com/gin-gonic/gin" ) // TokenHandler handles token generation endpoints type TokenHandler struct { authService *services.AuthService } // NewTokenHandler creates a new token handler func NewTokenHandler(authService *services.AuthService) *TokenHandler { return &TokenHandler{ authService: authService, } } // GenerateToken godoc // @Summary Generate JWT token // @Description Generate a JWT token for a user // @Tags Token // @Accept json // @Produce json // @Param token body models.LoginRequest true "User credentials" // @Success 200 {object} models.TokenResponse // @Failure 400 {object} map[string]string "Bad request" // @Failure 401 {object} map[string]string "Unauthorized" // @Router /api/v1/token/generate [post] func (h *TokenHandler) GenerateToken(c *gin.Context) { var loginReq models.LoginRequest // Bind JSON request if err := c.ShouldBindJSON(&loginReq); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } // Generate token tokenResponse, err := h.authService.Login(loginReq.Username, loginReq.Password) if err != nil { c.JSON(http.StatusUnauthorized, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, tokenResponse) } // GenerateTokenDirect godoc // @Summary Generate token directly // @Description Generate a JWT token directly without password verification (for testing) // @Tags Token // @Accept json // @Produce json // @Param user body map[string]string true "User info" // @Success 200 {object} models.TokenResponse // @Failure 400 {object} map[string]string "Bad request" // @Router /api/v1/token/generate-direct [post] func (h *TokenHandler) GenerateTokenDirect(c *gin.Context) { var req struct { Username string `json:"username" binding:"required"` Email string `json:"email" binding:"required"` Role string `json:"role" binding:"required"` } if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } // Create a temporary user for token generation user := &models.User{ ID: "temp-" + req.Username, Username: req.Username, Email: req.Email, Role: req.Role, } // Generate token directly token, err := h.authService.GenerateTokenForUser(user) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, models.TokenResponse{ AccessToken: token, TokenType: "Bearer", ExpiresIn: 3600, }) }