From f395324e8b4f1cdd5e4bd688a4863c50218a233e Mon Sep 17 00:00:00 2001 From: Fairy-Phy Date: Sat, 11 Nov 2023 02:41:38 +0900 Subject: [PATCH] add backend api remove all keys in scope --- .../backend/src/core/RegistryApiService.ts | 6 ++- .../backend/src/server/api/EndpointsModule.ts | 4 ++ packages/backend/src/server/api/endpoints.ts | 2 + .../i/registry/remove-all-keys-in-scope.ts | 39 +++++++++++++++++++ 4 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 packages/backend/src/server/api/endpoints/i/registry/remove-all-keys-in-scope.ts diff --git a/packages/backend/src/core/RegistryApiService.ts b/packages/backend/src/core/RegistryApiService.ts index d340c5e480..64016726ea 100644 --- a/packages/backend/src/core/RegistryApiService.ts +++ b/packages/backend/src/core/RegistryApiService.ts @@ -131,7 +131,7 @@ export class RegistryApiService { } @bindThis - public async remove(userId: MiUser['id'], domain: string | null, scope: string[], key: string) { + public async remove(userId: MiUser['id'], domain: string | null, scope: string[], key?: string) { const query = this.registryItemsRepository.createQueryBuilder().delete(); if (domain) { query.where('domain = :domain', { domain: domain }); @@ -139,7 +139,9 @@ export class RegistryApiService { query.where('domain IS NULL'); } query.andWhere('userId = :userId', { userId: userId }); - query.andWhere('key = :key', { key: key }); + if (key) { + query.andWhere('key = :key', { key: key }); + } query.andWhere('scope = :scope', { scope: scope }); await query.execute(); diff --git a/packages/backend/src/server/api/EndpointsModule.ts b/packages/backend/src/server/api/EndpointsModule.ts index 23067a9b26..13097317ff 100644 --- a/packages/backend/src/server/api/EndpointsModule.ts +++ b/packages/backend/src/server/api/EndpointsModule.ts @@ -230,6 +230,7 @@ import * as ep___i_registry_get from './endpoints/i/registry/get.js'; import * as ep___i_registry_keysWithType from './endpoints/i/registry/keys-with-type.js'; import * as ep___i_registry_keys from './endpoints/i/registry/keys.js'; import * as ep___i_registry_remove from './endpoints/i/registry/remove.js'; +import * as ep___i_registry_removeAllKeysInScope from './endpoints/i/registry/remove-all-keys-in-scope.js'; import * as ep___i_registry_scopesWithDomain from './endpoints/i/registry/scopes-with-domain.js'; import * as ep___i_registry_set from './endpoints/i/registry/set.js'; import * as ep___i_revokeToken from './endpoints/i/revoke-token.js'; @@ -588,6 +589,7 @@ const $i_registry_get: Provider = { provide: 'ep:i/registry/get', useClass: ep__ const $i_registry_keysWithType: Provider = { provide: 'ep:i/registry/keys-with-type', useClass: ep___i_registry_keysWithType.default }; const $i_registry_keys: Provider = { provide: 'ep:i/registry/keys', useClass: ep___i_registry_keys.default }; const $i_registry_remove: Provider = { provide: 'ep:i/registry/remove', useClass: ep___i_registry_remove.default }; +const $i_registry_removeAllKeysInScope: Provider = { provide: 'ep:i/registry/remove-all-keys-in-scope', useClass: ep___i_registry_removeAllKeysInScope.default }; const $i_registry_scopesWithDomain: Provider = { provide: 'ep:i/registry/scopes-with-domain', useClass: ep___i_registry_scopesWithDomain.default }; const $i_registry_set: Provider = { provide: 'ep:i/registry/set', useClass: ep___i_registry_set.default }; const $i_revokeToken: Provider = { provide: 'ep:i/revoke-token', useClass: ep___i_revokeToken.default }; @@ -950,6 +952,7 @@ const $retention: Provider = { provide: 'ep:retention', useClass: ep___retention $i_registry_keysWithType, $i_registry_keys, $i_registry_remove, + $i_registry_removeAllKeysInScope, $i_registry_scopesWithDomain, $i_registry_set, $i_revokeToken, @@ -1306,6 +1309,7 @@ const $retention: Provider = { provide: 'ep:retention', useClass: ep___retention $i_registry_keysWithType, $i_registry_keys, $i_registry_remove, + $i_registry_removeAllKeysInScope, $i_registry_scopesWithDomain, $i_registry_set, $i_revokeToken, diff --git a/packages/backend/src/server/api/endpoints.ts b/packages/backend/src/server/api/endpoints.ts index af798fd166..3301e0020d 100644 --- a/packages/backend/src/server/api/endpoints.ts +++ b/packages/backend/src/server/api/endpoints.ts @@ -230,6 +230,7 @@ import * as ep___i_registry_get from './endpoints/i/registry/get.js'; import * as ep___i_registry_keysWithType from './endpoints/i/registry/keys-with-type.js'; import * as ep___i_registry_keys from './endpoints/i/registry/keys.js'; import * as ep___i_registry_remove from './endpoints/i/registry/remove.js'; +import * as ep___i_registry_removeAllKeysInScope from './endpoints/i/registry/remove-all-keys-in-scope.js'; import * as ep___i_registry_scopesWithDomain from './endpoints/i/registry/scopes-with-domain.js'; import * as ep___i_registry_set from './endpoints/i/registry/set.js'; import * as ep___i_revokeToken from './endpoints/i/revoke-token.js'; @@ -586,6 +587,7 @@ const eps = [ ['i/registry/keys-with-type', ep___i_registry_keysWithType], ['i/registry/keys', ep___i_registry_keys], ['i/registry/remove', ep___i_registry_remove], + ['i/registry/remove-all-keys-in-scope', ep___i_registry_removeAllKeysInScope], ['i/registry/scopes-with-domain', ep___i_registry_scopesWithDomain], ['i/registry/set', ep___i_registry_set], ['i/revoke-token', ep___i_revokeToken], diff --git a/packages/backend/src/server/api/endpoints/i/registry/remove-all-keys-in-scope.ts b/packages/backend/src/server/api/endpoints/i/registry/remove-all-keys-in-scope.ts new file mode 100644 index 0000000000..59862bf659 --- /dev/null +++ b/packages/backend/src/server/api/endpoints/i/registry/remove-all-keys-in-scope.ts @@ -0,0 +1,39 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + +import { Inject, Injectable } from '@nestjs/common'; +import { Endpoint } from '@/server/api/endpoint-base.js'; +import type { RegistryItemsRepository } from '@/models/_.js'; +import { DI } from '@/di-symbols.js'; +import { RegistryApiService } from '@/core/RegistryApiService.js'; +import { ApiError } from '../../../error.js'; + +export const meta = { + requireCredential: true, + + errors: {}, +} as const; + +export const paramDef = { + type: 'object', + properties: { + scope: { type: 'array', default: [], items: { + type: 'string', pattern: /^[a-zA-Z0-9_]+$/.toString().slice(1, -1), + } }, + domain: { type: 'string', nullable: true }, + }, + required: ['scope'], +} as const; + +@Injectable() +export default class extends Endpoint { // eslint-disable-line import/no-default-export + constructor( + private registryApiService: RegistryApiService, + ) { + super(meta, paramDef, async (ps, me, accessToken) => { + await this.registryApiService.remove(me.id, accessToken != null ? accessToken.id : (ps.domain ?? null), ps.scope); + }); + } +}