package handler import ( "affiliate_dash/internal/middleware" "affiliate_dash/internal/pkg/response" "affiliate_dash/internal/service" "github.com/gin-gonic/gin" ) type AuthHandler struct { svc *service.AuthService } func NewAuthHandler(svc *service.AuthService) *AuthHandler { return &AuthHandler{svc: svc} } type loginReq struct { Username string `json:"username" binding:"required"` Password string `json:"password" binding:"required"` } func (h *AuthHandler) Login(c *gin.Context) { var req loginReq if err := c.ShouldBindJSON(&req); err != nil { response.BadRequest(c, "请输入用户名和密码") return } result, err := h.svc.Login(req.Username, req.Password) if err != nil { writeServiceError(c, err, "用户名或密码错误") return } response.OK(c, result) } type sendSMSCodeReq struct { Username string `json:"username" binding:"required"` Password string `json:"password" binding:"required"` } func (h *AuthHandler) SendLoginSMSCode(c *gin.Context) { var req sendSMSCodeReq if err := c.ShouldBindJSON(&req); err != nil { response.BadRequest(c, "请输入用户名和密码") return } result, err := h.svc.SendLoginSMSCode(req.Username, req.Password, c.ClientIP()) if err != nil { writeServiceError(c, err, "验证码发送失败") return } response.OK(c, result) } type prepareLoginReq struct { Username string `json:"username" binding:"required"` Password string `json:"password" binding:"required"` SMSCode string `json:"smsCode" binding:"required"` APIBase string `json:"apiBase"` } func (h *AuthHandler) PrepareLogin(c *gin.Context) { var req prepareLoginReq if err := c.ShouldBindJSON(&req); err != nil { response.BadRequest(c, "请填写用户名、密码和短信验证码") return } apiBase := req.APIBase if apiBase == "" { apiBase = c.GetHeader("Origin") } prepared, err := h.svc.PrepareLogin(req.Username, req.Password, req.SMSCode, apiBase) if err != nil { writeServiceError(c, err, "安全登录准备失败") return } response.OK(c, prepared) } type completeLoginReq struct { ChallengeID string `json:"challengeId" binding:"required"` PollToken string `json:"pollToken" binding:"required"` DeviceTicket string `json:"deviceTicket" binding:"required"` } func (h *AuthHandler) CompleteLogin(c *gin.Context) { var req completeLoginReq if err := c.ShouldBindJSON(&req); err != nil { response.BadRequest(c, "缺少设备认证票据") return } result, err := h.svc.CompleteLogin(req.ChallengeID, req.PollToken, req.DeviceTicket) if err != nil { writeServiceError(c, err, "安全登录失败") return } response.OK(c, result) } // writeServiceError 保留 AuthError 的 HTTP 状态码;其他错误统一 400。 func writeServiceError(c *gin.Context, err error, fallback string) { if authErr, ok := service.AsAuthError(err); ok { response.Fail(c, authErr.Status, authErr.Status, authErr.Message) return } response.BadRequest(c, err.Error()) } func (h *AuthHandler) Profile(c *gin.Context) { user, err := h.svc.GetProfile(middleware.GetUserID(c)) if err != nil { response.NotFound(c, "用户不存在") return } response.OK(c, user) } type changePasswordReq struct { CurrentPassword string `json:"current_password" binding:"required"` NewPassword string `json:"new_password" binding:"required,min=8"` } type updateCurrentAccountReq struct { CurrentPassword string `json:"current_password" binding:"required"` Username string `json:"username" binding:"required"` Nickname string `json:"nickname"` NewPassword string `json:"new_password" binding:"omitempty,min=8"` } func (h *AuthHandler) ChangePassword(c *gin.Context) { var req changePasswordReq if err := c.ShouldBindJSON(&req); err != nil { response.BadRequest(c, "请填写当前密码和至少 8 位的新密码") return } if err := h.svc.ChangePassword(middleware.GetUserID(c), req.CurrentPassword, req.NewPassword); err != nil { response.BadRequest(c, err.Error()) return } response.OK(c, nil) } func (h *AuthHandler) UpdateCurrentAccount(c *gin.Context) { var req updateCurrentAccountReq if err := c.ShouldBindJSON(&req); err != nil { response.BadRequest(c, "请填写用户名和当前密码;新密码至少 8 位") return } user, err := h.svc.UpdateCurrentAccount(middleware.GetUserID(c), service.UpdateCurrentAccountInput{ CurrentPassword: req.CurrentPassword, Username: req.Username, Nickname: req.Nickname, NewPassword: req.NewPassword, }) if err != nil { response.BadRequest(c, err.Error()) return } response.OK(c, user) }