fix account deletion not triggering background tasks for cascaded note deletions

This commit is contained in:
Hazelnoot 2025-06-19 17:15:13 -04:00
parent 4501ecb293
commit e587e376e5

View file

@ -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),
});