package useCases import ( "RenewCMS/internal/domain/apikey" "RenewCMS/internal/domain/audit" "RenewCMS/internal/domain/user" "context" "time" ) type RevokeAPIKeyUseCase struct { apiKeyRepository apikey.Repository userRepository user.Repository now func() time.Time recorder audit.Recorder } func NewRevokeAPIKeyUseCase(apiKeyRepository apikey.Repository, userRepository user.Repository, now func() time.Time, recorder audit.Recorder) *RevokeAPIKeyUseCase { return &RevokeAPIKeyUseCase{apiKeyRepository, userRepository, now, recorder} } func (r *RevokeAPIKeyUseCase) RevokeAPIKey(ctx context.Context, requesterId uint32, keyId uint32) error { key, err := r.apiKeyRepository.Get(keyId) if err != nil { return err } requester, err := r.userRepository.Get(requesterId) if err != nil { return err } if requester.Role != user.RoleOwner && key.UserID != requester.ID { return apikey.ErrAPIKeyNotFound } if key.RevokedAt != nil { return nil } if err := r.apiKeyRepository.Revoke(key.ID, r.now()); err != nil { return err } event := audit.NewEvent(audit.ActionAPIKeyRevoke, audit.CategoryAPIKeys) event.Target = audit.APIKeyTarget(key.ID, key.Name) r.recorder.Record(ctx, event) return nil }