package handler import ( "net/http" "strings" "bugulma/backend/internal/service" "github.com/gin-gonic/gin" ) type AuthHandler struct { authService *service.AuthService } func NewAuthHandler(authService *service.AuthService) *AuthHandler { return &AuthHandler{authService: authService} } type LoginRequest struct { Email string `json:"email" binding:"required,email"` Password string `json:"password" binding:"required"` } type LoginResponse struct { Token string `json:"token"` User UserResponse `json:"user"` } type UserResponse struct { ID string `json:"id"` Email string `json:"email"` Name string `json:"name"` Role string `json:"role"` } func (h *AuthHandler) Login(c *gin.Context) { var req LoginRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } token, user, err := h.authService.Login(c.Request.Context(), req.Email, req.Password) if err != nil { c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid credentials"}) return } c.JSON(http.StatusOK, LoginResponse{ Token: token, User: UserResponse{ ID: user.ID, Email: user.Email, Name: user.Name, Role: string(user.Role), }, }) } // Me returns the current authenticated user's information func (h *AuthHandler) Me(c *gin.Context) { // Get the Authorization header authHeader := c.GetHeader("Authorization") if !strings.HasPrefix(authHeader, "Bearer ") { c.JSON(http.StatusUnauthorized, gin.H{"error": "Missing or invalid authorization header"}) return } tokenString := strings.TrimPrefix(authHeader, "Bearer ") if tokenString == "" { c.JSON(http.StatusUnauthorized, gin.H{"error": "Missing token"}) return } // Validate the token and get user information user, err := h.authService.ValidateToken(c.Request.Context(), tokenString) if err != nil { c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid or expired token"}) return } c.JSON(http.StatusOK, UserResponse{ ID: user.ID, Email: user.Email, Name: user.Name, Role: string(user.Role), }) }