From 5eb873ff91c78112f0023ec9d909f2f2fa04aa45 Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Thu, 29 Jan 2026 11:21:12 +0900 Subject: [PATCH] wip --- packages/backend/src/di-symbols.ts | 1 + packages/backend/src/models/NoteSpReaction.ts | 50 +++++++++++++++++++ .../backend/src/models/RepositoryModule.ts | 9 ++++ packages/backend/src/models/_.ts | 5 +- packages/backend/src/postgres.ts | 2 + 5 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 packages/backend/src/models/NoteSpReaction.ts diff --git a/packages/backend/src/di-symbols.ts b/packages/backend/src/di-symbols.ts index b9ca76233c..b8a5dd2850 100644 --- a/packages/backend/src/di-symbols.ts +++ b/packages/backend/src/di-symbols.ts @@ -24,6 +24,7 @@ export const DI = { noteFavoritesRepository: Symbol('noteFavoritesRepository'), noteThreadMutingsRepository: Symbol('noteThreadMutingsRepository'), noteReactionsRepository: Symbol('noteReactionsRepository'), + noteSpReactionsRepository: Symbol('noteSpReactionsRepository'), pollsRepository: Symbol('pollsRepository'), pollVotesRepository: Symbol('pollVotesRepository'), userProfilesRepository: Symbol('userProfilesRepository'), diff --git a/packages/backend/src/models/NoteSpReaction.ts b/packages/backend/src/models/NoteSpReaction.ts new file mode 100644 index 0000000000..da9a5fd91b --- /dev/null +++ b/packages/backend/src/models/NoteSpReaction.ts @@ -0,0 +1,50 @@ +/* + * SPDX-FileCopyrightText: syuilo and misskey-project + * SPDX-License-Identifier: AGPL-3.0-only + */ + +import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm'; +import { id } from './util/id.js'; +import { MiUser } from './User.js'; +import { MiNote } from './Note.js'; + +@Entity('note_sp_reaction') +@Index(['userId', 'noteId'], { unique: true }) +export class MiNoteSpReaction { + @PrimaryColumn(id()) + public id: string; + + @Index() + @Column(id()) + public userId: MiUser['id']; + + @ManyToOne(() => MiUser, { + onDelete: 'CASCADE', + }) + @JoinColumn() + public user?: MiUser | null; + + @Index() + @Column(id()) + public noteId: MiNote['id']; + + @ManyToOne(() => MiNote, { + onDelete: 'CASCADE', + }) + @JoinColumn() + public note?: MiNote | null; + + @Column('varchar', { + length: 260, + }) + public reaction: string; + + //#region Denormalized fields + @Index() + @Column({ + ...id(), + comment: '[Denormalized]', + }) + public noteUserId: MiUser['id']; + //#endregion +} diff --git a/packages/backend/src/models/RepositoryModule.ts b/packages/backend/src/models/RepositoryModule.ts index e3db6f8838..38cd507402 100644 --- a/packages/backend/src/models/RepositoryModule.ts +++ b/packages/backend/src/models/RepositoryModule.ts @@ -42,6 +42,7 @@ import { MiNote, MiNoteFavorite, MiNoteReaction, + MiNoteSpReaction, MiNoteThreadMuting, MiNoteDraft, MiPage, @@ -142,6 +143,12 @@ const $noteReactionsRepository: Provider = { inject: [DI.db], }; +const $noteSpReactionsRepository: Provider = { + provide: DI.noteSpReactionsRepository, + useFactory: (db: DataSource) => db.getRepository(MiNoteSpReaction).extend(miRepository as MiRepository), + inject: [DI.db], +}; + const $noteDraftsRepository: Provider = { provide: DI.noteDraftsRepository, useFactory: (db: DataSource) => db.getRepository(MiNoteDraft).extend(miRepository as MiRepository), @@ -556,6 +563,7 @@ const $reversiGamesRepository: Provider = { $noteFavoritesRepository, $noteThreadMutingsRepository, $noteReactionsRepository, + $noteSpReactionsRepository, $noteDraftsRepository, $pollsRepository, $pollVotesRepository, @@ -634,6 +642,7 @@ const $reversiGamesRepository: Provider = { $noteFavoritesRepository, $noteThreadMutingsRepository, $noteReactionsRepository, + $noteSpReactionsRepository, $noteDraftsRepository, $pollsRepository, $pollVotesRepository, diff --git a/packages/backend/src/models/_.ts b/packages/backend/src/models/_.ts index c4528e3a77..a8fa0896a2 100644 --- a/packages/backend/src/models/_.ts +++ b/packages/backend/src/models/_.ts @@ -23,7 +23,7 @@ import { MiBubbleGameRecord } from '@/models/BubbleGameRecord.js'; import { MiChannel } from '@/models/Channel.js'; import { MiChannelFavorite } from '@/models/ChannelFavorite.js'; import { MiChannelFollowing } from '@/models/ChannelFollowing.js'; -import { MiChannelMuting } from "@/models/ChannelMuting.js"; +import { MiChannelMuting } from '@/models/ChannelMuting.js'; import { MiChatApproval } from '@/models/ChatApproval.js'; import { MiChatMessage } from '@/models/ChatMessage.js'; import { MiChatRoom } from '@/models/ChatRoom.js'; @@ -50,6 +50,7 @@ import { MiNote } from '@/models/Note.js'; import { MiNoteDraft } from '@/models/NoteDraft.js'; import { MiNoteFavorite } from '@/models/NoteFavorite.js'; import { MiNoteReaction } from '@/models/NoteReaction.js'; +import { MiNoteSpReaction } from '@/models/NoteSpReaction.js'; import { MiNoteThreadMuting } from '@/models/NoteThreadMuting.js'; import { MiPage } from '@/models/Page.js'; import { MiPageLike } from '@/models/PageLike.js'; @@ -131,6 +132,7 @@ export { MiNoteDraft, MiNoteFavorite, MiNoteReaction, + MiNoteSpReaction, MiNoteThreadMuting, MiPage, MiPageLike, @@ -211,6 +213,7 @@ export type NotesRepository = Repository & MiRepository; export type NoteDraftsRepository = Repository & MiRepository; export type NoteFavoritesRepository = Repository & MiRepository; export type NoteReactionsRepository = Repository & MiRepository; +export type NoteSpReactionsRepository = Repository & MiRepository; export type NoteThreadMutingsRepository = Repository & MiRepository; export type PagesRepository = Repository & MiRepository; export type PageLikesRepository = Repository & MiRepository; diff --git a/packages/backend/src/postgres.ts b/packages/backend/src/postgres.ts index 3dcd3f0965..4654f3a78e 100644 --- a/packages/backend/src/postgres.ts +++ b/packages/backend/src/postgres.ts @@ -44,6 +44,7 @@ import { MiRenoteMuting } from '@/models/RenoteMuting.js'; import { MiNote } from '@/models/Note.js'; import { MiNoteFavorite } from '@/models/NoteFavorite.js'; import { MiNoteReaction } from '@/models/NoteReaction.js'; +import { MiNoteSpReaction } from '@/models/NoteSpReaction.js'; import { MiNoteThreadMuting } from '@/models/NoteThreadMuting.js'; import { MiNoteDraft } from '@/models/NoteDraft.js'; import { MiPage } from '@/models/Page.js'; @@ -204,6 +205,7 @@ export const entities = [ MiNote, MiNoteFavorite, MiNoteReaction, + MiNoteSpReaction, MiNoteThreadMuting, MiNoteDraft, MiPage,