summaryrefslogtreecommitdiff
path: root/packages/backend/src/models
diff options
context:
space:
mode:
authorNoriDev <m1nthing2322@gmail.com>2024-10-31 13:52:01 +0900
committerMarie <github@yuugi.dev>2024-12-09 05:31:03 +0100
commit2528508cff9d8c90abd33e46b15220a49a00e2e2 (patch)
tree1a7aa5717656fc29e67eed0f86feb5fec33d8f1e /packages/backend/src/models
parentmerge: Implement new SkRateLimiterServer with Leaky Bucket rate limits (resol... (diff)
downloadsharkey-2528508cff9d8c90abd33e46b15220a49a00e2e2.tar.gz
sharkey-2528508cff9d8c90abd33e46b15220a49a00e2e2.tar.bz2
sharkey-2528508cff9d8c90abd33e46b15220a49a00e2e2.zip
feat: 노트 게시를 예약할 수 있음 (yojo-art/cherrypick#483, [Type4ny-Project/Type4ny@271c872c](https://github.com/Type4ny-Project/Type4ny/commit/271c872c97f215ef5d8e0be62251dd422a52e5b1))
Diffstat (limited to 'packages/backend/src/models')
-rw-r--r--packages/backend/src/models/NoteSchedule.ts60
-rw-r--r--packages/backend/src/models/RepositoryModule.ts9
-rw-r--r--packages/backend/src/models/_.ts3
-rw-r--r--packages/backend/src/models/json-schema/role.ts4
4 files changed, 76 insertions, 0 deletions
diff --git a/packages/backend/src/models/NoteSchedule.ts b/packages/backend/src/models/NoteSchedule.ts
new file mode 100644
index 0000000000..97ffe32ffa
--- /dev/null
+++ b/packages/backend/src/models/NoteSchedule.ts
@@ -0,0 +1,60 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and other misskey contributors
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import { Entity, Index, Column, PrimaryColumn } from 'typeorm';
+import { MiNote } from '@/models/Note.js';
+import { id } from './util/id.js';
+import { MiUser } from './User.js';
+import { MiChannel } from './Channel.js';
+import type { MiDriveFile } from './DriveFile.js';
+
+type MinimumUser = {
+ id: MiUser['id'];
+ host: MiUser['host'];
+ username: MiUser['username'];
+ uri: MiUser['uri'];
+};
+
+export type MiScheduleNoteType={
+ /** Date.toISOString() */
+ createdAt: string;
+ visibility: 'public' | 'home' | 'followers' | 'specified';
+ visibleUsers: MinimumUser[];
+ channel?: MiChannel['id'];
+ poll: {
+ multiple: boolean;
+ choices: string[];
+ /** Date.toISOString() */
+ expiresAt: string | null
+ } | undefined;
+ renote?: MiNote['id'];
+ localOnly: boolean;
+ cw?: string | null;
+ reactionAcceptance: 'likeOnly' | 'likeOnlyForRemote' | 'nonSensitiveOnly' | 'nonSensitiveOnlyForLocalLikeOnlyForRemote' | null;
+ files: MiDriveFile['id'][];
+ text?: string | null;
+ reply?: MiNote['id'];
+ apMentions?: MinimumUser[] | null;
+ apHashtags?: string[] | null;
+ apEmojis?: string[] | null;
+}
+
+@Entity('note_schedule')
+export class MiNoteSchedule {
+ @PrimaryColumn(id())
+ public id: string;
+
+ @Column('jsonb')
+ public note: MiScheduleNoteType;
+
+ @Index()
+ @Column('varchar', {
+ length: 260,
+ })
+ public userId: MiUser['id'];
+
+ @Column('timestamp with time zone')
+ public scheduledAt: Date;
+}
diff --git a/packages/backend/src/models/RepositoryModule.ts b/packages/backend/src/models/RepositoryModule.ts
index eb45b9a631..3a1158a42a 100644
--- a/packages/backend/src/models/RepositoryModule.ts
+++ b/packages/backend/src/models/RepositoryModule.ts
@@ -43,6 +43,7 @@ import {
MiNote,
MiNoteFavorite,
MiNoteReaction,
+ MiNoteSchedule,
MiNoteThreadMuting,
MiNoteUnread,
MiPage,
@@ -509,6 +510,12 @@ const $reversiGamesRepository: Provider = {
inject: [DI.db],
};
+const $noteScheduleRepository: Provider = {
+ provide: DI.noteScheduleRepository,
+ useFactory: (db: DataSource) => db.getRepository(MiNoteSchedule).extend(miRepository as MiRepository<MiNoteSchedule>),
+ inject: [DI.db],
+};
+
@Module({
imports: [],
providers: [
@@ -583,6 +590,7 @@ const $reversiGamesRepository: Provider = {
$noteEditRepository,
$bubbleGameRecordsRepository,
$reversiGamesRepository,
+ $noteScheduleRepository,
],
exports: [
$usersRepository,
@@ -656,6 +664,7 @@ const $reversiGamesRepository: Provider = {
$noteEditRepository,
$bubbleGameRecordsRepository,
$reversiGamesRepository,
+ $noteScheduleRepository,
],
})
export class RepositoryModule {
diff --git a/packages/backend/src/models/_.ts b/packages/backend/src/models/_.ts
index ac2dd62aa2..9a4ebfc90f 100644
--- a/packages/backend/src/models/_.ts
+++ b/packages/backend/src/models/_.ts
@@ -81,6 +81,7 @@ import { MiUserListFavorite } from '@/models/UserListFavorite.js';
import { NoteEdit } from '@/models/NoteEdit.js';
import { MiBubbleGameRecord } from '@/models/BubbleGameRecord.js';
import { MiReversiGame } from '@/models/ReversiGame.js';
+import { MiNoteSchedule } from '@/models/NoteSchedule.js';
import type { QueryDeepPartialEntity } from 'typeorm/query-builder/QueryPartialEntity.js';
export interface MiRepository<T extends ObjectLiteral> {
@@ -160,6 +161,7 @@ export {
MiNote,
MiNoteFavorite,
MiNoteReaction,
+ MiNoteSchedule,
MiNoteThreadMuting,
MiNoteUnread,
MiPage,
@@ -271,3 +273,4 @@ export type UserMemoRepository = Repository<MiUserMemo> & MiRepository<MiUserMem
export type BubbleGameRecordsRepository = Repository<MiBubbleGameRecord> & MiRepository<MiBubbleGameRecord>;
export type ReversiGamesRepository = Repository<MiReversiGame> & MiRepository<MiReversiGame>;
export type NoteEditRepository = Repository<NoteEdit> & MiRepository<NoteEdit>;
+export type NoteScheduleRepository = Repository<MiNoteSchedule>;
diff --git a/packages/backend/src/models/json-schema/role.ts b/packages/backend/src/models/json-schema/role.ts
index 19ea6263c9..ef0bb9f141 100644
--- a/packages/backend/src/models/json-schema/role.ts
+++ b/packages/backend/src/models/json-schema/role.ts
@@ -296,6 +296,10 @@ export const packedRolePoliciesSchema = {
type: 'boolean',
optional: false, nullable: false,
},
+ scheduleNoteMax: {
+ type: 'integer',
+ optional: false, nullable: false,
+ },
},
} as const;