summaryrefslogtreecommitdiff
path: root/packages/backend/src/server/api/endpoints/i
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2023-11-03 13:23:03 +0900
committerGitHub <noreply@github.com>2023-11-03 13:23:03 +0900
commit79346272f8792d35955efd3aaaa1e42e0cd2a6e3 (patch)
tree6f84fea79208862777db23aac434551494817595 /packages/backend/src/server/api/endpoints/i
parentCWを使用する場合、注釈を空にすることを許可しない (diff)
downloadsharkey-79346272f8792d35955efd3aaaa1e42e0cd2a6e3.tar.gz
sharkey-79346272f8792d35955efd3aaaa1e42e0cd2a6e3.tar.bz2
sharkey-79346272f8792d35955efd3aaaa1e42e0cd2a6e3.zip
feat: レジストリAPIをサードパーティから利用可能に (#12229)
* wip * wip * Update remove.ts * refactor
Diffstat (limited to 'packages/backend/src/server/api/endpoints/i')
-rw-r--r--packages/backend/src/server/api/endpoints/i/registry/get-all.ts20
-rw-r--r--packages/backend/src/server/api/endpoints/i/registry/get-detail.ts21
-rw-r--r--packages/backend/src/server/api/endpoints/i/registry/get.ts21
-rw-r--r--packages/backend/src/server/api/endpoints/i/registry/keys-with-type.ts34
-rw-r--r--packages/backend/src/server/api/endpoints/i/registry/keys.ts23
-rw-r--r--packages/backend/src/server/api/endpoints/i/registry/remove.ts25
-rw-r--r--packages/backend/src/server/api/endpoints/i/registry/scopes-with-domain.ts30
-rw-r--r--packages/backend/src/server/api/endpoints/i/registry/scopes.ts47
-rw-r--r--packages/backend/src/server/api/endpoints/i/registry/set.ts50
9 files changed, 79 insertions, 192 deletions
diff --git a/packages/backend/src/server/api/endpoints/i/registry/get-all.ts b/packages/backend/src/server/api/endpoints/i/registry/get-all.ts
index 211e6637dc..29fa0a29cc 100644
--- a/packages/backend/src/server/api/endpoints/i/registry/get-all.ts
+++ b/packages/backend/src/server/api/endpoints/i/registry/get-all.ts
@@ -5,13 +5,10 @@
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';
export const meta = {
requireCredential: true,
-
- secure: true,
} as const;
export const paramDef = {
@@ -20,23 +17,18 @@ export const paramDef = {
scope: { type: 'array', default: [], items: {
type: 'string', pattern: /^[a-zA-Z0-9_]+$/.toString().slice(1, -1),
} },
+ domain: { type: 'string', nullable: true },
},
- required: [],
+ required: ['scope'],
} as const;
@Injectable()
export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-disable-line import/no-default-export
constructor(
- @Inject(DI.registryItemsRepository)
- private registryItemsRepository: RegistryItemsRepository,
+ private registryApiService: RegistryApiService,
) {
- super(meta, paramDef, async (ps, me) => {
- const query = this.registryItemsRepository.createQueryBuilder('item')
- .where('item.domain IS NULL')
- .andWhere('item.userId = :userId', { userId: me.id })
- .andWhere('item.scope = :scope', { scope: ps.scope });
-
- const items = await query.getMany();
+ super(meta, paramDef, async (ps, me, accessToken) => {
+ const items = await this.registryApiService.getAllItemsOfScope(me.id, accessToken != null ? accessToken.id : (ps.domain ?? null), ps.scope);
const res = {} as Record<string, any>;
diff --git a/packages/backend/src/server/api/endpoints/i/registry/get-detail.ts b/packages/backend/src/server/api/endpoints/i/registry/get-detail.ts
index 9c6f2d6781..5b460b45d6 100644
--- a/packages/backend/src/server/api/endpoints/i/registry/get-detail.ts
+++ b/packages/backend/src/server/api/endpoints/i/registry/get-detail.ts
@@ -5,15 +5,12 @@
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,
- secure: true,
-
errors: {
noSuchKey: {
message: 'No such key.',
@@ -30,24 +27,18 @@ export const paramDef = {
scope: { type: 'array', default: [], items: {
type: 'string', pattern: /^[a-zA-Z0-9_]+$/.toString().slice(1, -1),
} },
+ domain: { type: 'string', nullable: true },
},
- required: ['key'],
+ required: ['key', 'scope'],
} as const;
@Injectable()
export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-disable-line import/no-default-export
constructor(
- @Inject(DI.registryItemsRepository)
- private registryItemsRepository: RegistryItemsRepository,
+ private registryApiService: RegistryApiService,
) {
- super(meta, paramDef, async (ps, me) => {
- const query = this.registryItemsRepository.createQueryBuilder('item')
- .where('item.domain IS NULL')
- .andWhere('item.userId = :userId', { userId: me.id })
- .andWhere('item.key = :key', { key: ps.key })
- .andWhere('item.scope = :scope', { scope: ps.scope });
-
- const item = await query.getOne();
+ super(meta, paramDef, async (ps, me, accessToken) => {
+ const item = await this.registryApiService.getItem(me.id, accessToken != null ? accessToken.id : (ps.domain ?? null), ps.scope, ps.key);
if (item == null) {
throw new ApiError(meta.errors.noSuchKey);
diff --git a/packages/backend/src/server/api/endpoints/i/registry/get.ts b/packages/backend/src/server/api/endpoints/i/registry/get.ts
index 729e729b8c..e8c28298ef 100644
--- a/packages/backend/src/server/api/endpoints/i/registry/get.ts
+++ b/packages/backend/src/server/api/endpoints/i/registry/get.ts
@@ -5,15 +5,12 @@
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,
- secure: true,
-
errors: {
noSuchKey: {
message: 'No such key.',
@@ -30,24 +27,18 @@ export const paramDef = {
scope: { type: 'array', default: [], items: {
type: 'string', pattern: /^[a-zA-Z0-9_]+$/.toString().slice(1, -1),
} },
+ domain: { type: 'string', nullable: true },
},
- required: ['key'],
+ required: ['key', 'scope'],
} as const;
@Injectable()
export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-disable-line import/no-default-export
constructor(
- @Inject(DI.registryItemsRepository)
- private registryItemsRepository: RegistryItemsRepository,
+ private registryApiService: RegistryApiService,
) {
- super(meta, paramDef, async (ps, me) => {
- const query = this.registryItemsRepository.createQueryBuilder('item')
- .where('item.domain IS NULL')
- .andWhere('item.userId = :userId', { userId: me.id })
- .andWhere('item.key = :key', { key: ps.key })
- .andWhere('item.scope = :scope', { scope: ps.scope });
-
- const item = await query.getOne();
+ super(meta, paramDef, async (ps, me, accessToken) => {
+ const item = await this.registryApiService.getItem(me.id, accessToken != null ? accessToken.id : (ps.domain ?? null), ps.scope, ps.key);
if (item == null) {
throw new ApiError(meta.errors.noSuchKey);
diff --git a/packages/backend/src/server/api/endpoints/i/registry/keys-with-type.ts b/packages/backend/src/server/api/endpoints/i/registry/keys-with-type.ts
index ffd2860fde..8953ee5d3d 100644
--- a/packages/backend/src/server/api/endpoints/i/registry/keys-with-type.ts
+++ b/packages/backend/src/server/api/endpoints/i/registry/keys-with-type.ts
@@ -5,13 +5,10 @@
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';
export const meta = {
requireCredential: true,
-
- secure: true,
} as const;
export const paramDef = {
@@ -20,36 +17,31 @@ export const paramDef = {
scope: { type: 'array', default: [], items: {
type: 'string', pattern: /^[a-zA-Z0-9_]+$/.toString().slice(1, -1),
} },
+ domain: { type: 'string', nullable: true },
},
- required: [],
+ required: ['scope'],
} as const;
@Injectable()
export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-disable-line import/no-default-export
constructor(
- @Inject(DI.registryItemsRepository)
- private registryItemsRepository: RegistryItemsRepository,
+ private registryApiService: RegistryApiService,
) {
- super(meta, paramDef, async (ps, me) => {
- const query = this.registryItemsRepository.createQueryBuilder('item')
- .where('item.domain IS NULL')
- .andWhere('item.userId = :userId', { userId: me.id })
- .andWhere('item.scope = :scope', { scope: ps.scope });
-
- const items = await query.getMany();
+ super(meta, paramDef, async (ps, me, accessToken) => {
+ const items = await this.registryApiService.getAllItemsOfScope(me.id, accessToken != null ? accessToken.id : (ps.domain ?? null), ps.scope);
const res = {} as Record<string, string>;
for (const item of items) {
const type = typeof item.value;
res[item.key] =
- item.value === null ? 'null' :
- Array.isArray(item.value) ? 'array' :
- type === 'number' ? 'number' :
- type === 'string' ? 'string' :
- type === 'boolean' ? 'boolean' :
- type === 'object' ? 'object' :
- null as never;
+ item.value === null ? 'null' :
+ Array.isArray(item.value) ? 'array' :
+ type === 'number' ? 'number' :
+ type === 'string' ? 'string' :
+ type === 'boolean' ? 'boolean' :
+ type === 'object' ? 'object' :
+ null as never;
}
return res;
diff --git a/packages/backend/src/server/api/endpoints/i/registry/keys.ts b/packages/backend/src/server/api/endpoints/i/registry/keys.ts
index 7239bb66e1..04e120d752 100644
--- a/packages/backend/src/server/api/endpoints/i/registry/keys.ts
+++ b/packages/backend/src/server/api/endpoints/i/registry/keys.ts
@@ -5,13 +5,10 @@
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';
export const meta = {
requireCredential: true,
-
- secure: true,
} as const;
export const paramDef = {
@@ -20,26 +17,18 @@ export const paramDef = {
scope: { type: 'array', default: [], items: {
type: 'string', pattern: /^[a-zA-Z0-9_]+$/.toString().slice(1, -1),
} },
+ domain: { type: 'string', nullable: true },
},
- required: [],
+ required: ['scope'],
} as const;
@Injectable()
export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-disable-line import/no-default-export
constructor(
- @Inject(DI.registryItemsRepository)
- private registryItemsRepository: RegistryItemsRepository,
+ private registryApiService: RegistryApiService,
) {
- super(meta, paramDef, async (ps, me) => {
- const query = this.registryItemsRepository.createQueryBuilder('item')
- .select('item.key')
- .where('item.domain IS NULL')
- .andWhere('item.userId = :userId', { userId: me.id })
- .andWhere('item.scope = :scope', { scope: ps.scope });
-
- const items = await query.getMany();
-
- return items.map(x => x.key);
+ super(meta, paramDef, async (ps, me, accessToken) => {
+ return await this.registryApiService.getAllKeysOfScope(me.id, accessToken != null ? accessToken.id : (ps.domain ?? null), ps.scope);
});
}
}
diff --git a/packages/backend/src/server/api/endpoints/i/registry/remove.ts b/packages/backend/src/server/api/endpoints/i/registry/remove.ts
index ae687fefe9..ba8100b547 100644
--- a/packages/backend/src/server/api/endpoints/i/registry/remove.ts
+++ b/packages/backend/src/server/api/endpoints/i/registry/remove.ts
@@ -7,13 +7,12 @@ 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,
- secure: true,
-
errors: {
noSuchKey: {
message: 'No such key.',
@@ -30,30 +29,18 @@ export const paramDef = {
scope: { type: 'array', default: [], items: {
type: 'string', pattern: /^[a-zA-Z0-9_]+$/.toString().slice(1, -1),
} },
+ domain: { type: 'string', nullable: true },
},
- required: ['key'],
+ required: ['key', 'scope'],
} as const;
@Injectable()
export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-disable-line import/no-default-export
constructor(
- @Inject(DI.registryItemsRepository)
- private registryItemsRepository: RegistryItemsRepository,
+ private registryApiService: RegistryApiService,
) {
- super(meta, paramDef, async (ps, me) => {
- const query = this.registryItemsRepository.createQueryBuilder('item')
- .where('item.domain IS NULL')
- .andWhere('item.userId = :userId', { userId: me.id })
- .andWhere('item.key = :key', { key: ps.key })
- .andWhere('item.scope = :scope', { scope: ps.scope });
-
- const item = await query.getOne();
-
- if (item == null) {
- throw new ApiError(meta.errors.noSuchKey);
- }
-
- await this.registryItemsRepository.remove(item);
+ super(meta, paramDef, async (ps, me, accessToken) => {
+ await this.registryApiService.remove(me.id, accessToken != null ? accessToken.id : (ps.domain ?? null), ps.scope, ps.key);
});
}
}
diff --git a/packages/backend/src/server/api/endpoints/i/registry/scopes-with-domain.ts b/packages/backend/src/server/api/endpoints/i/registry/scopes-with-domain.ts
new file mode 100644
index 0000000000..1ff994b82c
--- /dev/null
+++ b/packages/backend/src/server/api/endpoints/i/registry/scopes-with-domain.ts
@@ -0,0 +1,30 @@
+/*
+ * 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 { RegistryApiService } from '@/core/RegistryApiService.js';
+
+export const meta = {
+ requireCredential: true,
+ secure: true,
+} as const;
+
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
+@Injectable()
+export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-disable-line import/no-default-export
+ constructor(
+ private registryApiService: RegistryApiService,
+ ) {
+ super(meta, paramDef, async (ps, me) => {
+ return await this.registryApiService.getAllScopeAndDomains(me.id);
+ });
+ }
+}
diff --git a/packages/backend/src/server/api/endpoints/i/registry/scopes.ts b/packages/backend/src/server/api/endpoints/i/registry/scopes.ts
deleted file mode 100644
index 7637cdcf73..0000000000
--- a/packages/backend/src/server/api/endpoints/i/registry/scopes.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * 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';
-
-export const meta = {
- requireCredential: true,
-
- secure: true,
-} as const;
-
-export const paramDef = {
- type: 'object',
- properties: {},
- required: [],
-} as const;
-
-@Injectable()
-export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-disable-line import/no-default-export
- constructor(
- @Inject(DI.registryItemsRepository)
- private registryItemsRepository: RegistryItemsRepository,
- ) {
- super(meta, paramDef, async (ps, me) => {
- const query = this.registryItemsRepository.createQueryBuilder('item')
- .select('item.scope')
- .where('item.domain IS NULL')
- .andWhere('item.userId = :userId', { userId: me.id });
-
- const items = await query.getMany();
-
- const res = [] as string[][];
-
- for (const item of items) {
- if (res.some(scope => scope.join('.') === item.scope.join('.'))) continue;
- res.push(item.scope);
- }
-
- return res;
- });
- }
-}
diff --git a/packages/backend/src/server/api/endpoints/i/registry/set.ts b/packages/backend/src/server/api/endpoints/i/registry/set.ts
index 6203e7aa8b..58bb450bce 100644
--- a/packages/backend/src/server/api/endpoints/i/registry/set.ts
+++ b/packages/backend/src/server/api/endpoints/i/registry/set.ts
@@ -5,15 +5,10 @@
import { Inject, Injectable } from '@nestjs/common';
import { Endpoint } from '@/server/api/endpoint-base.js';
-import type { RegistryItemsRepository } from '@/models/_.js';
-import { IdService } from '@/core/IdService.js';
-import { GlobalEventService } from '@/core/GlobalEventService.js';
-import { DI } from '@/di-symbols.js';
+import { RegistryApiService } from '@/core/RegistryApiService.js';
export const meta = {
requireCredential: true,
-
- secure: true,
} as const;
export const paramDef = {
@@ -24,51 +19,18 @@ export const paramDef = {
scope: { type: 'array', default: [], items: {
type: 'string', pattern: /^[a-zA-Z0-9_]+$/.toString().slice(1, -1),
} },
+ domain: { type: 'string', nullable: true },
},
- required: ['key', 'value'],
+ required: ['key', 'value', 'scope'],
} as const;
@Injectable()
export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-disable-line import/no-default-export
constructor(
- @Inject(DI.registryItemsRepository)
- private registryItemsRepository: RegistryItemsRepository,
-
- private idService: IdService,
- private globalEventService: GlobalEventService,
+ private registryApiService: RegistryApiService,
) {
- super(meta, paramDef, async (ps, me) => {
- const query = this.registryItemsRepository.createQueryBuilder('item')
- .where('item.domain IS NULL')
- .andWhere('item.userId = :userId', { userId: me.id })
- .andWhere('item.key = :key', { key: ps.key })
- .andWhere('item.scope = :scope', { scope: ps.scope });
-
- const existingItem = await query.getOne();
-
- if (existingItem) {
- await this.registryItemsRepository.update(existingItem.id, {
- updatedAt: new Date(),
- value: ps.value,
- });
- } else {
- await this.registryItemsRepository.insert({
- id: this.idService.gen(),
- updatedAt: new Date(),
- userId: me.id,
- domain: null,
- scope: ps.scope,
- key: ps.key,
- value: ps.value,
- });
- }
-
- // TODO: サードパーティアプリが傍受出来てしまうのでどうにかする
- this.globalEventService.publishMainStream(me.id, 'registryUpdated', {
- scope: ps.scope,
- key: ps.key,
- value: ps.value,
- });
+ super(meta, paramDef, async (ps, me, accessToken) => {
+ await this.registryApiService.set(me.id, accessToken ? accessToken.id : (ps.domain ?? null), ps.scope, ps.key, ps.value);
});
}
}