summaryrefslogtreecommitdiff
path: root/packages/backend/src/core/WebhookTestService.ts
diff options
context:
space:
mode:
authorHazelnoot <acomputerdog@gmail.com>2025-03-25 16:14:53 -0400
committerHazelnoot <acomputerdog@gmail.com>2025-03-25 16:14:53 -0400
commitd8908ef2d8fa84d8e0fc1d30ab90a600a3d88054 (patch)
tree0c8d3e0385ce7021c7187ef8b608f1abd87496e5 /packages/backend/src/core/WebhookTestService.ts
parentmerge: enhance: Update de-DE.yml (!949) (diff)
parentenhance(frontend): 設定の移行を手動でトリガーできるように (diff)
downloadsharkey-d8908ef2d8fa84d8e0fc1d30ab90a600a3d88054.tar.gz
sharkey-d8908ef2d8fa84d8e0fc1d30ab90a600a3d88054.tar.bz2
sharkey-d8908ef2d8fa84d8e0fc1d30ab90a600a3d88054.zip
merge upstream
Diffstat (limited to 'packages/backend/src/core/WebhookTestService.ts')
-rw-r--r--packages/backend/src/core/WebhookTestService.ts334
1 files changed, 165 insertions, 169 deletions
diff --git a/packages/backend/src/core/WebhookTestService.ts b/packages/backend/src/core/WebhookTestService.ts
index 891bdf7334..8d2e181aa5 100644
--- a/packages/backend/src/core/WebhookTestService.ts
+++ b/packages/backend/src/core/WebhookTestService.ts
@@ -7,42 +7,16 @@ import { Injectable } from '@nestjs/common';
import { MiAbuseUserReport, MiNote, MiUser, MiWebhook } from '@/models/_.js';
import { bindThis } from '@/decorators.js';
import { MiSystemWebhook, type SystemWebhookEventType } from '@/models/SystemWebhook.js';
-import { AbuseReportPayload, SystemWebhookPayload, SystemWebhookService } from '@/core/SystemWebhookService.js';
-import { Packed } from '@/misc/json-schema.js';
+import { type AbuseReportPayload, SystemWebhookPayload, SystemWebhookService } from '@/core/SystemWebhookService.js';
+import { type Packed } from '@/misc/json-schema.js';
import { type WebhookEventTypes } from '@/models/Webhook.js';
+import { CustomEmojiService } from '@/core/CustomEmojiService.js';
import { type UserWebhookPayload, UserWebhookService } from '@/core/UserWebhookService.js';
import { QueueService } from '@/core/QueueService.js';
import { ModeratorInactivityRemainingTime } from '@/queue/processors/CheckModeratorsActivityProcessorService.js';
const oneDayMillis = 24 * 60 * 60 * 1000;
-function generateAbuseReport(override?: Partial<MiAbuseUserReport>): AbuseReportPayload {
- const result: MiAbuseUserReport = {
- id: 'dummy-abuse-report1',
- targetUserId: 'dummy-target-user',
- targetUser: null,
- reporterId: 'dummy-reporter-user',
- reporter: null,
- assigneeId: null,
- assignee: null,
- resolved: false,
- forwarded: false,
- comment: 'This is a dummy report for testing purposes.',
- targetUserHost: null,
- reporterHost: null,
- resolvedAs: null,
- moderationNote: 'foo',
- ...override,
- };
-
- return {
- ...result,
- targetUser: result.targetUser ? toPackedUserLite(result.targetUser) : null,
- reporter: result.reporter ? toPackedUserLite(result.reporter) : null,
- assignee: result.assignee ? toPackedUserLite(result.assignee) : null,
- };
-}
-
function generateDummyUser(override?: Partial<MiUser>): MiUser {
return {
id: 'dummy-user-1',
@@ -79,13 +53,13 @@ function generateDummyUser(override?: Partial<MiUser>): MiUser {
isBot: false,
isCat: true,
speakAsCat: true,
- isRoot: false,
isExplorable: true,
isHibernated: false,
isDeleted: false,
requireSigninToViewContents: false,
makeNotesFollowersOnlyBefore: null,
makeNotesHiddenBefore: null,
+ chatScope: 'mutual',
emojis: [],
score: 0,
host: null,
@@ -150,135 +124,6 @@ function generateDummyNote(override?: Partial<MiNote>): MiNote {
};
}
-function toPackedNote(note: MiNote, detail = true, override?: Packed<'Note'>): Packed<'Note'> {
- return {
- id: note.id,
- createdAt: new Date().toISOString(),
- deletedAt: null,
- text: note.text,
- cw: note.cw,
- userId: note.userId,
- user: toPackedUserLite(note.user ?? generateDummyUser()),
- replyId: note.replyId,
- renoteId: note.renoteId,
- isHidden: false,
- visibility: note.visibility,
- mentions: note.mentions,
- visibleUserIds: note.visibleUserIds,
- fileIds: note.fileIds,
- files: [],
- tags: note.tags,
- poll: null,
- emojis: note.emojis,
- channelId: note.channelId,
- channel: note.channel,
- localOnly: note.localOnly,
- reactionAcceptance: note.reactionAcceptance,
- reactionEmojis: {},
- reactions: {},
- reactionCount: 0,
- renoteCount: note.renoteCount,
- repliesCount: note.repliesCount,
- uri: note.uri ?? undefined,
- url: note.url ?? undefined,
- reactionAndUserPairCache: note.reactionAndUserPairCache,
- ...(detail ? {
- clippedCount: note.clippedCount,
- reply: note.reply ? toPackedNote(note.reply, false) : null,
- renote: note.renote ? toPackedNote(note.renote, true) : null,
- myReaction: null,
- } : {}),
- ...override,
- };
-}
-
-function toPackedUserLite(user: MiUser, override?: Packed<'UserLite'>): Packed<'UserLite'> {
- return {
- id: user.id,
- name: user.name,
- username: user.username,
- host: user.host,
- avatarUrl: user.avatarUrl,
- avatarBlurhash: user.avatarBlurhash,
- avatarDecorations: user.avatarDecorations.map(it => ({
- id: it.id,
- angle: it.angle,
- flipH: it.flipH,
- url: 'https://example.com/dummy-image001.png',
- offsetX: it.offsetX,
- offsetY: it.offsetY,
- })),
- isBot: user.isBot,
- isCat: user.isCat,
- speakAsCat: user.speakAsCat,
- emojis: user.emojis,
- onlineStatus: 'active',
- badgeRoles: [],
- noindex: user.noindex,
- isModerator: false,
- isAdmin: false,
- isSystem: false,
- isSilenced: user.isSilenced,
- enableRss: true,
- mandatoryCW: null,
- ...override,
- };
-}
-
-function toPackedUserDetailedNotMe(user: MiUser, override?: Packed<'UserDetailedNotMe'>): Packed<'UserDetailedNotMe'> {
- return {
- ...toPackedUserLite(user),
- url: null,
- uri: null,
- movedTo: null,
- alsoKnownAs: [],
- createdAt: new Date().toISOString(),
- updatedAt: user.updatedAt?.toISOString() ?? null,
- lastFetchedAt: user.lastFetchedAt?.toISOString() ?? null,
- bannerUrl: user.bannerUrl,
- bannerBlurhash: user.bannerBlurhash,
- backgroundUrl: user.backgroundUrl,
- backgroundBlurhash: user.backgroundBlurhash,
- isLocked: user.isLocked,
- isSilenced: false,
- isSuspended: user.isSuspended,
- description: null,
- location: null,
- birthday: null,
- lang: null,
- fields: [],
- verifiedLinks: [],
- followersCount: user.followersCount,
- followingCount: user.followingCount,
- notesCount: user.notesCount,
- pinnedNoteIds: [],
- pinnedNotes: [],
- pinnedPageId: null,
- pinnedPage: null,
- publicReactions: true,
- followersVisibility: 'public',
- followingVisibility: 'public',
- twoFactorEnabled: false,
- usePasswordLessLogin: false,
- securityKeys: false,
- roles: [],
- memo: null,
- moderationNote: undefined,
- isFollowing: false,
- isFollowed: false,
- hasPendingFollowRequestFromYou: false,
- hasPendingFollowRequestToYou: false,
- isBlocking: false,
- isBlocked: false,
- isMuted: false,
- isRenoteMuted: false,
- notify: 'none',
- withReplies: true,
- listenbrainz: null,
- ...override,
- };
-}
-
const dummyUser1 = generateDummyUser();
const dummyUser2 = generateDummyUser({
id: 'dummy-user-2',
@@ -311,6 +156,7 @@ export class WebhookTestService {
};
constructor(
+ private customEmojiService: CustomEmojiService,
private userWebhookService: UserWebhookService,
private systemWebhookService: SystemWebhookService,
private queueService: QueueService,
@@ -381,19 +227,19 @@ export class WebhookTestService {
switch (params.type) {
case 'note': {
- send('note', { note: toPackedNote(dummyNote1) });
+ send('note', { note: await this.toPackedNote(dummyNote1) });
break;
}
case 'reply': {
- send('reply', { note: toPackedNote(dummyReply1) });
+ send('reply', { note: await this.toPackedNote(dummyReply1) });
break;
}
case 'renote': {
- send('renote', { note: toPackedNote(dummyRenote1) });
+ send('renote', { note: await this.toPackedNote(dummyRenote1) });
break;
}
case 'mention': {
- send('mention', { note: toPackedNote(dummyMention1) });
+ send('mention', { note: await this.toPackedNote(dummyMention1) });
break;
}
case 'edited': {
@@ -401,15 +247,15 @@ export class WebhookTestService {
break;
}
case 'follow': {
- send('follow', { user: toPackedUserDetailedNotMe(dummyUser1) });
+ send('follow', { user: await this.toPackedUserDetailedNotMe(dummyUser1) });
break;
}
case 'followed': {
- send('followed', { user: toPackedUserLite(dummyUser2) });
+ send('followed', { user: await this.toPackedUserLite(dummyUser2) });
break;
}
case 'unfollow': {
- send('unfollow', { user: toPackedUserDetailedNotMe(dummyUser3) });
+ send('unfollow', { user: await this.toPackedUserDetailedNotMe(dummyUser3) });
break;
}
// まだ実装されていない (#9485)
@@ -458,7 +304,7 @@ export class WebhookTestService {
switch (params.type) {
case 'abuseReport': {
- send('abuseReport', generateAbuseReport({
+ send('abuseReport', await this.generateAbuseReport({
targetUserId: dummyUser1.id,
targetUser: dummyUser1,
reporterId: dummyUser2.id,
@@ -467,7 +313,7 @@ export class WebhookTestService {
break;
}
case 'abuseReportResolved': {
- send('abuseReportResolved', generateAbuseReport({
+ send('abuseReportResolved', await this.generateAbuseReport({
targetUserId: dummyUser1.id,
targetUser: dummyUser1,
reporterId: dummyUser2.id,
@@ -479,7 +325,7 @@ export class WebhookTestService {
break;
}
case 'userCreated': {
- send('userCreated', toPackedUserLite(dummyUser1));
+ send('userCreated', await this.toPackedUserLite(dummyUser1));
break;
}
case 'inactiveModeratorsWarning': {
@@ -505,4 +351,154 @@ export class WebhookTestService {
}
}
}
+
+ @bindThis
+ private async generateAbuseReport(override?: Partial<MiAbuseUserReport>): Promise<AbuseReportPayload> {
+ const result: MiAbuseUserReport = {
+ id: 'dummy-abuse-report1',
+ targetUserId: 'dummy-target-user',
+ targetUser: null,
+ reporterId: 'dummy-reporter-user',
+ reporter: null,
+ assigneeId: null,
+ assignee: null,
+ resolved: false,
+ forwarded: false,
+ comment: 'This is a dummy report for testing purposes.',
+ targetUserHost: null,
+ reporterHost: null,
+ resolvedAs: null,
+ moderationNote: 'foo',
+ ...override,
+ };
+
+ return {
+ ...result,
+ targetUser: result.targetUser ? await this.toPackedUserLite(result.targetUser) : null,
+ reporter: result.reporter ? await this.toPackedUserLite(result.reporter) : null,
+ assignee: result.assignee ? await this.toPackedUserLite(result.assignee) : null,
+ };
+ }
+
+ @bindThis
+ private async toPackedNote(note: MiNote, detail = true, override?: Packed<'Note'>): Promise<Packed<'Note'>> {
+ return {
+ id: note.id,
+ createdAt: new Date().toISOString(),
+ deletedAt: null,
+ text: note.text,
+ cw: note.cw,
+ userId: note.userId,
+ user: await this.toPackedUserLite(note.user ?? generateDummyUser()),
+ replyId: note.replyId,
+ renoteId: note.renoteId,
+ isHidden: false,
+ visibility: note.visibility,
+ mentions: note.mentions,
+ visibleUserIds: note.visibleUserIds,
+ fileIds: note.fileIds,
+ files: [],
+ tags: note.tags,
+ poll: null,
+ emojis: await this.customEmojiService.populateEmojis(note.emojis, note.userHost),
+ channelId: note.channelId,
+ channel: note.channel,
+ localOnly: note.localOnly,
+ reactionAcceptance: note.reactionAcceptance,
+ reactionEmojis: {},
+ reactions: {},
+ reactionCount: 0,
+ renoteCount: note.renoteCount,
+ repliesCount: note.repliesCount,
+ uri: note.uri ?? undefined,
+ url: note.url ?? undefined,
+ reactionAndUserPairCache: note.reactionAndUserPairCache,
+ ...(detail ? {
+ clippedCount: note.clippedCount,
+ reply: note.reply ? await this.toPackedNote(note.reply, false) : null,
+ renote: note.renote ? await this.toPackedNote(note.renote, true) : null,
+ myReaction: null,
+ } : {}),
+ ...override,
+ };
+ }
+
+ @bindThis
+ private async toPackedUserLite(user: MiUser, override?: Packed<'UserLite'>): Promise<Packed<'UserLite'>> {
+ return {
+ id: user.id,
+ name: user.name,
+ username: user.username,
+ host: user.host,
+ avatarUrl: user.avatarUrl,
+ avatarBlurhash: user.avatarBlurhash,
+ avatarDecorations: user.avatarDecorations.map(it => ({
+ id: it.id,
+ angle: it.angle,
+ flipH: it.flipH,
+ url: 'https://example.com/dummy-image001.png',
+ offsetX: it.offsetX,
+ offsetY: it.offsetY,
+ })),
+ isBot: user.isBot,
+ isCat: user.isCat,
+ emojis: await this.customEmojiService.populateEmojis(user.emojis, user.host),
+ onlineStatus: 'active',
+ badgeRoles: [],
+ ...override,
+ };
+ }
+
+ @bindThis
+ private async toPackedUserDetailedNotMe(user: MiUser, override?: Packed<'UserDetailedNotMe'>): Promise<Packed<'UserDetailedNotMe'>> {
+ return {
+ ...await this.toPackedUserLite(user),
+ url: null,
+ uri: null,
+ movedTo: null,
+ alsoKnownAs: [],
+ createdAt: new Date().toISOString(),
+ updatedAt: user.updatedAt?.toISOString() ?? null,
+ lastFetchedAt: user.lastFetchedAt?.toISOString() ?? null,
+ bannerUrl: user.bannerUrl,
+ bannerBlurhash: user.bannerBlurhash,
+ isLocked: user.isLocked,
+ isSilenced: false,
+ isSuspended: user.isSuspended,
+ description: null,
+ location: null,
+ birthday: null,
+ lang: null,
+ fields: [],
+ verifiedLinks: [],
+ followersCount: user.followersCount,
+ followingCount: user.followingCount,
+ notesCount: user.notesCount,
+ pinnedNoteIds: [],
+ pinnedNotes: [],
+ pinnedPageId: null,
+ pinnedPage: null,
+ publicReactions: true,
+ followersVisibility: 'public',
+ followingVisibility: 'public',
+ chatScope: 'mutual',
+ twoFactorEnabled: false,
+ usePasswordLessLogin: false,
+ securityKeys: false,
+ roles: [],
+ memo: null,
+ moderationNote: undefined,
+ isFollowing: false,
+ isFollowed: false,
+ hasPendingFollowRequestFromYou: false,
+ hasPendingFollowRequestToYou: false,
+ isBlocking: false,
+ isBlocked: false,
+ isMuted: false,
+ isRenoteMuted: false,
+ notify: 'none',
+ withReplies: true,
+ ...override,
+ };
+ }
}