From 82d70282e50e660476a6f32210289b0eeac7b32e Mon Sep 17 00:00:00 2001 From: Marie Date: Sun, 5 Nov 2023 03:21:13 +0100 Subject: [PATCH 1/2] feat(backend): remove reactions fully on account deletion --- .../DeleteAccountProcessorService.ts | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/packages/backend/src/queue/processors/DeleteAccountProcessorService.ts b/packages/backend/src/queue/processors/DeleteAccountProcessorService.ts index 39967165d4..86c733f757 100644 --- a/packages/backend/src/queue/processors/DeleteAccountProcessorService.ts +++ b/packages/backend/src/queue/processors/DeleteAccountProcessorService.ts @@ -6,14 +6,16 @@ import { Inject, Injectable } from '@nestjs/common'; import { MoreThan } from 'typeorm'; import { DI } from '@/di-symbols.js'; -import type { DriveFilesRepository, NotesRepository, UserProfilesRepository, UsersRepository } from '@/models/_.js'; +import type { DriveFilesRepository, NoteReactionsRepository, NotesRepository, UserProfilesRepository, UsersRepository } from '@/models/_.js'; import type Logger from '@/logger.js'; import { DriveService } from '@/core/DriveService.js'; import type { MiDriveFile } from '@/models/DriveFile.js'; import type { MiNote } from '@/models/Note.js'; +import type { MiNoteReaction } from '@/models/NoteReaction.js'; import { EmailService } from '@/core/EmailService.js'; import { bindThis } from '@/decorators.js'; import { SearchService } from '@/core/SearchService.js'; +import { ReactionService } from '@/core/ReactionService.js'; import { QueueLoggerService } from '../QueueLoggerService.js'; import type * as Bull from 'bullmq'; import type { DbUserDeleteJobData } from '../types.js'; @@ -32,6 +34,9 @@ export class DeleteAccountProcessorService { @Inject(DI.notesRepository) private notesRepository: NotesRepository, + @Inject(DI.noteReactionsRepository) + private noteReactionsRepository: NoteReactionsRepository, + @Inject(DI.driveFilesRepository) private driveFilesRepository: DriveFilesRepository, @@ -39,6 +44,7 @@ export class DeleteAccountProcessorService { private emailService: EmailService, private queueLoggerService: QueueLoggerService, private searchService: SearchService, + private reactionService: ReactionService, ) { this.logger = this.queueLoggerService.logger.createSubLogger('delete-account'); } @@ -83,6 +89,37 @@ export class DeleteAccountProcessorService { this.logger.succ('All of notes deleted'); } + { // Delete reactions + let cursor: MiNoteReaction['id'] | null = null; + + while (true) { + const reactions = await this.noteReactionsRepository.find({ + where: { + userId: user.id, + ...(cursor ? { id: MoreThan(cursor) } : {}), + }, + take: 100, + order: { + id: 1, + }, + }) as MiNoteReaction[]; + + if (reactions.length === 0) { + break; + } + + cursor = reactions.at(-1)?.id ?? null; + + for (const reaction of reactions) { + const note = await this.notesRepository.findOneBy({ id: reaction.noteId }) as MiNote; + + await this.reactionService.delete(user, note); + } + } + + this.logger.succ('All reactions have been deleted'); + } + { // Delete files let cursor: MiDriveFile['id'] | null = null; From 785e80fefdb4905db8d5f5adf12556e8f7387261 Mon Sep 17 00:00:00 2001 From: Marie Date: Sun, 5 Nov 2023 03:31:30 +0100 Subject: [PATCH 2/2] chore: remove `as type` --- .../src/queue/processors/DeleteAccountProcessorService.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/queue/processors/DeleteAccountProcessorService.ts b/packages/backend/src/queue/processors/DeleteAccountProcessorService.ts index 86c733f757..9ea00a8936 100644 --- a/packages/backend/src/queue/processors/DeleteAccountProcessorService.ts +++ b/packages/backend/src/queue/processors/DeleteAccountProcessorService.ts @@ -111,9 +111,9 @@ export class DeleteAccountProcessorService { cursor = reactions.at(-1)?.id ?? null; for (const reaction of reactions) { - const note = await this.notesRepository.findOneBy({ id: reaction.noteId }) as MiNote; + const note = await this.notesRepository.findOneBy({ id: reaction.noteId }); - await this.reactionService.delete(user, note); + if (note) await this.reactionService.delete(user, note); } }