diff --git a/packages/backend/src/queue/processors/DeleteAccountProcessorService.ts b/packages/backend/src/queue/processors/DeleteAccountProcessorService.ts index 7132b5841b..b95b89d6ce 100644 --- a/packages/backend/src/queue/processors/DeleteAccountProcessorService.ts +++ b/packages/backend/src/queue/processors/DeleteAccountProcessorService.ts @@ -4,9 +4,9 @@ */ import { Inject, Injectable } from '@nestjs/common'; -import { In, MoreThan } from 'typeorm'; +import { In, IsNull, MoreThan } from 'typeorm'; import { DI } from '@/di-symbols.js'; -import type { DriveFilesRepository, NoteReactionsRepository, NotesRepository, UserProfilesRepository, UsersRepository, NoteScheduleRepository, MiNoteSchedule, FollowingsRepository, FollowRequestsRepository, BlockingsRepository, MutingsRepository, ClipsRepository, ClipNotesRepository, LatestNotesRepository, NoteEditsRepository, NoteFavoritesRepository, PollVotesRepository, PollsRepository, SigninsRepository, UserIpsRepository, RegistryItemsRepository } from '@/models/_.js'; +import type { DriveFilesRepository, NoteReactionsRepository, NotesRepository, UserProfilesRepository, UsersRepository, NoteScheduleRepository, MiNoteSchedule, FollowingsRepository, FollowRequestsRepository, BlockingsRepository, MutingsRepository, ClipsRepository, ClipNotesRepository, LatestNotesRepository, NoteEditsRepository, NoteFavoritesRepository, PollVotesRepository, PollsRepository, SigninsRepository, UserIpsRepository, RegistryItemsRepository, MiUser } from '@/models/_.js'; import type Logger from '@/logger.js'; import { DriveService } from '@/core/DriveService.js'; import type { MiDriveFile } from '@/models/DriveFile.js'; @@ -19,6 +19,7 @@ import { ApLogService } from '@/core/ApLogService.js'; import { ReactionService } from '@/core/ReactionService.js'; import { QueueService } from '@/core/QueueService.js'; import { CacheService } from '@/core/CacheService.js'; +import { NoteDeleteService } from '@/core/NoteDeleteService.js'; import { QueueLoggerService } from '@/queue/QueueLoggerService.js'; import { ApPersonService } from '@/core/activitypub/models/ApPersonService.js'; import * as Acct from '@/misc/acct.js'; @@ -99,6 +100,7 @@ export class DeleteAccountProcessorService { private readonly apLogService: ApLogService, private readonly cacheService: CacheService, private readonly apPersonService: ApPersonService, + private readonly noteDeleteService: NoteDeleteService, ) { this.logger = this.queueLoggerService.logger.createSubLogger('delete-account'); } @@ -293,11 +295,12 @@ export class DeleteAccountProcessorService { const notes = await this.notesRepository.find({ where: { userId: user.id, + replyId: IsNull(), ...(cursor ? { id: MoreThan(cursor) } : {}), }, take: 100, order: { - id: 1, + id: 'desc', }, }) as MiNote[]; @@ -318,6 +321,16 @@ export class DeleteAccountProcessorService { const ids = notes.map(note => note.id); + const replies = await this.notesRepository.find({ + where: { replyId: In(ids) }, + relations: { user: true }, + }); + + // Delete replies through the usual service to ensure we get all "cascading notes" logic. + for (const reply of replies) { + await this.noteDeleteService.delete(reply.user as MiUser, reply); + } + await this.noteEditsRepository.delete({ noteId: In(ids), });