From ada242fe62953af5007d394d95c49fd2ecda7937 Mon Sep 17 00:00:00 2001 From: kakkokari-gtyih <67428053+kakkokari-gtyih@users.noreply.github.com> Date: Sun, 28 Sep 2025 17:48:11 +0900 Subject: [PATCH 1/2] =?UTF-8?q?enhance:=20=E4=BA=88=E7=B4=84=E6=8A=95?= =?UTF-8?q?=E7=A8=BF=E6=A9=9F=E8=83=BD=E3=82=92=E5=88=A9=E7=94=A8=E3=81=97?= =?UTF-8?q?=E3=81=A6=E6=8A=95=E7=A8=BF=E3=81=95=E3=82=8C=E3=81=9F=E3=83=8E?= =?UTF-8?q?=E3=83=BC=E3=83=88=E3=81=AB=E3=83=95=E3=83=A9=E3=82=B0=E3=82=92?= =?UTF-8?q?=E3=81=A4=E3=81=91=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locales/index.d.ts | 4 ++++ locales/ja-JP.yml | 1 + .../migration/1759048540292-noteScheduled.js | 16 ++++++++++++++++ packages/backend/src/core/NoteCreateService.ts | 4 ++++ .../src/core/entities/NoteEntityService.ts | 1 + packages/backend/src/models/Note.ts | 6 ++++++ packages/backend/src/models/json-schema/note.ts | 4 ++++ .../PostScheduledNoteProcessorService.ts | 1 + .../frontend/src/components/MkNoteDetailed.vue | 1 + .../frontend/src/components/MkNoteHeader.vue | 1 + packages/misskey-js/src/autogen/types.ts | 1 + 11 files changed, 40 insertions(+) create mode 100644 packages/backend/migration/1759048540292-noteScheduled.js diff --git a/locales/index.d.ts b/locales/index.d.ts index fbe8c30c94..8efaf87658 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -5286,6 +5286,10 @@ export interface Locale extends ILocale { * 下書き */ "draft": string; + /** + * 予約投稿 + */ + "scheduledNote": string; /** * 下書きと予約投稿 */ diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index d21df5d5e1..c58fabd78c 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1317,6 +1317,7 @@ acknowledgeNotesAndEnable: "注意事項を理解した上でオンにします federationSpecified: "このサーバーはホワイトリスト連合で運用されています。管理者が指定したサーバー以外とやり取りすることはできません。" federationDisabled: "このサーバーは連合が無効化されています。他のサーバーのユーザーとやり取りすることはできません。" draft: "下書き" +scheduledNote: "予約投稿" draftsAndScheduledNotes: "下書きと予約投稿" confirmOnReact: "リアクションする際に確認する" reactAreYouSure: "\" {emoji} \" をリアクションしますか?" diff --git a/packages/backend/migration/1759048540292-noteScheduled.js b/packages/backend/migration/1759048540292-noteScheduled.js new file mode 100644 index 0000000000..05a79cbae9 --- /dev/null +++ b/packages/backend/migration/1759048540292-noteScheduled.js @@ -0,0 +1,16 @@ +/* + * SPDX-FileCopyrightText: syuilo and misskey-project + * SPDX-License-Identifier: AGPL-3.0-only + */ + +export class NoteScheduled1759048540292 { + name = 'NoteScheduled1759048540292' + + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "note" ADD "scheduled" boolean NOT NULL DEFAULT false`); + } + + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "note" DROP COLUMN "scheduled"`); + } +} diff --git a/packages/backend/src/core/NoteCreateService.ts b/packages/backend/src/core/NoteCreateService.ts index b6acf4c5fb..2c14619bb8 100644 --- a/packages/backend/src/core/NoteCreateService.ts +++ b/packages/backend/src/core/NoteCreateService.ts @@ -137,6 +137,7 @@ type Option = { visibility?: string; visibleUsers?: MinimumUser[] | null; channel?: MiChannel | null; + scheduled?: boolean; apMentions?: MinimumUser[] | null; apHashtags?: string[] | null; apEmojis?: string[] | null; @@ -248,6 +249,7 @@ export class NoteCreateService implements OnApplicationShutdown { localOnly: boolean; reactionAcceptance: MiNote['reactionAcceptance']; poll: IPoll | null; + scheduled?: boolean; apMentions?: MinimumUser[] | null; apHashtags?: string[] | null; apEmojis?: string[] | null; @@ -383,6 +385,7 @@ export class NoteCreateService implements OnApplicationShutdown { visibility: data.visibility, visibleUsers, channel, + scheduled: data.scheduled, apMentions: data.apMentions, apHashtags: data.apHashtags, apEmojis: data.apEmojis, @@ -596,6 +599,7 @@ export class NoteCreateService implements OnApplicationShutdown { ? data.visibleUsers.map(u => u.id) : [] : [], + scheduled: data.scheduled, attachedFileTypes: data.files ? data.files.map(file => file.type) : [], diff --git a/packages/backend/src/core/entities/NoteEntityService.ts b/packages/backend/src/core/entities/NoteEntityService.ts index 6871ba2c72..ee3f349460 100644 --- a/packages/backend/src/core/entities/NoteEntityService.ts +++ b/packages/backend/src/core/entities/NoteEntityService.ts @@ -441,6 +441,7 @@ export class NoteEntityService implements OnModuleInit { } : undefined, mentions: note.mentions.length > 0 ? note.mentions : undefined, hasPoll: note.hasPoll || undefined, + scheduled: note.scheduled || undefined, uri: note.uri ?? undefined, url: note.url ?? undefined, diff --git a/packages/backend/src/models/Note.ts b/packages/backend/src/models/Note.ts index 26d5c1d535..caf7604600 100644 --- a/packages/backend/src/models/Note.ts +++ b/packages/backend/src/models/Note.ts @@ -200,6 +200,12 @@ export class MiNote { }) public hasPoll: boolean; + /** Misskeyの予約投稿経由で投稿されたかどうか */ + @Column('boolean', { + default: false, + }) + public scheduled: boolean; + @Index() @Column({ ...id(), diff --git a/packages/backend/src/models/json-schema/note.ts b/packages/backend/src/models/json-schema/note.ts index f3901691a4..14baf8e8c9 100644 --- a/packages/backend/src/models/json-schema/note.ts +++ b/packages/backend/src/models/json-schema/note.ts @@ -260,6 +260,10 @@ export const packedNoteSchema = { type: 'boolean', optional: true, nullable: false, }, + scheduled: { + type: 'boolean', + optional: true, nullable: false, + }, myReaction: { type: 'string', diff --git a/packages/backend/src/queue/processors/PostScheduledNoteProcessorService.ts b/packages/backend/src/queue/processors/PostScheduledNoteProcessorService.ts index d0eaeee090..9e5dbde256 100644 --- a/packages/backend/src/queue/processors/PostScheduledNoteProcessorService.ts +++ b/packages/backend/src/queue/processors/PostScheduledNoteProcessorService.ts @@ -54,6 +54,7 @@ export class PostScheduledNoteProcessorService { visibility: draft.visibility, visibleUserIds: draft.visibleUserIds, channelId: draft.channelId, + scheduled: true, }); // await不要 diff --git a/packages/frontend/src/components/MkNoteDetailed.vue b/packages/frontend/src/components/MkNoteDetailed.vue index 48fd9908bd..af935e189f 100644 --- a/packages/frontend/src/components/MkNoteDetailed.vue +++ b/packages/frontend/src/components/MkNoteDetailed.vue @@ -59,6 +59,7 @@ SPDX-License-Identifier: AGPL-3.0-only +