kra-new/internal/biz/system/api_token.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)
}