From 82e8c5ff258092f9014200b1fe61b9c2f4e04438 Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Sat, 2 Aug 2025 22:47:07 +0900 Subject: [PATCH] chore: make DeletedNote hold replyUserId and renoteUserId --- .../backend/migration/1754137937997-DeletedNote.js | 2 +- packages/backend/src/core/NoteDeleteService.ts | 2 ++ packages/backend/src/models/DeletedNote.ts | 14 ++++++++++++++ .../processors/CleanRemoteNotesProcessorService.ts | 4 ++++ 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/packages/backend/migration/1754137937997-DeletedNote.js b/packages/backend/migration/1754137937997-DeletedNote.js index 107458c665..9d8e486e1b 100644 --- a/packages/backend/migration/1754137937997-DeletedNote.js +++ b/packages/backend/migration/1754137937997-DeletedNote.js @@ -7,7 +7,7 @@ export class DeletedNote1754137937997 { name = 'DeletedNote1754137937997' async up(queryRunner) { - await queryRunner.query(`CREATE TABLE "deleted_note" ("id" character varying(32) NOT NULL, "deletedAt" TIMESTAMP WITH TIME ZONE, "replyId" character varying(32), "renoteId" character varying(32), "userId" character varying(32) NOT NULL, "localOnly" boolean NOT NULL DEFAULT false, "uri" character varying(512), "url" character varying(512), "channelId" character varying(32), CONSTRAINT "PK_1cb67148b7b707a03c63b2165fc" PRIMARY KEY ("id")); COMMENT ON COLUMN "deleted_note"."replyId" IS 'The ID of reply target.'; COMMENT ON COLUMN "deleted_note"."renoteId" IS 'The ID of renote target.'; COMMENT ON COLUMN "deleted_note"."userId" IS 'The ID of author.'; COMMENT ON COLUMN "deleted_note"."uri" IS 'The URI of a note. it will be null when the note is local.'; COMMENT ON COLUMN "deleted_note"."url" IS 'The human readable url of a note. it will be null when the note is local.'; COMMENT ON COLUMN "deleted_note"."channelId" IS 'The ID of source channel.'`); + await queryRunner.query(`CREATE TABLE "deleted_note" ("id" character varying(32) NOT NULL, "deletedAt" TIMESTAMP WITH TIME ZONE, "replyId" character varying(32), "renoteId" character varying(32), "userId" character varying(32) NOT NULL, "localOnly" boolean NOT NULL DEFAULT false, "uri" character varying(512), "url" character varying(512), "channelId" character varying(32), "replyUserId" character varying(32), "renoteUserId" character varying(32), CONSTRAINT "PK_1cb67148b7b707a03c63b2165fc" PRIMARY KEY ("id")); COMMENT ON COLUMN "deleted_note"."replyId" IS 'The ID of reply target.'; COMMENT ON COLUMN "deleted_note"."renoteId" IS 'The ID of renote target.'; COMMENT ON COLUMN "deleted_note"."userId" IS 'The ID of author.'; COMMENT ON COLUMN "deleted_note"."uri" IS 'The URI of a note. it will be null when the note is local.'; COMMENT ON COLUMN "deleted_note"."url" IS 'The human readable url of a note. it will be null when the note is local.'; COMMENT ON COLUMN "deleted_note"."channelId" IS 'The ID of source channel.'; COMMENT ON COLUMN "deleted_note"."replyUserId" IS '[Denormalized]'; COMMENT ON COLUMN "deleted_note"."renoteUserId" IS '[Denormalized]'`); await queryRunner.query(`CREATE INDEX "IDX_12797cfa4c15d03d0dd649bc4b" ON "deleted_note" ("replyId") `); await queryRunner.query(`CREATE INDEX "IDX_b6a4a8f31a98ddc5e07995c840" ON "deleted_note" ("renoteId") `); await queryRunner.query(`CREATE UNIQUE INDEX "IDX_95c76b088692f600b7a5352a4b" ON "deleted_note" ("uri") `); diff --git a/packages/backend/src/core/NoteDeleteService.ts b/packages/backend/src/core/NoteDeleteService.ts index 7003f171e5..b213a3c4e1 100644 --- a/packages/backend/src/core/NoteDeleteService.ts +++ b/packages/backend/src/core/NoteDeleteService.ts @@ -130,6 +130,8 @@ export class NoteDeleteService { uri: note.uri, url: note.url, channelId: note.channelId, + replyUserId: note.replyUserId, + renoteUserId: note.renoteUserId, }); }); diff --git a/packages/backend/src/models/DeletedNote.ts b/packages/backend/src/models/DeletedNote.ts index fad5ef783d..e281741ead 100644 --- a/packages/backend/src/models/DeletedNote.ts +++ b/packages/backend/src/models/DeletedNote.ts @@ -99,6 +99,20 @@ export class MiDeletedNote { }) public channelId: MiChannel['id'] | null; + @Column({ + ...id(), + nullable: true, + comment: '[Denormalized]', + }) + public replyUserId: MiUser['id'] | null; + + @Column({ + ...id(), + nullable: true, + comment: '[Denormalized]', + }) + public renoteUserId: MiUser['id'] | null; + @ManyToOne(type => MiChannel, { onDelete: 'CASCADE', }) diff --git a/packages/backend/src/queue/processors/CleanRemoteNotesProcessorService.ts b/packages/backend/src/queue/processors/CleanRemoteNotesProcessorService.ts index 122aee3af5..9436b1a1ca 100644 --- a/packages/backend/src/queue/processors/CleanRemoteNotesProcessorService.ts +++ b/packages/backend/src/queue/processors/CleanRemoteNotesProcessorService.ts @@ -86,6 +86,8 @@ export class CleanRemoteNotesProcessorService { 'uri', 'url', 'channelId', + 'replyUserId', + 'renoteUserId', ] as const]; let notes: Pick[] = await this.notesRepository.find({ where: { @@ -156,6 +158,8 @@ export class CleanRemoteNotesProcessorService { localOnly: note.localOnly, uri: note.uri, url: note.url, + replyUserId: note.replyUserId, + renoteUserId: note.renoteUserId, }))); await transaction.delete(MiNote, notes.map(note => note.id)); });