package logic import ( "context" "healthapi/internal/model" "healthapi/internal/svc" "healthapi/internal/types" "healthapi/pkg/errorx" "healthapi/pkg/jwt" "github.com/zeromicro/go-zero/core/logx" ) type RefreshTokenLogic struct { logx.Logger ctx context.Context svcCtx *svc.ServiceContext } func NewRefreshTokenLogic(ctx context.Context, svcCtx *svc.ServiceContext) *RefreshTokenLogic { return &RefreshTokenLogic{ Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx, } } func (l *RefreshTokenLogic) RefreshToken(req *types.RefreshTokenReq) (resp *types.LoginResp, err error) { // 解析旧 Token 获取用户ID claims, err := jwt.ParseToken(req.Token, l.svcCtx.Config.Auth.AccessSecret) if err != nil { return nil, errorx.ErrInvalidToken } // 查询用户信息 var user model.User if err := l.svcCtx.DB.First(&user, claims.UserID).Error; err != nil { return nil, errorx.ErrUserNotFound } // 生成新 Token token, expiresAt, err := jwt.GenerateToken( user.ID, l.svcCtx.Config.Auth.AccessSecret, l.svcCtx.Config.Auth.AccessExpire, ) if err != nil { l.Errorf("Failed to generate token: %v", err) return nil, errorx.NewCodeError(errorx.CodeServerError, "生成Token失败") } return &types.LoginResp{ Token: token, ExpiresAt: expiresAt, User: types.UserInfo{ ID: uint(user.ID), Phone: user.Phone, Email: user.Email, Nickname: user.Nickname, Avatar: user.Avatar, SurveyCompleted: user.SurveyCompleted, }, }, nil }