package handler import ( "photowall/internal/middleware" "photowall/internal/service" "photowall/pkg/captcha" "photowall/pkg/response" "github.com/gin-gonic/gin" ) type AuthHandler struct { auth *service.AuthService } func NewAuthHandler(auth *service.AuthService) *AuthHandler { return &AuthHandler{auth: auth} } // Captcha GET /api/captcha 获取图形验证码 func (h *AuthHandler) Captcha(c *gin.Context) { id, img := captcha.Generate() response.OK(c, gin.H{ "captcha_id": id, "image": img, }) } // Register POST /api/auth/register func (h *AuthHandler) Register(c *gin.Context) { var req service.RegisterReq if err := c.ShouldBindJSON(&req); err != nil { response.BadRequest(c, "参数错误:"+err.Error()) return } user, err := h.auth.Register(&req) if err != nil { response.BadRequest(c, err.Error()) return } response.Created(c, user) } // Login POST /api/auth/login func (h *AuthHandler) Login(c *gin.Context) { var req service.LoginReq if err := c.ShouldBindJSON(&req); err != nil { response.BadRequest(c, "参数错误:"+err.Error()) return } resp, err := h.auth.Login(&req) if err != nil { response.Unauthorized(c, err.Error()) return } response.OK(c, resp) } // Me GET /api/auth/me func (h *AuthHandler) Me(c *gin.Context) { userID := middleware.CurrentUserID(c) username := middleware.CurrentUsername(c) role := middleware.CurrentRole(c) response.OK(c, gin.H{ "user_id": userID, "username": username, "role": role, }) } // ForgotPassword POST /api/auth/forgot-password 忘记密码(生成重置码) func (h *AuthHandler) ForgotPassword(c *gin.Context) { var req service.ForgotPasswordReq if err := c.ShouldBindJSON(&req); err != nil { response.BadRequest(c, "参数错误:"+err.Error()) return } code, err := h.auth.ForgotPassword(&req) if err != nil { response.BadRequest(c, err.Error()) return } // 开发阶段返回重置码(生产环境应通过邮件发送,不返回) response.OK(c, gin.H{ "message": "重置码已生成,有效期30分钟", "reset_code": code, "note": "开发阶段直接返回,生产环境将通过邮箱发送", }) } // ResetPassword POST /api/auth/reset-password 重置密码 func (h *AuthHandler) ResetPassword(c *gin.Context) { var req service.ResetPasswordReq if err := c.ShouldBindJSON(&req); err != nil { response.BadRequest(c, "参数错误:"+err.Error()) return } if err := h.auth.ResetPassword(&req); err != nil { response.BadRequest(c, err.Error()) return } response.OK(c, gin.H{"message": "密码重置成功,请使用新密码登录"}) } // SendSms POST /api/auth/send-sms 发送短信验证码 func (h *AuthHandler) SendSms(c *gin.Context) { var req service.SendSmsReq if err := c.ShouldBindJSON(&req); err != nil { response.BadRequest(c, "参数错误:"+err.Error()) return } code, err := h.auth.SendSmsCode(&req) if err != nil { response.BadRequest(c, err.Error()) return } response.OK(c, gin.H{ "message": "验证码已发送,有效期5分钟", "code": code, // 开发阶段返回,生产环境不返回 "note": "短信参数未配置时为开发模式,直接返回验证码", }) } // WechatLogin POST /api/auth/wechat-login 微信扫码登录 func (h *AuthHandler) WechatLogin(c *gin.Context) { var req service.WechatLoginReq if err := c.ShouldBindJSON(&req); err != nil { response.BadRequest(c, "参数错误:"+err.Error()) return } resp, err := h.auth.WechatLogin(&req) if err != nil { response.BadRequest(c, err.Error()) return } response.OK(c, resp) } // WechatQrcode GET /api/auth/wechat-qrcode 获取微信扫码登录二维码(预留) func (h *AuthHandler) WechatQrcode(c *gin.Context) { // TODO: 接入微信开放平台后生成真实扫码二维码 response.OK(c, gin.H{ "message": "微信扫码登录功能开发中,请配置微信开放平台参数后使用", "qrcode": "", }) }