package handler import ( "cloudnest/internal/application/auth" "cloudnest/internal/application/captcha" "cloudnest/internal/application/email" "cloudnest/internal/pkg/errors" "cloudnest/internal/pkg/response" "github.com/gin-gonic/gin" ) // AuthHandler handles HTTP requests for authentication operations. // AuthHandler 处理认证操作的 HTTP 请求。 // // This struct acts as the controller layer for authentication endpoints, // converting HTTP requests to service calls and formatting responses. // // 此结构体作为认证端点的控制器层,将 HTTP 请求转换为服务调用并格式化响应。 type AuthHandler struct { service *auth.AuthService captchaService *captcha.CaptchaService emailService *email.EmailService } // NewAuthHandler creates a new AuthHandler. // NewAuthHandler 创建一个新的 AuthHandler。 // // Parameters: // - service: The authentication service to use. // - captchaService: The captcha service to use. // - emailService: The email service to use. // // Returns: // - *AuthHandler: A pointer to the new AuthHandler instance. // // 参数: // - service: 要使用的认证服务。 // - captchaService: 要使用的验证码服务。 // - emailService: 要使用的邮件服务。 // // 返回值: // - *AuthHandler: 新创建的 AuthHandler 实例指针。 func NewAuthHandler(service *auth.AuthService, captchaService *captcha.CaptchaService, emailService *email.EmailService) *AuthHandler { return &AuthHandler{ service: service, captchaService: captchaService, emailService: emailService, } } // Register handles user registration requests. // Register 处理用户注册请求。 // // Request: // - Method: POST // - Path: /api/v1/auth/register // - Body: {"username": "string", "password": "string"} // // Response: // - Success: 200 OK {"code": 0, "message": "注册成功"} // - Conflict: 409 {"code": 409, "message": "用户名已存在"} // - Bad Request: 400 {"code": 400, "message": "参数错误"} // // 请求: // - 方法: POST // - 路径: /api/v1/auth/register // - 请求体: {"username": "string", "password": "string"} // // 响应: // - 成功: 200 OK {"code": 0, "message": "注册成功"} // - 冲突: 409 {"code": 409, "message": "用户名已存在"} // - 请求错误: 400 {"code": 400, "message": "参数错误"} func (h *AuthHandler) Register(c *gin.Context) { var req auth.RegisterRequest if err := c.ShouldBindJSON(&req); err != nil { response.BadRequest(c, "参数错误") return } if !h.captchaService.Verify(req.CaptchaID, req.CaptchaAnswer) { response.BadRequest(c, "图形验证码错误") return } if err := h.service.Register(req.Username, req.Password, req.Email, req.Nickname, req.EmailCode); err != nil { if appErr, ok := errors.AsAppError(err); ok { response.Error(c, appErr.Code, appErr.Message) } else { response.InternalError(c, err.Error()) } return } response.SuccessMsg(c, "注册成功") } // Login handles user login requests. // Login 处理用户登录请求。 // // Request: // - Method: POST // - Path: /api/v1/auth/login // - Body: {"username": "string", "password": "string"} // // Response: // - Success: 200 OK {"code": 0, "message": "success", "data": {"token": "string"}} // - Unauthorized: 401 {"code": 401, "message": "用户名或密码错误"} // - Bad Request: 400 {"code": 400, "message": "参数错误"} // // 请求: // - 方法: POST // - 路径: /api/v1/auth/login // - 请求体: {"username": "string", "password": "string"} // // 响应: // - 成功: 200 OK {"code": 0, "message": "success", "data": {"token": "string"}} // - 未授权: 401 {"code": 401, "message": "用户名或密码错误"} // - 请求错误: 400 {"code": 400, "message": "参数错误"} func (h *AuthHandler) Login(c *gin.Context) { var req auth.LoginRequest if err := c.ShouldBindJSON(&req); err != nil { response.BadRequest(c, "参数错误") return } if !h.captchaService.Verify(req.CaptchaID, req.CaptchaAnswer) { response.BadRequest(c, "图形验证码错误") return } token, _, err := h.service.Login(req.Username, req.Password) if err != nil { if appErr, ok := errors.AsAppError(err); ok { response.Error(c, appErr.Code, appErr.Message) } else { response.InternalError(c, err.Error()) } return } response.Success(c, auth.TokenResponse{Token: token}) } func (h *AuthHandler) Profile(c *gin.Context) { userCode := c.GetString("user_code") if userCode == "" { response.Unauthorized(c, "用户码不能为空") return } user, err := h.service.GetUserInfo(userCode) if err != nil { if appErr, ok := errors.AsAppError(err); ok { response.Error(c, appErr.Code, appErr.Message) } else { response.InternalError(c, err.Error()) } return } response.Success(c, map[string]interface{}{ "username": user.Username, "nickname": user.Nickname, "email": user.Email, "phone": user.Phone, "storage_used": user.StorageUsed, "storage_limit": user.StorageLimit, }) } func (h *AuthHandler) UpdateProfile(c *gin.Context) { userCode := c.GetString("user_code") if userCode == "" { response.Unauthorized(c, "用户码不能为空") return } var req auth.UpdateProfileRequest if err := c.ShouldBindJSON(&req); err != nil { response.BadRequest(c, "参数错误") return } if err := h.service.UpdateProfile(userCode, req.Email, req.Phone, req.Nickname); err != nil { if appErr, ok := errors.AsAppError(err); ok { response.Error(c, appErr.Code, appErr.Message) } else { response.InternalError(c, err.Error()) } return } response.SuccessMsg(c, "更新成功") } func (h *AuthHandler) ChangePassword(c *gin.Context) { userCode := c.GetString("user_code") if userCode == "" { response.Unauthorized(c, "用户码不能为空") return } var req auth.ChangePasswordRequest if err := c.ShouldBindJSON(&req); err != nil { response.BadRequest(c, "参数错误") return } if err := h.service.ChangePassword(userCode, req.CurrentPassword, req.NewPassword); err != nil { if appErr, ok := errors.AsAppError(err); ok { response.Error(c, appErr.Code, appErr.Message) } else { response.InternalError(c, err.Error()) } return } response.SuccessMsg(c, "密码修改成功") }