package handler import ( "health-ai/internal/api/middleware" "health-ai/internal/service" "health-ai/pkg/response" "github.com/gin-gonic/gin" ) type AuthHandler struct { authService *service.AuthService } func NewAuthHandler() *AuthHandler { return &AuthHandler{ authService: service.NewAuthService(), } } // SendCodeRequest 发送验证码请求 type SendCodeRequest struct { Phone string `json:"phone" binding:"required"` Type string `json:"type" binding:"required,oneof=register login reset"` // register, login, reset } // SendCode 发送验证码 // @Summary 发送手机验证码 // @Tags 认证 // @Accept json // @Produce json // @Param request body SendCodeRequest true "手机号和验证码类型" // @Success 200 {object} response.Response // @Router /api/auth/send-code [post] func (h *AuthHandler) SendCode(c *gin.Context) { var req SendCodeRequest if err := c.ShouldBindJSON(&req); err != nil { response.BadRequest(c, "参数错误: "+err.Error()) return } // 验证手机号格式 if len(req.Phone) != 11 { response.BadRequest(c, "手机号格式不正确") return } // TODO: 实际项目中应该: // 1. 生成6位随机验证码 // 2. 存储到Redis(设置5分钟过期) // 3. 调用短信服务发送验证码 // 4. 限制发送频率(如60秒一次) // 当前为演示版本,返回模拟成功 response.SuccessWithMessage(c, "验证码已发送", gin.H{ "phone": req.Phone[:3] + "****" + req.Phone[7:], "expires_in": 300, // 5分钟有效 // 演示环境下返回固定验证码,正式环境请删除 "demo_code": "123456", }) } // Register 用户注册 // @Summary 用户注册 // @Tags 认证 // @Accept json // @Produce json // @Param request body service.RegisterRequest true "注册信息" // @Success 200 {object} response.Response{data=service.AuthResponse} // @Router /api/auth/register [post] func (h *AuthHandler) Register(c *gin.Context) { var req service.RegisterRequest if err := c.ShouldBindJSON(&req); err != nil { response.BadRequest(c, "参数错误: "+err.Error()) return } result, err := h.authService.Register(&req) if err != nil { response.Error(c, 400, err.Error()) return } response.Success(c, result) } // Login 用户登录 // @Summary 用户登录 // @Tags 认证 // @Accept json // @Produce json // @Param request body service.LoginRequest true "登录信息" // @Success 200 {object} response.Response{data=service.AuthResponse} // @Router /api/auth/login [post] func (h *AuthHandler) Login(c *gin.Context) { var req service.LoginRequest if err := c.ShouldBindJSON(&req); err != nil { response.BadRequest(c, "参数错误: "+err.Error()) return } result, err := h.authService.Login(&req) if err != nil { response.Error(c, 400, err.Error()) return } response.Success(c, result) } // RefreshToken 刷新Token // @Summary 刷新Token // @Tags 认证 // @Accept json // @Produce json // @Param Authorization header string true "Bearer Token" // @Success 200 {object} response.Response{data=map[string]string} // @Router /api/auth/refresh [post] func (h *AuthHandler) RefreshToken(c *gin.Context) { // 从header获取旧token oldToken := c.GetHeader("Authorization") if len(oldToken) > 7 { oldToken = oldToken[7:] // 去掉 "Bearer " } newToken, err := h.authService.RefreshToken(oldToken) if err != nil { response.Unauthorized(c, "Token刷新失败") return } response.Success(c, gin.H{"token": newToken}) } // GetUserInfo 获取当前用户信息 // @Summary 获取当前用户信息 // @Tags 用户 // @Accept json // @Produce json // @Param Authorization header string true "Bearer Token" // @Success 200 {object} response.Response{data=service.UserInfoResponse} // @Router /api/user/profile [get] func (h *AuthHandler) GetUserInfo(c *gin.Context) { userID := middleware.GetUserID(c) result, err := h.authService.GetUserInfo(userID) if err != nil { response.Error(c, 400, err.Error()) return } response.Success(c, result) } // UpdateProfile 更新用户资料 // @Summary 更新用户资料 // @Tags 用户 // @Accept json // @Produce json // @Param Authorization header string true "Bearer Token" // @Param request body UpdateProfileRequest true "更新信息" // @Success 200 {object} response.Response // @Router /api/user/profile [put] func (h *AuthHandler) UpdateProfile(c *gin.Context) { userID := middleware.GetUserID(c) var req UpdateProfileRequest if err := c.ShouldBindJSON(&req); err != nil { response.BadRequest(c, "参数错误: "+err.Error()) return } if err := h.authService.UpdateProfile(userID, req.Nickname, req.Avatar); err != nil { response.Error(c, 400, err.Error()) return } response.SuccessWithMessage(c, "更新成功", nil) } // UpdateProfileRequest 更新资料请求 type UpdateProfileRequest struct { Nickname string `json:"nickname"` Avatar string `json:"avatar"` }