55 lines
1.4 KiB
Go
55 lines
1.4 KiB
Go
package system
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"time"
|
|
)
|
|
|
|
type APIToken struct {
|
|
ID uint
|
|
CreatedAt time.Time
|
|
UpdatedAt time.Time
|
|
UserID uint
|
|
AuthorityID uint
|
|
Token string
|
|
Status bool
|
|
ExpiresAt time.Time
|
|
Remark string
|
|
User *User
|
|
}
|
|
|
|
type APITokenRepo interface {
|
|
UserHasAuthority(context.Context, uint, uint) (*User, bool, error)
|
|
CreateAPIToken(context.Context, *APIToken) error
|
|
ListAPITokens(context.Context, int, int, uint, *bool) ([]*APIToken, int64, error)
|
|
DisableAndBlacklistAPIToken(context.Context, uint) error
|
|
BlacklistToken(context.Context, string) error
|
|
IsTokenDisabled(context.Context, string) (bool, error)
|
|
}
|
|
|
|
type TokenUsecase struct{ APITokenRepo }
|
|
|
|
func NewTokenUsecase(repo APITokenRepo) *TokenUsecase {
|
|
return &TokenUsecase{APITokenRepo: repo}
|
|
}
|
|
|
|
func (uc *TokenUsecase) PrepareAPIToken(ctx context.Context, userID, authorityID uint, days int) (*User, time.Duration, error) {
|
|
user, allowed, err := uc.UserHasAuthority(ctx, userID, authorityID)
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
if !allowed {
|
|
return nil, 0, errors.New("用户不具备该角色权限")
|
|
}
|
|
duration := time.Duration(days) * 24 * time.Hour
|
|
if days == -1 {
|
|
duration = 100 * 365 * 24 * time.Hour
|
|
}
|
|
return user, duration, nil
|
|
}
|
|
|
|
func (uc *TokenUsecase) DisableToken(ctx context.Context, id uint) error {
|
|
return uc.APITokenRepo.DisableAndBlacklistAPIToken(ctx, id)
|
|
}
|