package service import ( "context" "time" "kra/internal/biz" "kra/pkg/adminauth" ) func tokenDTO(v *biz.APIToken) map[string]any { var user any = nil if v.User != nil { user = convertUser(v.User) } return map[string]any{"ID": v.ID, "CreatedAt": v.CreatedAt, "UpdatedAt": v.UpdatedAt, "DeletedAt": nil, "userId": v.UserID, "authorityId": v.AuthorityID, "token": v.Token, "status": v.Status, "expiresAt": v.ExpiresAt, "remark": v.Remark, "user": user} } func (s *SettingsService) CreateAPIToken(ctx context.Context, userID, authorityID uint, days int, remark string) (string, error) { user, duration, err := s.uc.PrepareAPIToken(ctx, userID, authorityID, days) if err != nil { return "", err } secret, issuer := "", "kra" buffer := 24 * time.Hour config := s.runtime.Admin() if config != nil && config.Jwt != nil { secret = config.Jwt.SigningKey if config.Jwt.Issuer != "" { issuer = config.Jwt.Issuer } if config.Jwt.BufferTime != nil { buffer = config.Jwt.BufferTime.AsDuration() } } token, _, err := adminauth.Generate(secret, issuer, duration, buffer, user.ID, authorityID, user.UUID, user.Username, user.NickName, false) if err != nil { return "", err } record := &biz.APIToken{UserID: userID, AuthorityID: authorityID, Token: token, Status: true, ExpiresAt: time.Now().Add(duration), Remark: remark} if err = s.uc.CreateAPIToken(ctx, record); err != nil { return "", err } return token, nil } func (s *SettingsService) APITokens(ctx context.Context, page, size int, userID uint, status *bool) ([]map[string]any, int64, error) { items, total, err := s.uc.ListAPITokens(ctx, page, size, userID, status) if err != nil { return nil, 0, err } out := make([]map[string]any, 0, len(items)) for _, v := range items { out = append(out, tokenDTO(v)) } return out, total, nil } func (s *SettingsService) DisableAPIToken(ctx context.Context, id uint) error { return s.uc.DisableToken(ctx, id) } func (s *SettingsService) BlacklistToken(ctx context.Context, token string) error { return s.uc.BlacklistToken(ctx, token) } func (s *SettingsService) IsTokenDisabled(ctx context.Context, token string) (bool, error) { return s.uc.IsTokenDisabled(ctx, token) }