diff options
| author | anatawa12 <anatawa12@icloud.com> | 2025-08-15 22:39:55 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-08-15 22:39:55 +0900 |
| commit | 60f7278aff27b9a0e03c1f1a2a77663cfb0e0ddb (patch) | |
| tree | 76d9f4e99144879566c5d39da7de7bd7f11a7668 /packages/backend/src/queue/processors | |
| parent | enhance(frontend): improve enableInfiniteScroll stability (diff) | |
| download | misskey-60f7278aff27b9a0e03c1f1a2a77663cfb0e0ddb.tar.gz misskey-60f7278aff27b9a0e03c1f1a2a77663cfb0e0ddb.tar.bz2 misskey-60f7278aff27b9a0e03c1f1a2a77663cfb0e0ddb.zip | |
fix: Remote Note Cleaning will delete notes embedded in a page (#16408)
* feat: preserve number of pages referencing the note
* chore: delete pages on account delete
* fix: notes on the pages are removed by CleanRemoteNotes
* test: add the simplest test for page embedded notes
* fix: section block is not considered
* fix: section block is not considered in migration
* chore: remove comments from columns
* revert unnecessary change
* add pageCount to webhook test
* fix type error on backend
Diffstat (limited to 'packages/backend/src/queue/processors')
| -rw-r--r-- | packages/backend/src/queue/processors/CleanRemoteNotesProcessorService.ts | 1 | ||||
| -rw-r--r-- | packages/backend/src/queue/processors/DeleteAccountProcessorService.ts | 29 |
2 files changed, 29 insertions, 1 deletions
diff --git a/packages/backend/src/queue/processors/CleanRemoteNotesProcessorService.ts b/packages/backend/src/queue/processors/CleanRemoteNotesProcessorService.ts index 77a9dc5557..f53d403280 100644 --- a/packages/backend/src/queue/processors/CleanRemoteNotesProcessorService.ts +++ b/packages/backend/src/queue/processors/CleanRemoteNotesProcessorService.ts @@ -82,6 +82,7 @@ export class CleanRemoteNotesProcessorService { const removalCriteria = [ 'note."id" < :newestLimit', 'note."clippedCount" = 0', + 'note."pageCount" = 0', 'note."userHost" IS NOT NULL', 'NOT EXISTS (SELECT 1 FROM user_note_pining WHERE "noteId" = note."id")', 'NOT EXISTS (SELECT 1 FROM note_favorite WHERE "noteId" = note."id")', diff --git a/packages/backend/src/queue/processors/DeleteAccountProcessorService.ts b/packages/backend/src/queue/processors/DeleteAccountProcessorService.ts index 14a53e0c42..b643c2a6d0 100644 --- a/packages/backend/src/queue/processors/DeleteAccountProcessorService.ts +++ b/packages/backend/src/queue/processors/DeleteAccountProcessorService.ts @@ -6,7 +6,7 @@ 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, NotesRepository, PagesRepository, UserProfilesRepository, UsersRepository } from '@/models/_.js'; import type Logger from '@/logger.js'; import { DriveService } from '@/core/DriveService.js'; import type { MiDriveFile } from '@/models/DriveFile.js'; @@ -14,6 +14,7 @@ import type { MiNote } from '@/models/Note.js'; import { EmailService } from '@/core/EmailService.js'; import { bindThis } from '@/decorators.js'; import { SearchService } from '@/core/SearchService.js'; +import { PageService } from '@/core/PageService.js'; import { QueueLoggerService } from '../QueueLoggerService.js'; import type * as Bull from 'bullmq'; import type { DbUserDeleteJobData } from '../types.js'; @@ -35,7 +36,11 @@ export class DeleteAccountProcessorService { @Inject(DI.driveFilesRepository) private driveFilesRepository: DriveFilesRepository, + @Inject(DI.pagesRepository) + private pagesRepository: PagesRepository, + private driveService: DriveService, + private pageService: PageService, private emailService: EmailService, private queueLoggerService: QueueLoggerService, private searchService: SearchService, @@ -112,6 +117,28 @@ export class DeleteAccountProcessorService { this.logger.succ('All of files deleted'); } + { + // delete pages. Necessary for decrementing pageCount of notes. + while (true) { + const pages = await this.pagesRepository.find({ + where: { + userId: user.id, + }, + take: 100, + order: { + id: 1, + }, + }); + + if (pages.length === 0) { + break; + } + for (const page of pages) { + await this.pageService.delete(user, page.id); + } + } + } + { // Send email notification const profile = await this.userProfilesRepository.findOneByOrFail({ userId: user.id }); if (profile.email && profile.emailVerified) { |