You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
183 lines
4.8 KiB
183 lines
4.8 KiB
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"`
|
|
}
|
|
|