update
This commit is contained in:
@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user