From b9c1f9a861a2cc799b364270aab1044f47ef5dc3 Mon Sep 17 00:00:00 2001 From: GrapeApple0 <84321396+GrapeApple0@users.noreply.github.com> Date: Fri, 14 Jun 2024 01:59:16 +0000 Subject: [PATCH] =?UTF-8?q?wip:=20=E7=B7=A8=E9=9B=86=E5=B1=A5=E6=AD=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../migration/1718271407902-noteEdit.js | 8 +++++++- packages/backend/src/core/NoteEditService.ts | 20 +++++++++++++++++-- packages/backend/src/di-symbols.ts | 1 + packages/backend/src/models/NoteHistory.ts | 13 +++--------- packages/backend/src/models/_.ts | 3 +++ 5 files changed, 32 insertions(+), 13 deletions(-) diff --git a/packages/backend/migration/1718271407902-noteEdit.js b/packages/backend/migration/1718271407902-noteEdit.js index 4016f82b13..bf3155ee0b 100644 --- a/packages/backend/migration/1718271407902-noteEdit.js +++ b/packages/backend/migration/1718271407902-noteEdit.js @@ -9,10 +9,16 @@ export class NoteEdit1718271407902 { async up(queryRunner) { await queryRunner.query(`ALTER TABLE "note" ADD "updatedAt" TIMESTAMP WITH TIME ZONE`); await queryRunner.query(`COMMENT ON COLUMN "note"."updatedAt" IS 'The updated date of the Note.'`); - } + await queryRunner.query(`CREATE TABLE "note_history" ("id" character varying(32) NOT NULL, "targetId" character varying(32), "text" text, "name" character varying(256), "cw" character varying(512), "fileIds" character varying(32) array NOT NULL DEFAULT '{}'::varchar[], "attachedFileTypes" character varying(256) array NOT NULL DEFAULT '{}'::varchar[], "mentions" character varying(32) array NOT NULL DEFAULT '{}'::varchar[], "mentionedRemoteUsers" text NOT NULL DEFAULT '[]', "emojis" character varying(128) array NOT NULL DEFAULT '{}'::varchar[], "tags" character varying(128) array NOT NULL DEFAULT '{}'::varchar[], "hasPoll" boolean NOT NULL DEFAULT false, CONSTRAINT "PK_96d34172acfba2f6b1bc2ed43058" PRIMARY KEY ("id"))`); + await queryRunner.query(`CREATE INDEX "IDX_f23ad074619d2afe0f69da9a95" ON "note_history" ("targetId") `); + await queryRunner.query(`ALTER TABLE "note_history" ADD CONSTRAINT "FK_aacf2074601e204e0f69da9a954" FOREIGN KEY ("targetId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`); + } async down(queryRunner) { await queryRunner.query(`COMMENT ON COLUMN "note"."updatedAt" IS 'The updated date of the Note.'`); await queryRunner.query(`ALTER TABLE "note" DROP COLUMN "updatedAt"`); + await queryRunner.query(`ALTER TABLE "note_history" DROP CONSTRAINT "FK_aacf2074601e204e0f69da9a954"`); + await queryRunner.query(`DROP INDEX "IDX_f23ad074619d2afe0f69da9a95"`); + await queryRunner.query(`DROP TABLE "note_history"`); } } diff --git a/packages/backend/src/core/NoteEditService.ts b/packages/backend/src/core/NoteEditService.ts index 01d50dc159..ecb17bcb17 100644 --- a/packages/backend/src/core/NoteEditService.ts +++ b/packages/backend/src/core/NoteEditService.ts @@ -12,7 +12,8 @@ import { extractCustomEmojisFromMfm } from '@/misc/extract-custom-emojis-from-mf import { extractHashtags } from '@/misc/extract-hashtags.js'; import type { IMentionedRemoteUsers } from '@/models/Note.js'; import { MiNote } from '@/models/Note.js'; -import type { ChannelsRepository, FollowingsRepository, InstancesRepository, MiFollowing, NotesRepository, UserProfilesRepository, UsersRepository, PollsRepository, DriveFilesRepository } from '@/models/_.js'; +import { MiNoteHistory } from '@/models/NoteHistory.js'; +import type { ChannelsRepository, FollowingsRepository, InstancesRepository, MiFollowing, NotesRepository, NoteHistoryRepository, UserProfilesRepository, UsersRepository, PollsRepository, DriveFilesRepository } from '@/models/_.js'; import type { MiDriveFile } from '@/models/DriveFile.js'; import { concat } from '@/misc/prelude/array.js'; import { IdService } from '@/core/IdService.js'; @@ -87,6 +88,9 @@ export class NoteEditService implements OnApplicationShutdown { @Inject(DI.notesRepository) private notesRepository: NotesRepository, + @Inject(DI.noteHistoryRepository) + private noteHistoryRepository: NoteHistoryRepository, + @Inject(DI.instancesRepository) private instancesRepository: InstancesRepository, @@ -306,7 +310,19 @@ export class NoteEditService implements OnApplicationShutdown { throw e; } - + this.noteHistoryRepository.insert(new MiNoteHistory({ + id: this.idService.gen(), + text: note.text, + cw: note.cw, + targetId: note.id, + fileIds: note.fileIds, + attachedFileTypes: note.attachedFileTypes, + mentions: note.mentions, + mentionedRemoteUsers: note.mentionedRemoteUsers, + emojis: note.emojis, + tags: note.tags, + hasPoll: note.hasPoll, + })); setImmediate('post updated', { signal: this.#shutdownController.signal }).then( async () => this.postNoteEdited((await this.notesRepository.findOneByOrFail({ id: note.id })), user, data, silent, tags!, mentionedUsers!), () => { /* aborted, ignore this */ }, diff --git a/packages/backend/src/di-symbols.ts b/packages/backend/src/di-symbols.ts index 271082b4ff..3ba59c3c00 100644 --- a/packages/backend/src/di-symbols.ts +++ b/packages/backend/src/di-symbols.ts @@ -19,6 +19,7 @@ export const DI = { announcementReadsRepository: Symbol('announcementReadsRepository'), appsRepository: Symbol('appsRepository'), avatarDecorationsRepository: Symbol('avatarDecorationsRepository'), + noteHistoryRepository: Symbol('noteHistoryRepository'), noteFavoritesRepository: Symbol('noteFavoritesRepository'), noteThreadMutingsRepository: Symbol('noteThreadMutingsRepository'), noteReactionsRepository: Symbol('noteReactionsRepository'), diff --git a/packages/backend/src/models/NoteHistory.ts b/packages/backend/src/models/NoteHistory.ts index 4e321142c8..36ea4635f4 100644 --- a/packages/backend/src/models/NoteHistory.ts +++ b/packages/backend/src/models/NoteHistory.ts @@ -9,23 +9,16 @@ import { MiUser } from './User.js'; import { MiNote } from './Note.js'; import type { MiDriveFile } from './DriveFile.js'; -@Entity('note') +@Entity('note_history') export class MiNoteHistory { @PrimaryColumn(id()) public id: string; - @Column('timestamp with time zone', { - nullable: true, - comment: 'The updated date of the Note.', - }) - public updatedAt: Date; - @Index() @Column({ ...id(), - nullable: true, }) - public targetId: MiNote['id'] | null; + public targetId: MiNote['id']; // TODO: varcharにしたい @Column('text', { @@ -78,7 +71,7 @@ export class MiNoteHistory { }) public hasPoll: boolean; - constructor(data: Partial) { + constructor(data: Partial) { if (data == null) return; for (const [k, v] of Object.entries(data)) { diff --git a/packages/backend/src/models/_.ts b/packages/backend/src/models/_.ts index d366ce48d0..a7adb7420d 100644 --- a/packages/backend/src/models/_.ts +++ b/packages/backend/src/models/_.ts @@ -40,6 +40,7 @@ import { MiModerationLog } from '@/models/ModerationLog.js'; import { MiMuting } from '@/models/Muting.js'; import { MiRenoteMuting } from '@/models/RenoteMuting.js'; import { MiNote } from '@/models/Note.js'; +import { MiNoteHistory } from '@/models/NoteHistory.js'; import { MiNoteFavorite } from '@/models/NoteFavorite.js'; import { MiNoteReaction } from '@/models/NoteReaction.js'; import { MiNoteThreadMuting } from '@/models/NoteThreadMuting.js'; @@ -175,6 +176,7 @@ export { MiMuting, MiRenoteMuting, MiNote, + MiNoteHistory, MiNoteFavorite, MiNoteReaction, MiNoteThreadMuting, @@ -246,6 +248,7 @@ export type ModerationLogsRepository = Repository & MiRepositor export type MutingsRepository = Repository & MiRepository; export type RenoteMutingsRepository = Repository & MiRepository; export type NotesRepository = Repository & MiRepository; +export type NoteHistoryRepository = Repository & MiRepository; export type NoteFavoritesRepository = Repository & MiRepository; export type NoteReactionsRepository = Repository & MiRepository; export type NoteThreadMutingsRepository = Repository & MiRepository;