96 lines
2.5 KiB
Go
96 lines
2.5 KiB
Go
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,
|
|
})
|
|
}
|