This commit is contained in:
toom1996
2026-09-07 00:01:48 +08:00
parent b049104a0b
commit 74ba700598
31 changed files with 1113 additions and 606 deletions

View File

@ -5,6 +5,7 @@ import (
"crypto/rand"
"crypto/sha256"
"encoding/hex"
"errors"
"time"
"fashionapi/internal/dto"
@ -31,6 +32,10 @@ type AuthService interface {
Logout(ctx context.Context, refreshToken string) error
// RevokeAllByRefresh 根据 refresh token 找到所属用户,吊销其全部 refresh(踢下线)。
RevokeAllByRefresh(ctx context.Context, refreshToken string) (int64, error)
// ListUsers 列出全量用户(后台管理提级 VIP 用)。
ListUsers(ctx context.Context) ([]dto.UserPayload, error)
// SetTier 设置用户等级(free/vip),供后台把某账号提级为 VIP。
SetTier(ctx context.Context, id uint32, tier string) error
}
type authService struct {
@ -86,7 +91,7 @@ func (s *authService) Login(ctx context.Context, account, password string) (stri
if _, err := s.refresh.RevokeAllByUser(ctx, user.ID); err != nil {
return "", "", 0, nil, internalErr("revoke stale sessions: " + err.Error())
}
access, err := s.jwt.Generate(user.ID, user.Username, user.Email)
access, err := s.jwt.Generate(user.ID, user.Username, user.Email, user.Tier)
if err != nil {
return "", "", 0, nil, err
}
@ -111,7 +116,7 @@ func (s *authService) Refresh(ctx context.Context, refreshToken string) (string,
if err != nil {
return "", 0, unauthorized("invalid refresh token")
}
access, err := s.jwt.Generate(user.ID, user.Username, user.Email)
access, err := s.jwt.Generate(user.ID, user.Username, user.Email, user.Tier)
if err != nil {
return "", 0, err
}
@ -198,5 +203,29 @@ func hashToken(raw string) string {
}
func toUserPayload(u model.User) dto.UserPayload {
return dto.UserPayload{ID: u.ID, Username: u.Username, Email: u.Email}
return dto.UserPayload{ID: u.ID, Username: u.Username, Email: u.Email, Tier: u.Tier}
}
// ListUsers 列出全量用户(后台管理提级 VIP 用)。
func (s *authService) ListUsers(ctx context.Context) ([]dto.UserPayload, error) {
users, err := s.users.List(ctx)
if err != nil {
return nil, internalErr(err.Error())
}
out := make([]dto.UserPayload, 0, len(users))
for _, u := range users {
out = append(out, toUserPayload(u))
}
return out, nil
}
// SetTier 设置用户等级(free/vip),供后台把某账号提级为 VIP。
func (s *authService) SetTier(ctx context.Context, id uint32, tier string) error {
if tier != "free" && tier != "vip" {
return errors.New("tier must be free or vip")
}
if err := s.users.SetTier(ctx, id, tier); err != nil {
return internalErr(err.Error())
}
return nil
}