summaryrefslogtreecommitdiff
path: root/packages/backend/src/server/api/endpoints/i
diff options
context:
space:
mode:
authorMarie <Marie@kaifa.ch>2023-12-23 02:09:23 +0100
committerMarie <Marie@kaifa.ch>2023-12-23 02:09:23 +0100
commit5db583a3eb61d50de14d875ebf7ecef20490e313 (patch)
tree783dd43d2ac660c32e745a4485d499e9ddc43324 /packages/backend/src/server/api/endpoints/i
parentadd: Custom MOTDs (diff)
parentUpdate CHANGELOG.md (diff)
downloadsharkey-5db583a3eb61d50de14d875ebf7ecef20490e313.tar.gz
sharkey-5db583a3eb61d50de14d875ebf7ecef20490e313.tar.bz2
sharkey-5db583a3eb61d50de14d875ebf7ecef20490e313.zip
merge: upstream
Diffstat (limited to 'packages/backend/src/server/api/endpoints/i')
-rw-r--r--packages/backend/src/server/api/endpoints/i/2fa/key-done.ts10
-rw-r--r--packages/backend/src/server/api/endpoints/i/2fa/register-key.ts134
-rw-r--r--packages/backend/src/server/api/endpoints/i/2fa/register.ts13
-rw-r--r--packages/backend/src/server/api/endpoints/i/apps.ts33
-rw-r--r--packages/backend/src/server/api/endpoints/i/authorized-apps.ts30
-rw-r--r--packages/backend/src/server/api/endpoints/i/move.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/i/registry/get-all.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/i/registry/get-detail.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/i/registry/get.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/i/registry/keys-with-type.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/i/registry/scopes-with-domain.ts22
-rw-r--r--packages/backend/src/server/api/endpoints/i/signin-history.ts11
-rw-r--r--packages/backend/src/server/api/endpoints/i/update-email.ts5
-rw-r--r--packages/backend/src/server/api/endpoints/i/update.ts52
-rw-r--r--packages/backend/src/server/api/endpoints/i/webhooks/create.ts39
-rw-r--r--packages/backend/src/server/api/endpoints/i/webhooks/list.ts45
-rw-r--r--packages/backend/src/server/api/endpoints/i/webhooks/show.ts40
17 files changed, 437 insertions, 17 deletions
diff --git a/packages/backend/src/server/api/endpoints/i/2fa/key-done.ts b/packages/backend/src/server/api/endpoints/i/2fa/key-done.ts
index 6033ce5dd4..4161553d28 100644
--- a/packages/backend/src/server/api/endpoints/i/2fa/key-done.ts
+++ b/packages/backend/src/server/api/endpoints/i/2fa/key-done.ts
@@ -33,6 +33,16 @@ export const meta = {
id: '798d6847-b1ed-4f9c-b1f9-163c42655995',
},
},
+
+ res: {
+ type: 'object',
+ nullable: false,
+ optional: false,
+ properties: {
+ id: { type: 'string' },
+ name: { type: 'string' },
+ },
+ },
} as const;
export const paramDef = {
diff --git a/packages/backend/src/server/api/endpoints/i/2fa/register-key.ts b/packages/backend/src/server/api/endpoints/i/2fa/register-key.ts
index a6d05507ed..325d54d196 100644
--- a/packages/backend/src/server/api/endpoints/i/2fa/register-key.ts
+++ b/packages/backend/src/server/api/endpoints/i/2fa/register-key.ts
@@ -37,6 +37,140 @@ export const meta = {
id: 'bf32b864-449b-47b8-974e-f9a5468546f1',
},
},
+
+ res: {
+ type: 'object',
+ nullable: false,
+ optional: false,
+ properties: {
+ rp: {
+ type: 'object',
+ properties: {
+ id: {
+ type: 'string',
+ nullable: true,
+ },
+ },
+ },
+ user: {
+ type: 'object',
+ properties: {
+ id: {
+ type: 'string',
+ },
+ name: {
+ type: 'string',
+ },
+ displayName: {
+ type: 'string',
+ },
+ },
+ },
+ challenge: {
+ type: 'string',
+ },
+ pubKeyCredParams: {
+ type: 'array',
+ items: {
+ type: 'object',
+ properties: {
+ type: {
+ type: 'string',
+ },
+ alg: {
+ type: 'number',
+ },
+ },
+ },
+ },
+ timeout: {
+ type: 'number',
+ nullable: true,
+ },
+ excludeCredentials: {
+ type: 'array',
+ nullable: true,
+ items: {
+ type: 'object',
+ properties: {
+ id: {
+ type: 'string',
+ },
+ type: {
+ type: 'string',
+ },
+ transports: {
+ type: 'array',
+ items: {
+ type: 'string',
+ enum: [
+ "ble",
+ "cable",
+ "hybrid",
+ "internal",
+ "nfc",
+ "smart-card",
+ "usb",
+ ],
+ },
+ },
+ },
+ },
+ },
+ authenticatorSelection: {
+ type: 'object',
+ nullable: true,
+ properties: {
+ authenticatorAttachment: {
+ type: 'string',
+ enum: [
+ "cross-platform",
+ "platform",
+ ],
+ },
+ requireResidentKey: {
+ type: 'boolean',
+ },
+ userVerification: {
+ type: 'string',
+ enum: [
+ "discouraged",
+ "preferred",
+ "required",
+ ],
+ },
+ },
+ },
+ attestation: {
+ type: 'string',
+ nullable: true,
+ enum: [
+ "direct",
+ "enterprise",
+ "indirect",
+ "none",
+ ],
+ },
+ extensions: {
+ type: 'object',
+ nullable: true,
+ properties: {
+ appid: {
+ type: 'string',
+ nullable: true,
+ },
+ credProps: {
+ type: 'boolean',
+ nullable: true,
+ },
+ hmacCreateSecret: {
+ type: 'boolean',
+ nullable: true,
+ },
+ },
+ },
+ },
+ },
} as const;
export const paramDef = {
diff --git a/packages/backend/src/server/api/endpoints/i/2fa/register.ts b/packages/backend/src/server/api/endpoints/i/2fa/register.ts
index 9b3ae74f86..15e50c49f3 100644
--- a/packages/backend/src/server/api/endpoints/i/2fa/register.ts
+++ b/packages/backend/src/server/api/endpoints/i/2fa/register.ts
@@ -27,6 +27,19 @@ export const meta = {
id: '78d6c839-20c9-4c66-b90a-fc0542168b48',
},
},
+
+ res: {
+ type: 'object',
+ nullable: false,
+ optional: false,
+ properties: {
+ qr: { type: 'string' },
+ url: { type: 'string' },
+ secret: { type: 'string' },
+ label: { type: 'string' },
+ issuer: { type: 'string' },
+ },
+ },
} as const;
export const paramDef = {
diff --git a/packages/backend/src/server/api/endpoints/i/apps.ts b/packages/backend/src/server/api/endpoints/i/apps.ts
index 09f6540a77..ef89f93181 100644
--- a/packages/backend/src/server/api/endpoints/i/apps.ts
+++ b/packages/backend/src/server/api/endpoints/i/apps.ts
@@ -13,6 +13,37 @@ export const meta = {
requireCredential: true,
secure: true,
+
+ res: {
+ type: 'array',
+ items: {
+ type: 'object',
+ properties: {
+ id: {
+ type: 'string',
+ format: 'misskey:id',
+ },
+ name: {
+ type: 'string',
+ },
+ createdAt: {
+ type: 'string',
+ format: 'date-time',
+ },
+ lastUsedAt: {
+ type: 'string',
+ format: 'date-time',
+ },
+ permission: {
+ type: 'array',
+ uniqueItems: true,
+ items: {
+ type: 'string'
+ },
+ }
+ },
+ },
+ },
} as const;
export const paramDef = {
@@ -50,7 +81,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
id: token.id,
name: token.name ?? token.app?.name,
createdAt: this.idService.parse(token.id).date.toISOString(),
- lastUsedAt: token.lastUsedAt,
+ lastUsedAt: token.lastUsedAt?.toISOString(),
permission: token.permission,
})));
});
diff --git a/packages/backend/src/server/api/endpoints/i/authorized-apps.ts b/packages/backend/src/server/api/endpoints/i/authorized-apps.ts
index 32061c2aa4..a0ed371fb8 100644
--- a/packages/backend/src/server/api/endpoints/i/authorized-apps.ts
+++ b/packages/backend/src/server/api/endpoints/i/authorized-apps.ts
@@ -14,6 +14,36 @@ export const meta = {
requireCredential: true,
secure: true,
+
+ res: {
+ type: 'array',
+ items: {
+ type: 'object',
+ properties: {
+ id: {
+ type: 'string',
+ format: 'misskey:id',
+ },
+ name: {
+ type: 'string',
+ },
+ callbackUrl: {
+ type: 'string',
+ nullable: true,
+ },
+ permission: {
+ type: 'array',
+ uniqueItems: true,
+ items: {
+ type: 'string'
+ },
+ },
+ isAuthorized: {
+ type: 'boolean',
+ },
+ },
+ },
+ },
} as const;
export const paramDef = {
diff --git a/packages/backend/src/server/api/endpoints/i/move.ts b/packages/backend/src/server/api/endpoints/i/move.ts
index 86b726e054..f3ba720c2b 100644
--- a/packages/backend/src/server/api/endpoints/i/move.ts
+++ b/packages/backend/src/server/api/endpoints/i/move.ts
@@ -64,6 +64,10 @@ export const meta = {
id: 'b234a14e-9ebe-4581-8000-074b3c215962',
},
},
+
+ res: {
+ type: 'object',
+ },
} as const;
export const paramDef = {
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 29fa0a29cc..bd6e85a074 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
@@ -9,6 +9,10 @@ import { RegistryApiService } from '@/core/RegistryApiService.js';
export const meta = {
requireCredential: true,
+
+ res: {
+ type: 'object',
+ },
} as const;
export const paramDef = {
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 5b460b45d6..2352beb130 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
@@ -18,6 +18,10 @@ export const meta = {
id: '97a1e8e7-c0f7-47d2-957a-92e61256e01a',
},
},
+
+ res: {
+ type: 'object',
+ }
} as const;
export const paramDef = {
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 e8c28298ef..4155a43e0d 100644
--- a/packages/backend/src/server/api/endpoints/i/registry/get.ts
+++ b/packages/backend/src/server/api/endpoints/i/registry/get.ts
@@ -18,6 +18,10 @@ export const meta = {
id: 'ac3ed68a-62f0-422b-a7bc-d5e09e8f6a6a',
},
},
+
+ res: {
+ type: 'object',
+ }
} as const;
export const paramDef = {
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 8953ee5d3d..b411cdd3d9 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
@@ -9,6 +9,10 @@ import { RegistryApiService } from '@/core/RegistryApiService.js';
export const meta = {
requireCredential: true,
+
+ res: {
+ type: 'object',
+ },
} as const;
export const paramDef = {
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
index 1ff994b82c..0aca2a26fe 100644
--- 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
@@ -10,6 +10,28 @@ import { RegistryApiService } from '@/core/RegistryApiService.js';
export const meta = {
requireCredential: true,
secure: true,
+
+ res: {
+ type: 'array',
+ items: {
+ type: 'object',
+ properties: {
+ scopes: {
+ type: 'array',
+ items: {
+ type: 'array',
+ items: {
+ type: 'string',
+ }
+ }
+ },
+ domain: {
+ type: 'string',
+ nullable: true,
+ },
+ },
+ },
+ }
} as const;
export const paramDef = {
diff --git a/packages/backend/src/server/api/endpoints/i/signin-history.ts b/packages/backend/src/server/api/endpoints/i/signin-history.ts
index 139bede7bc..f82e3f9b28 100644
--- a/packages/backend/src/server/api/endpoints/i/signin-history.ts
+++ b/packages/backend/src/server/api/endpoints/i/signin-history.ts
@@ -12,8 +12,17 @@ import { DI } from '@/di-symbols.js';
export const meta = {
requireCredential: true,
-
secure: true,
+
+ res: {
+ type: 'array',
+ optional: false, nullable: false,
+ items: {
+ type: 'object',
+ optional: false, nullable: false,
+ ref: 'Signin',
+ },
+ },
} as const;
export const paramDef = {
diff --git a/packages/backend/src/server/api/endpoints/i/update-email.ts b/packages/backend/src/server/api/endpoints/i/update-email.ts
index d3b4649783..090b07be3c 100644
--- a/packages/backend/src/server/api/endpoints/i/update-email.ts
+++ b/packages/backend/src/server/api/endpoints/i/update-email.ts
@@ -41,6 +41,11 @@ export const meta = {
id: 'a2defefb-f220-8849-0af6-17f816099323',
},
},
+
+ res: {
+ type: 'object',
+ ref: 'UserDetailed',
+ },
} as const;
export const paramDef = {
diff --git a/packages/backend/src/server/api/endpoints/i/update.ts b/packages/backend/src/server/api/endpoints/i/update.ts
index aa730716bd..22079de042 100644
--- a/packages/backend/src/server/api/endpoints/i/update.ts
+++ b/packages/backend/src/server/api/endpoints/i/update.ts
@@ -135,6 +135,11 @@ export const meta = {
},
} as const;
+const muteWords = { type: 'array', items: { oneOf: [
+ { type: 'array', items: { type: 'string' } },
+ { type: 'string' },
+] } } as const;
+
export const paramDef = {
type: 'object',
properties: {
@@ -145,12 +150,14 @@ export const paramDef = {
listenbrainz: { ...listenbrainzSchema, nullable: true },
lang: { type: 'string', enum: [null, ...Object.keys(langmap)] as string[], nullable: true },
avatarId: { type: 'string', format: 'misskey:id', nullable: true },
- avatarDecorations: { type: 'array', maxItems: 1, items: {
+ avatarDecorations: { type: 'array', maxItems: 16, items: {
type: 'object',
properties: {
id: { type: 'string', format: 'misskey:id' },
angle: { type: 'number', nullable: true, maximum: 0.5, minimum: -0.5 },
flipH: { type: 'boolean', nullable: true },
+ offsetX: { type: 'number', nullable: true, maximum: 0.25, minimum: -0.25 },
+ offsetY: { type: 'number', nullable: true, maximum: 0.25, minimum: -0.25 },
},
required: ['id'],
} },
@@ -185,9 +192,11 @@ export const paramDef = {
receiveAnnouncementEmail: { type: 'boolean' },
alwaysMarkNsfw: { type: 'boolean' },
autoSensitive: { type: 'boolean' },
- ffVisibility: { type: 'string', enum: ['public', 'followers', 'private'] },
+ followingVisibility: { type: 'string', enum: ['public', 'followers', 'private'] },
+ followersVisibility: { type: 'string', enum: ['public', 'followers', 'private'] },
pinnedPageId: { type: 'string', format: 'misskey:id', nullable: true },
- mutedWords: { type: 'array' },
+ mutedWords: muteWords,
+ hardMutedWords: muteWords,
mutedInstances: { type: 'array', items: {
type: 'string',
} },
@@ -250,17 +259,22 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
if (ps.location !== undefined) profileUpdates.location = ps.location;
if (ps.birthday !== undefined) profileUpdates.birthday = ps.birthday;
if (ps.listenbrainz !== undefined) profileUpdates.listenbrainz = ps.listenbrainz;
- if (ps.ffVisibility !== undefined) profileUpdates.ffVisibility = ps.ffVisibility;
- if (ps.mutedWords !== undefined) {
+ if (ps.followingVisibility !== undefined) profileUpdates.followingVisibility = ps.followingVisibility;
+ if (ps.followersVisibility !== undefined) profileUpdates.followersVisibility = ps.followersVisibility;
+
+ function checkMuteWordCount(mutedWords: (string[] | string)[], limit: number) {
// TODO: ちゃんと数える
- const length = JSON.stringify(ps.mutedWords).length;
- if (length > (await this.roleService.getUserPolicies(user.id)).wordMuteLimit) {
+ const length = JSON.stringify(mutedWords).length;
+ if (length > limit) {
throw new ApiError(meta.errors.tooManyMutedWords);
}
+ }
+
+ function validateMuteWordRegex(mutedWords: (string[] | string)[]) {
+ for (const mutedWord of mutedWords) {
+ if (typeof mutedWord !== 'string') continue;
- // validate regular expression syntax
- ps.mutedWords.filter(x => !Array.isArray(x)).forEach(x => {
- const regexp = x.match(/^\/(.+)\/(.*)$/);
+ const regexp = mutedWord.match(/^\/(.+)\/(.*)$/);
if (!regexp) throw new ApiError(meta.errors.invalidRegexp);
try {
@@ -268,11 +282,21 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
} catch (err) {
throw new ApiError(meta.errors.invalidRegexp);
}
- });
+ }
+ }
+
+ if (ps.mutedWords !== undefined) {
+ checkMuteWordCount(ps.mutedWords, (await this.roleService.getUserPolicies(user.id)).wordMuteLimit);
+ validateMuteWordRegex(ps.mutedWords);
profileUpdates.mutedWords = ps.mutedWords;
profileUpdates.enableWordMute = ps.mutedWords.length > 0;
}
+ if (ps.hardMutedWords !== undefined) {
+ checkMuteWordCount(ps.hardMutedWords, (await this.roleService.getUserPolicies(user.id)).wordMuteLimit);
+ validateMuteWordRegex(ps.hardMutedWords);
+ profileUpdates.hardMutedWords = ps.hardMutedWords;
+ }
if (ps.mutedInstances !== undefined) profileUpdates.mutedInstances = ps.mutedInstances;
if (ps.notificationRecieveConfig !== undefined) profileUpdates.notificationRecieveConfig = ps.notificationRecieveConfig;
if (typeof ps.isLocked === 'boolean') updates.isLocked = ps.isLocked;
@@ -341,16 +365,20 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
if (ps.avatarDecorations) {
const decorations = await this.avatarDecorationService.getAll(true);
- const myRoles = await this.roleService.getUserRoles(user.id);
+ const [myRoles, myPolicies] = await Promise.all([this.roleService.getUserRoles(user.id), this.roleService.getUserPolicies(user.id)]);
const allRoles = await this.roleService.getRoles();
const decorationIds = decorations
.filter(d => d.roleIdsThatCanBeUsedThisDecoration.filter(roleId => allRoles.some(r => r.id === roleId)).length === 0 || myRoles.some(r => d.roleIdsThatCanBeUsedThisDecoration.includes(r.id)))
.map(d => d.id);
+ if (ps.avatarDecorations.length > myPolicies.avatarDecorationLimit) throw new ApiError(meta.errors.restrictedByRole);
+
updates.avatarDecorations = ps.avatarDecorations.filter(d => decorationIds.includes(d.id)).map(d => ({
id: d.id,
angle: d.angle ?? 0,
flipH: d.flipH ?? false,
+ offsetX: d.offsetX ?? 0,
+ offsetY: d.offsetY ?? 0,
}));
}
diff --git a/packages/backend/src/server/api/endpoints/i/webhooks/create.ts b/packages/backend/src/server/api/endpoints/i/webhooks/create.ts
index f00dba4a85..bdc9f9ea8b 100644
--- a/packages/backend/src/server/api/endpoints/i/webhooks/create.ts
+++ b/packages/backend/src/server/api/endpoints/i/webhooks/create.ts
@@ -27,6 +27,33 @@ export const meta = {
id: '87a9bb19-111e-4e37-81d3-a3e7426453b0',
},
},
+
+ res: {
+ type: 'object',
+ properties: {
+ id: {
+ type: 'string',
+ format: 'misskey:id'
+ },
+ userId: {
+ type: 'string',
+ format: 'misskey:id',
+ },
+ name: { type: 'string' },
+ on: {
+ type: 'array',
+ items: {
+ type: 'string',
+ enum: webhookEventTypes,
+ }
+ },
+ url: { type: 'string' },
+ secret: { type: 'string' },
+ active: { type: 'boolean' },
+ latestSentAt: { type: 'string', format: 'date-time', nullable: true },
+ latestStatus: { type: 'integer', nullable: true },
+ },
+ },
} as const;
export const paramDef = {
@@ -73,7 +100,17 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
this.globalEventService.publishInternalEvent('webhookCreated', webhook);
- return webhook;
+ return {
+ id: webhook.id,
+ userId: webhook.userId,
+ name: webhook.name,
+ on: webhook.on,
+ url: webhook.url,
+ secret: webhook.secret,
+ active: webhook.active,
+ latestSentAt: webhook.latestSentAt?.toISOString(),
+ latestStatus: webhook.latestStatus,
+ };
});
}
}
diff --git a/packages/backend/src/server/api/endpoints/i/webhooks/list.ts b/packages/backend/src/server/api/endpoints/i/webhooks/list.ts
index aa8921fe24..afb2d0509e 100644
--- a/packages/backend/src/server/api/endpoints/i/webhooks/list.ts
+++ b/packages/backend/src/server/api/endpoints/i/webhooks/list.ts
@@ -5,6 +5,7 @@
import { Inject, Injectable } from '@nestjs/common';
import { Endpoint } from '@/server/api/endpoint-base.js';
+import { webhookEventTypes } from '@/models/Webhook.js';
import type { WebhooksRepository } from '@/models/_.js';
import { DI } from '@/di-symbols.js';
@@ -14,6 +15,36 @@ export const meta = {
requireCredential: true,
kind: 'read:account',
+
+ res: {
+ type: 'array',
+ items: {
+ type: 'object',
+ properties: {
+ id: {
+ type: 'string',
+ format: 'misskey:id'
+ },
+ userId: {
+ type: 'string',
+ format: 'misskey:id',
+ },
+ name: { type: 'string' },
+ on: {
+ type: 'array',
+ items: {
+ type: 'string',
+ enum: webhookEventTypes,
+ }
+ },
+ url: { type: 'string' },
+ secret: { type: 'string' },
+ active: { type: 'boolean' },
+ latestSentAt: { type: 'string', format: 'date-time', nullable: true },
+ latestStatus: { type: 'integer', nullable: true },
+ },
+ }
+ }
} as const;
export const paramDef = {
@@ -33,7 +64,19 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
userId: me.id,
});
- return webhooks;
+ return webhooks.map(webhook => (
+ {
+ id: webhook.id,
+ userId: webhook.userId,
+ name: webhook.name,
+ on: webhook.on,
+ url: webhook.url,
+ secret: webhook.secret,
+ active: webhook.active,
+ latestSentAt: webhook.latestSentAt?.toISOString(),
+ latestStatus: webhook.latestStatus,
+ }
+ ));
});
}
}
diff --git a/packages/backend/src/server/api/endpoints/i/webhooks/show.ts b/packages/backend/src/server/api/endpoints/i/webhooks/show.ts
index f1294bb5c8..5c6dd908b4 100644
--- a/packages/backend/src/server/api/endpoints/i/webhooks/show.ts
+++ b/packages/backend/src/server/api/endpoints/i/webhooks/show.ts
@@ -5,6 +5,7 @@
import { Inject, Injectable } from '@nestjs/common';
import { Endpoint } from '@/server/api/endpoint-base.js';
+import { webhookEventTypes } from '@/models/Webhook.js';
import type { WebhooksRepository } from '@/models/_.js';
import { DI } from '@/di-symbols.js';
import { ApiError } from '../../../error.js';
@@ -23,6 +24,33 @@ export const meta = {
id: '50f614d9-3047-4f7e-90d8-ad6b2d5fb098',
},
},
+
+ res: {
+ type: 'object',
+ properties: {
+ id: {
+ type: 'string',
+ format: 'misskey:id'
+ },
+ userId: {
+ type: 'string',
+ format: 'misskey:id',
+ },
+ name: { type: 'string' },
+ on: {
+ type: 'array',
+ items: {
+ type: 'string',
+ enum: webhookEventTypes,
+ }
+ },
+ url: { type: 'string' },
+ secret: { type: 'string' },
+ active: { type: 'boolean' },
+ latestSentAt: { type: 'string', format: 'date-time', nullable: true },
+ latestStatus: { type: 'integer', nullable: true },
+ },
+ },
} as const;
export const paramDef = {
@@ -49,7 +77,17 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
throw new ApiError(meta.errors.noSuchWebhook);
}
- return webhook;
+ return {
+ id: webhook.id,
+ userId: webhook.userId,
+ name: webhook.name,
+ on: webhook.on,
+ url: webhook.url,
+ secret: webhook.secret,
+ active: webhook.active,
+ latestSentAt: webhook.latestSentAt?.toISOString(),
+ latestStatus: webhook.latestStatus,
+ };
});
}
}