From 1ec8d02e132fd2028fecdb3917eab79fa2506ea3 Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Mon, 7 Apr 2025 21:46:17 +0900 Subject: [PATCH] feat: exclude notes by suspended user from FTT timeline endpoint --- .../src/core/FanoutTimelineEndpointService.ts | 14 ++++++++++++++ packages/backend/src/models/Note.ts | 4 ++++ .../src/server/api/endpoints/users/notes.ts | 1 + 3 files changed, 19 insertions(+) diff --git a/packages/backend/src/core/FanoutTimelineEndpointService.ts b/packages/backend/src/core/FanoutTimelineEndpointService.ts index b05af99c5e..94208b9ddf 100644 --- a/packages/backend/src/core/FanoutTimelineEndpointService.ts +++ b/packages/backend/src/core/FanoutTimelineEndpointService.ts @@ -33,6 +33,7 @@ type TimelineOptions = { excludeNoFiles?: boolean; excludeReplies?: boolean; excludePureRenotes: boolean; + ignoreAuthorFromUserSuspension?: boolean; dbFallback: (untilId: string | null, sinceId: string | null, limit: number) => Promise, }; @@ -119,6 +120,19 @@ export class FanoutTimelineEndpointService { }; } + { + const parentFilter = filter; + filter = (note) => { + if (!ps.ignoreAuthorFromUserSuspension) { + if (note.user!.isSuspended) return false; + } + if (note.userId !== note.renoteUserId && note.renoteUser?.isSuspended) return false; + if (note.userId !== note.replyUserId && note.replyUser?.isSuspended) return false; + + return parentFilter(note); + }; + } + const redisTimeline: MiNote[] = []; let readFromRedis = 0; let lastSuccessfulRate = 1; // rateをキャッシュする? diff --git a/packages/backend/src/models/Note.ts b/packages/backend/src/models/Note.ts index 9a95c6faab..e0d3f7a4d9 100644 --- a/packages/backend/src/models/Note.ts +++ b/packages/backend/src/models/Note.ts @@ -229,6 +229,10 @@ export class MiNote { comment: '[Denormalized]', }) public renoteUserHost: string | null; + + // some query includes the following fields + public renoteUser?: MiUser | null; + public replyUser?: MiUser | null; //#endregion constructor(data: Partial) { diff --git a/packages/backend/src/server/api/endpoints/users/notes.ts b/packages/backend/src/server/api/endpoints/users/notes.ts index f5b7a07b01..caee694074 100644 --- a/packages/backend/src/server/api/endpoints/users/notes.ts +++ b/packages/backend/src/server/api/endpoints/users/notes.ts @@ -129,6 +129,7 @@ export default class extends Endpoint { // eslint- redisTimelines, useDbFallback: true, ignoreAuthorFromMute: true, + ignoreAuthorFromUserSuspension: true, excludeReplies: ps.withChannelNotes && !ps.withReplies, // userTimelineWithChannel may include replies excludeNoFiles: ps.withChannelNotes && ps.withFiles, // userTimelineWithChannel may include notes without files excludePureRenotes: !ps.withRenotes,