package handler import ( "net/http" "opus-api/internal/middleware" "opus-api/internal/service" "opus-api/internal/types" "github.com/gin-gonic/gin" ) // AuthHandler 认证处理器 type AuthHandler struct { authService *service.AuthService } // NewAuthHandler 创建认证处理器 func NewAuthHandler(authService *service.AuthService) *AuthHandler { return &AuthHandler{authService: authService} } // LoginRequest 登录请求 type LoginRequest struct { Username string `json:"username" binding:"required"` Password string `json:"password" binding:"required"` } // LoginResponse 登录响应 type LoginResponse struct { Token string `json:"token"` User User `json:"user"` } // User 用户信息 type User struct { ID uint `json:"id"` Username string `json:"username"` } // Login 登录 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 } user, token, err := h.authService.Login(req.Username, req.Password) if err != nil { c.JSON(http.StatusUnauthorized, gin.H{"error": "invalid username or password"}) return } c.JSON(http.StatusOK, LoginResponse{ Token: token, User: User{ ID: user.ID, Username: user.Username, }, }) } // Logout 登出 func (h *AuthHandler) Logout(c *gin.Context) { userID, ok := middleware.GetUserID(c) if !ok { c.JSON(http.StatusUnauthorized, gin.H{"error": "unauthorized"}) return } if err := h.authService.Logout(userID); err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to logout"}) return } c.JSON(http.StatusOK, gin.H{"message": "logged out successfully"}) } // Me 获取当前用户信息 func (h *AuthHandler) Me(c *gin.Context) { userID, ok := middleware.GetUserID(c) if !ok { c.JSON(http.StatusUnauthorized, gin.H{"error": "unauthorized"}) return } user, err := h.authService.GetUserByID(userID) if err != nil { c.JSON(http.StatusNotFound, gin.H{"error": "user not found"}) return } c.JSON(http.StatusOK, User{ ID: user.ID, Username: user.Username, }) } // ChangePassword 修改密码 func (h *AuthHandler) ChangePassword(c *gin.Context) { var req types.ChangePasswordRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "请求参数错误: " + err.Error()}) return } // 从上下文获取当前用户ID userID, ok := middleware.GetUserID(c) if !ok { c.JSON(http.StatusUnauthorized, gin.H{"error": "unauthorized"}) return } // 修改密码 if err := h.authService.ChangePassword(userID, req.OldPassword, req.NewPassword); err != nil { if err == service.ErrInvalidCredentials { c.JSON(http.StatusBadRequest, gin.H{"error": "原密码错误"}) return } c.JSON(http.StatusInternalServerError, gin.H{"error": "密码修改失败"}) return } c.JSON(http.StatusOK, gin.H{"message": "密码修改成功"}) }