summaryrefslogtreecommitdiff
path: root/packages/backend/src/models
diff options
context:
space:
mode:
Diffstat (limited to 'packages/backend/src/models')
-rw-r--r--packages/backend/src/models/entities/abuse-user-report.ts5
-rw-r--r--packages/backend/src/models/entities/drive-file.ts5
-rw-r--r--packages/backend/src/models/entities/emoji.ts8
-rw-r--r--packages/backend/src/models/entities/games/reversi/game.ts133
-rw-r--r--packages/backend/src/models/entities/games/reversi/matching.ts35
-rw-r--r--packages/backend/src/models/entities/user-profile.ts1
-rw-r--r--packages/backend/src/models/index.ts4
-rw-r--r--packages/backend/src/models/repositories/abuse-user-report.ts1
-rw-r--r--packages/backend/src/models/repositories/antenna.ts91
-rw-r--r--packages/backend/src/models/repositories/app.ts35
-rw-r--r--packages/backend/src/models/repositories/blocking.ts28
-rw-r--r--packages/backend/src/models/repositories/channel.ts53
-rw-r--r--packages/backend/src/models/repositories/clip.ts39
-rw-r--r--packages/backend/src/models/repositories/drive-file.ts113
-rw-r--r--packages/backend/src/models/repositories/drive-folder.ts41
-rw-r--r--packages/backend/src/models/repositories/emoji.ts41
-rw-r--r--packages/backend/src/models/repositories/federation-instance.ts104
-rw-r--r--packages/backend/src/models/repositories/following.ts38
-rw-r--r--packages/backend/src/models/repositories/gallery-post.ts71
-rw-r--r--packages/backend/src/models/repositories/games/reversi/game.ts191
-rw-r--r--packages/backend/src/models/repositories/games/reversi/matching.ts69
-rw-r--r--packages/backend/src/models/repositories/hashtag.ts36
-rw-r--r--packages/backend/src/models/repositories/messaging-message.ts75
-rw-r--r--packages/backend/src/models/repositories/muting.ts28
-rw-r--r--packages/backend/src/models/repositories/note-favorite.ts28
-rw-r--r--packages/backend/src/models/repositories/note-reaction.ts27
-rw-r--r--packages/backend/src/models/repositories/note.ts187
-rw-r--r--packages/backend/src/models/repositories/notification.ts66
-rw-r--r--packages/backend/src/models/repositories/page.ts53
-rw-r--r--packages/backend/src/models/repositories/queue.ts30
-rw-r--r--packages/backend/src/models/repositories/user-group.ts36
-rw-r--r--packages/backend/src/models/repositories/user-list.ts31
-rw-r--r--packages/backend/src/models/repositories/user.ts350
-rw-r--r--packages/backend/src/models/schema/antenna.ts89
-rw-r--r--packages/backend/src/models/schema/app.ts33
-rw-r--r--packages/backend/src/models/schema/blocking.ts26
-rw-r--r--packages/backend/src/models/schema/channel.ts51
-rw-r--r--packages/backend/src/models/schema/clip.ts38
-rw-r--r--packages/backend/src/models/schema/drive-file.ts107
-rw-r--r--packages/backend/src/models/schema/drive-folder.ts39
-rw-r--r--packages/backend/src/models/schema/emoji.ts36
-rw-r--r--packages/backend/src/models/schema/federation-instance.ts105
-rw-r--r--packages/backend/src/models/schema/following.ts36
-rw-r--r--packages/backend/src/models/schema/gallery-post.ts69
-rw-r--r--packages/backend/src/models/schema/hashtag.ts34
-rw-r--r--packages/backend/src/models/schema/messaging-message.ts73
-rw-r--r--packages/backend/src/models/schema/muting.ts26
-rw-r--r--packages/backend/src/models/schema/note-favorite.ts26
-rw-r--r--packages/backend/src/models/schema/note-reaction.ts25
-rw-r--r--packages/backend/src/models/schema/note.ts183
-rw-r--r--packages/backend/src/models/schema/notification.ts66
-rw-r--r--packages/backend/src/models/schema/page.ts51
-rw-r--r--packages/backend/src/models/schema/queue.ts25
-rw-r--r--packages/backend/src/models/schema/user-group.ts34
-rw-r--r--packages/backend/src/models/schema/user-list.ts29
-rw-r--r--packages/backend/src/models/schema/user.ts467
56 files changed, 1716 insertions, 2005 deletions
diff --git a/packages/backend/src/models/entities/abuse-user-report.ts b/packages/backend/src/models/entities/abuse-user-report.ts
index 019d613f76..27c1e47fd8 100644
--- a/packages/backend/src/models/entities/abuse-user-report.ts
+++ b/packages/backend/src/models/entities/abuse-user-report.ts
@@ -51,6 +51,11 @@ export class AbuseUserReport {
})
public resolved: boolean;
+ @Column('boolean', {
+ default: false
+ })
+ public forwarded: boolean;
+
@Column('varchar', {
length: 2048,
})
diff --git a/packages/backend/src/models/entities/drive-file.ts b/packages/backend/src/models/entities/drive-file.ts
index 0af52d7cc0..cec86880f5 100644
--- a/packages/backend/src/models/entities/drive-file.ts
+++ b/packages/backend/src/models/entities/drive-file.ts
@@ -101,6 +101,11 @@ export class DriveFile {
})
public webpublicUrl: string | null;
+ @Column('varchar', {
+ length: 128, nullable: true,
+ })
+ public webpublicType: string | null;
+
@Index({ unique: true })
@Column('varchar', {
length: 256, nullable: true,
diff --git a/packages/backend/src/models/entities/emoji.ts b/packages/backend/src/models/entities/emoji.ts
index 1146908a88..2e9c11d21c 100644
--- a/packages/backend/src/models/entities/emoji.ts
+++ b/packages/backend/src/models/entities/emoji.ts
@@ -32,13 +32,19 @@ export class Emoji {
@Column('varchar', {
length: 512,
})
- public url: string;
+ public originalUrl: string;
+
+ @Column('varchar', {
+ length: 512,
+ })
+ public publicUrl: string;
@Column('varchar', {
length: 512, nullable: true,
})
public uri: string | null;
+ // publicUrlの方のtypeが入る
@Column('varchar', {
length: 64, nullable: true,
})
diff --git a/packages/backend/src/models/entities/games/reversi/game.ts b/packages/backend/src/models/entities/games/reversi/game.ts
deleted file mode 100644
index fe9b8a5ba5..0000000000
--- a/packages/backend/src/models/entities/games/reversi/game.ts
+++ /dev/null
@@ -1,133 +0,0 @@
-import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm';
-import { User } from '../../user';
-import { id } from '../../../id';
-
-@Entity()
-export class ReversiGame {
- @PrimaryColumn(id())
- public id: string;
-
- @Index()
- @Column('timestamp with time zone', {
- comment: 'The created date of the ReversiGame.',
- })
- public createdAt: Date;
-
- @Column('timestamp with time zone', {
- nullable: true,
- comment: 'The started date of the ReversiGame.',
- })
- public startedAt: Date | null;
-
- @Column(id())
- public user1Id: User['id'];
-
- @ManyToOne(type => User, {
- onDelete: 'CASCADE',
- })
- @JoinColumn()
- public user1: User | null;
-
- @Column(id())
- public user2Id: User['id'];
-
- @ManyToOne(type => User, {
- onDelete: 'CASCADE',
- })
- @JoinColumn()
- public user2: User | null;
-
- @Column('boolean', {
- default: false,
- })
- public user1Accepted: boolean;
-
- @Column('boolean', {
- default: false,
- })
- public user2Accepted: boolean;
-
- /**
- * どちらのプレイヤーが先行(黒)か
- * 1 ... user1
- * 2 ... user2
- */
- @Column('integer', {
- nullable: true,
- })
- public black: number | null;
-
- @Column('boolean', {
- default: false,
- })
- public isStarted: boolean;
-
- @Column('boolean', {
- default: false,
- })
- public isEnded: boolean;
-
- @Column({
- ...id(),
- nullable: true,
- })
- public winnerId: User['id'] | null;
-
- @Column({
- ...id(),
- nullable: true,
- })
- public surrendered: User['id'] | null;
-
- @Column('jsonb', {
- default: [],
- })
- public logs: {
- at: Date;
- color: boolean;
- pos: number;
- }[];
-
- @Column('varchar', {
- array: true, length: 64,
- })
- public map: string[];
-
- @Column('varchar', {
- length: 32,
- })
- public bw: string;
-
- @Column('boolean', {
- default: false,
- })
- public isLlotheo: boolean;
-
- @Column('boolean', {
- default: false,
- })
- public canPutEverywhere: boolean;
-
- @Column('boolean', {
- default: false,
- })
- public loopedBoard: boolean;
-
- @Column('jsonb', {
- nullable: true, default: null,
- })
- public form1: any | null;
-
- @Column('jsonb', {
- nullable: true, default: null,
- })
- public form2: any | null;
-
- /**
- * ログのposを文字列としてすべて連結したもののCRC32値
- */
- @Column('varchar', {
- length: 32, nullable: true,
- })
- public crc32: string | null;
-}
diff --git a/packages/backend/src/models/entities/games/reversi/matching.ts b/packages/backend/src/models/entities/games/reversi/matching.ts
deleted file mode 100644
index 70bb555e2f..0000000000
--- a/packages/backend/src/models/entities/games/reversi/matching.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm';
-import { User } from '../../user';
-import { id } from '../../../id';
-
-@Entity()
-export class ReversiMatching {
- @PrimaryColumn(id())
- public id: string;
-
- @Index()
- @Column('timestamp with time zone', {
- comment: 'The created date of the ReversiMatching.',
- })
- public createdAt: Date;
-
- @Index()
- @Column(id())
- public parentId: User['id'];
-
- @ManyToOne(type => User, {
- onDelete: 'CASCADE',
- })
- @JoinColumn()
- public parent: User | null;
-
- @Index()
- @Column(id())
- public childId: User['id'];
-
- @ManyToOne(type => User, {
- onDelete: 'CASCADE',
- })
- @JoinColumn()
- public child: User | null;
-}
diff --git a/packages/backend/src/models/entities/user-profile.ts b/packages/backend/src/models/entities/user-profile.ts
index eb8cdadd19..d8317de8d3 100644
--- a/packages/backend/src/models/entities/user-profile.ts
+++ b/packages/backend/src/models/entities/user-profile.ts
@@ -124,6 +124,7 @@ export class UserProfile {
})
public clientData: Record<string, any>;
+ // TODO: そのうち消す
@Column('jsonb', {
default: {},
comment: 'The room data of the User.',
diff --git a/packages/backend/src/models/index.ts b/packages/backend/src/models/index.ts
index 7154cca550..67da347395 100644
--- a/packages/backend/src/models/index.ts
+++ b/packages/backend/src/models/index.ts
@@ -18,7 +18,6 @@ import { AccessToken } from './entities/access-token';
import { UserNotePining } from './entities/user-note-pining';
import { SigninRepository } from './repositories/signin';
import { MessagingMessageRepository } from './repositories/messaging-message';
-import { ReversiGameRepository } from './repositories/games/reversi/game';
import { UserListRepository } from './repositories/user-list';
import { UserListJoining } from './entities/user-list-joining';
import { UserGroupRepository } from './repositories/user-group';
@@ -30,7 +29,6 @@ import { BlockingRepository } from './repositories/blocking';
import { NoteReactionRepository } from './repositories/note-reaction';
import { NotificationRepository } from './repositories/notification';
import { NoteFavoriteRepository } from './repositories/note-favorite';
-import { ReversiMatchingRepository } from './repositories/games/reversi/matching';
import { UserPublickey } from './entities/user-publickey';
import { UserKeypair } from './entities/user-keypair';
import { AppRepository } from './repositories/app';
@@ -107,8 +105,6 @@ export const AuthSessions = getCustomRepository(AuthSessionRepository);
export const AccessTokens = getRepository(AccessToken);
export const Signins = getCustomRepository(SigninRepository);
export const MessagingMessages = getCustomRepository(MessagingMessageRepository);
-export const ReversiGames = getCustomRepository(ReversiGameRepository);
-export const ReversiMatchings = getCustomRepository(ReversiMatchingRepository);
export const Pages = getCustomRepository(PageRepository);
export const PageLikes = getCustomRepository(PageLikeRepository);
export const GalleryPosts = getCustomRepository(GalleryPostRepository);
diff --git a/packages/backend/src/models/repositories/abuse-user-report.ts b/packages/backend/src/models/repositories/abuse-user-report.ts
index 5e267b3c2b..943b65eb64 100644
--- a/packages/backend/src/models/repositories/abuse-user-report.ts
+++ b/packages/backend/src/models/repositories/abuse-user-report.ts
@@ -27,6 +27,7 @@ export class AbuseUserReportRepository extends Repository<AbuseUserReport> {
assignee: report.assigneeId ? Users.pack(report.assignee || report.assigneeId, null, {
detail: true,
}) : null,
+ forwarded: report.forwarded,
});
}
diff --git a/packages/backend/src/models/repositories/antenna.ts b/packages/backend/src/models/repositories/antenna.ts
index 548f44f1b7..3bf0645a7f 100644
--- a/packages/backend/src/models/repositories/antenna.ts
+++ b/packages/backend/src/models/repositories/antenna.ts
@@ -31,94 +31,3 @@ export class AntennaRepository extends Repository<Antenna> {
};
}
}
-
-export const packedAntennaSchema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- id: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- },
- createdAt: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'date-time',
- },
- name: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- },
- keywords: {
- type: 'array' as const,
- optional: false as const, nullable: false as const,
- items: {
- type: 'array' as const,
- optional: false as const, nullable: false as const,
- items: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- },
- },
- },
- excludeKeywords: {
- type: 'array' as const,
- optional: false as const, nullable: false as const,
- items: {
- type: 'array' as const,
- optional: false as const, nullable: false as const,
- items: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- },
- },
- },
- src: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- enum: ['home', 'all', 'users', 'list', 'group'],
- },
- userListId: {
- type: 'string' as const,
- optional: false as const, nullable: true as const,
- format: 'id',
- },
- userGroupId: {
- type: 'string' as const,
- optional: false as const, nullable: true as const,
- format: 'id',
- },
- users: {
- type: 'array' as const,
- optional: false as const, nullable: false as const,
- items: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- },
- },
- caseSensitive: {
- type: 'boolean' as const,
- optional: false as const, nullable: false as const,
- default: false,
- },
- notify: {
- type: 'boolean' as const,
- optional: false as const, nullable: false as const,
- },
- withReplies: {
- type: 'boolean' as const,
- optional: false as const, nullable: false as const,
- default: false,
- },
- withFile: {
- type: 'boolean' as const,
- optional: false as const, nullable: false as const,
- },
- hasUnreadNote: {
- type: 'boolean' as const,
- optional: false as const, nullable: false as const,
- default: false,
- },
- },
-};
diff --git a/packages/backend/src/models/repositories/app.ts b/packages/backend/src/models/repositories/app.ts
index bec0765ac2..6bac4d9598 100644
--- a/packages/backend/src/models/repositories/app.ts
+++ b/packages/backend/src/models/repositories/app.ts
@@ -38,38 +38,3 @@ export class AppRepository extends Repository<App> {
};
}
}
-
-export const packedAppSchema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- id: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- },
- name: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- },
- callbackUrl: {
- type: 'string' as const,
- optional: false as const, nullable: true as const,
- },
- permission: {
- type: 'array' as const,
- optional: false as const, nullable: false as const,
- items: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- },
- },
- secret: {
- type: 'string' as const,
- optional: true as const, nullable: false as const,
- },
- isAuthorized: {
- type: 'boolean' as const,
- optional: true as const, nullable: false as const,
- },
- },
-};
diff --git a/packages/backend/src/models/repositories/blocking.ts b/packages/backend/src/models/repositories/blocking.ts
index a6895eabf4..c20b02f501 100644
--- a/packages/backend/src/models/repositories/blocking.ts
+++ b/packages/backend/src/models/repositories/blocking.ts
@@ -30,31 +30,3 @@ export class BlockingRepository extends Repository<Blocking> {
return Promise.all(blockings.map(x => this.pack(x, me)));
}
}
-
-export const packedBlockingSchema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- id: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- example: 'xxxxxxxxxx',
- },
- createdAt: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'date-time',
- },
- blockeeId: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- },
- blockee: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- ref: 'User' as const,
- },
- },
-};
diff --git a/packages/backend/src/models/repositories/channel.ts b/packages/backend/src/models/repositories/channel.ts
index 0a6b02f495..b3afb823ab 100644
--- a/packages/backend/src/models/repositories/channel.ts
+++ b/packages/backend/src/models/repositories/channel.ts
@@ -40,56 +40,3 @@ export class ChannelRepository extends Repository<Channel> {
};
}
}
-
-export const packedChannelSchema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- id: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- example: 'xxxxxxxxxx',
- },
- createdAt: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'date-time',
- },
- lastNotedAt: {
- type: 'string' as const,
- optional: false as const, nullable: true as const,
- format: 'date-time',
- },
- name: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- },
- description: {
- type: 'string' as const,
- nullable: true as const, optional: false as const,
- },
- bannerUrl: {
- type: 'string' as const,
- format: 'url',
- nullable: true as const, optional: false as const,
- },
- notesCount: {
- type: 'number' as const,
- nullable: false as const, optional: false as const,
- },
- usersCount: {
- type: 'number' as const,
- nullable: false as const, optional: false as const,
- },
- isFollowing: {
- type: 'boolean' as const,
- optional: true as const, nullable: false as const,
- },
- userId: {
- type: 'string' as const,
- nullable: true as const, optional: false as const,
- format: 'id',
- },
- },
-};
diff --git a/packages/backend/src/models/repositories/clip.ts b/packages/backend/src/models/repositories/clip.ts
index 7892811d48..6f9ceeb50a 100644
--- a/packages/backend/src/models/repositories/clip.ts
+++ b/packages/backend/src/models/repositories/clip.ts
@@ -29,42 +29,3 @@ export class ClipRepository extends Repository<Clip> {
}
}
-export const packedClipSchema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- id: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- example: 'xxxxxxxxxx',
- },
- createdAt: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'date-time',
- },
- userId: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- },
- user: {
- type: 'object' as const,
- ref: 'User' as const,
- optional: false as const, nullable: false as const,
- },
- name: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- },
- description: {
- type: 'string' as const,
- optional: false as const, nullable: true as const,
- },
- isPublic: {
- type: 'boolean' as const,
- optional: false as const, nullable: false as const,
- },
- },
-};
diff --git a/packages/backend/src/models/repositories/drive-file.ts b/packages/backend/src/models/repositories/drive-file.ts
index 79b890aa6e..44db9a0a58 100644
--- a/packages/backend/src/models/repositories/drive-file.ts
+++ b/packages/backend/src/models/repositories/drive-file.ts
@@ -3,7 +3,7 @@ import { DriveFile } from '@/models/entities/drive-file';
import { Users, DriveFolders } from '../index';
import { User } from '@/models/entities/user';
import { toPuny } from '@/misc/convert-host';
-import { awaitAll } from '@/prelude/await-all';
+import { awaitAll, Promiseable } from '@/prelude/await-all';
import { Packed } from '@/misc/schema';
import config from '@/config/index';
import { query, appendQuery } from '@/prelude/url';
@@ -126,7 +126,7 @@ export class DriveFileRepository extends Repository<DriveFile> {
const meta = await fetchMeta();
- return await awaitAll({
+ return await awaitAll<Packed<'DriveFile'>>({
id: file.id,
createdAt: file.createdAt.toISOString(),
name: file.name,
@@ -156,112 +156,3 @@ export class DriveFileRepository extends Repository<DriveFile> {
return items.filter(x => x != null);
}
}
-
-export const packedDriveFileSchema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- id: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- example: 'xxxxxxxxxx',
- },
- createdAt: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'date-time',
- },
- name: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- example: 'lenna.jpg',
- },
- type: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- example: 'image/jpeg',
- },
- md5: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'md5',
- example: '15eca7fba0480996e2245f5185bf39f2',
- },
- size: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- example: 51469,
- },
- isSensitive: {
- type: 'boolean' as const,
- optional: false as const, nullable: false as const,
- },
- blurhash: {
- type: 'string' as const,
- optional: false as const, nullable: true as const,
- },
- properties: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- width: {
- type: 'number' as const,
- optional: true as const, nullable: false as const,
- example: 1280,
- },
- height: {
- type: 'number' as const,
- optional: true as const, nullable: false as const,
- example: 720,
- },
- orientation: {
- type: 'number' as const,
- optional: true as const, nullable: false as const,
- example: 8,
- },
- avgColor: {
- type: 'string' as const,
- optional: true as const, nullable: false as const,
- example: 'rgb(40,65,87)',
- },
- },
- },
- url: {
- type: 'string' as const,
- optional: false as const, nullable: true as const,
- format: 'url',
- },
- thumbnailUrl: {
- type: 'string' as const,
- optional: false as const, nullable: true as const,
- format: 'url',
- },
- comment: {
- type: 'string' as const,
- optional: false as const, nullable: true as const,
- },
- folderId: {
- type: 'string' as const,
- optional: false as const, nullable: true as const,
- format: 'id',
- example: 'xxxxxxxxxx',
- },
- folder: {
- type: 'object' as const,
- optional: true as const, nullable: true as const,
- ref: 'DriveFolder' as const,
- },
- userId: {
- type: 'string' as const,
- optional: false as const, nullable: true as const,
- format: 'id',
- example: 'xxxxxxxxxx',
- },
- user: {
- type: 'object' as const,
- optional: true as const, nullable: true as const,
- ref: 'User' as const,
- },
- },
-};
diff --git a/packages/backend/src/models/repositories/drive-folder.ts b/packages/backend/src/models/repositories/drive-folder.ts
index 4ee4a68e08..b2e6cee9b8 100644
--- a/packages/backend/src/models/repositories/drive-folder.ts
+++ b/packages/backend/src/models/repositories/drive-folder.ts
@@ -48,44 +48,3 @@ export class DriveFolderRepository extends Repository<DriveFolder> {
});
}
}
-
-export const packedDriveFolderSchema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- id: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- example: 'xxxxxxxxxx',
- },
- createdAt: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'date-time',
- },
- name: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- },
- foldersCount: {
- type: 'number' as const,
- optional: true as const, nullable: false as const,
- },
- filesCount: {
- type: 'number' as const,
- optional: true as const, nullable: false as const,
- },
- parentId: {
- type: 'string' as const,
- optional: false as const, nullable: true as const,
- format: 'id',
- example: 'xxxxxxxxxx',
- },
- parent: {
- type: 'object' as const,
- optional: true as const, nullable: true as const,
- ref: 'DriveFolder' as const,
- },
- },
-};
diff --git a/packages/backend/src/models/repositories/emoji.ts b/packages/backend/src/models/repositories/emoji.ts
index b7529595a9..b9dc6ed0ac 100644
--- a/packages/backend/src/models/repositories/emoji.ts
+++ b/packages/backend/src/models/repositories/emoji.ts
@@ -15,7 +15,8 @@ export class EmojiRepository extends Repository<Emoji> {
name: emoji.name,
category: emoji.category,
host: emoji.host,
- url: emoji.url,
+ // || emoji.originalUrl してるのは後方互換性のため
+ url: emoji.publicUrl || emoji.originalUrl,
};
}
@@ -25,41 +26,3 @@ export class EmojiRepository extends Repository<Emoji> {
return Promise.all(emojis.map(x => this.pack(x)));
}
}
-
-export const packedEmojiSchema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- id: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- example: 'xxxxxxxxxx',
- },
- aliases: {
- type: 'array' as const,
- optional: false as const, nullable: false as const,
- items: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- },
- },
- name: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- },
- category: {
- type: 'string' as const,
- optional: false as const, nullable: true as const,
- },
- host: {
- type: 'string' as const,
- optional: false as const, nullable: true as const,
- },
- url: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- },
- },
-};
diff --git a/packages/backend/src/models/repositories/federation-instance.ts b/packages/backend/src/models/repositories/federation-instance.ts
index 90dbbaab1c..426fd5bfc3 100644
--- a/packages/backend/src/models/repositories/federation-instance.ts
+++ b/packages/backend/src/models/repositories/federation-instance.ts
@@ -1,106 +1,2 @@
import config from '@/config/index';
-export const packedFederationInstanceSchema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- id: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- },
- caughtAt: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'date-time',
- },
- host: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- example: 'misskey.example.com',
- },
- usersCount: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- notesCount: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- followingCount: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- followersCount: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- driveUsage: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- driveFiles: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- latestRequestSentAt: {
- type: 'string' as const,
- optional: false as const, nullable: true as const,
- format: 'date-time',
- },
- lastCommunicatedAt: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'date-time',
- },
- isNotResponding: {
- type: 'boolean' as const,
- optional: false as const, nullable: false as const,
- },
- isSuspended: {
- type: 'boolean' as const,
- optional: false as const, nullable: false as const,
- },
- softwareName: {
- type: 'string' as const,
- optional: false as const, nullable: true as const,
- example: 'misskey',
- },
- softwareVersion: {
- type: 'string' as const,
- optional: false as const, nullable: true as const,
- example: config.version,
- },
- openRegistrations: {
- type: 'boolean' as const,
- optional: false as const, nullable: true as const,
- example: true,
- },
- name: {
- type: 'string' as const,
- optional: false as const, nullable: true as const,
- },
- description: {
- type: 'string' as const,
- optional: false as const, nullable: true as const,
- },
- maintainerName: {
- type: 'string' as const,
- optional: false as const, nullable: true as const,
- },
- maintainerEmail: {
- type: 'string' as const,
- optional: false as const, nullable: true as const,
- },
- iconUrl: {
- type: 'string' as const,
- optional: false as const, nullable: true as const,
- format: 'url',
- },
- infoUpdatedAt: {
- type: 'string' as const,
- optional: false as const, nullable: true as const,
- format: 'date-time',
- },
- },
-};
diff --git a/packages/backend/src/models/repositories/following.ts b/packages/backend/src/models/repositories/following.ts
index 1dfaaf908a..9d20f442df 100644
--- a/packages/backend/src/models/repositories/following.ts
+++ b/packages/backend/src/models/repositories/following.ts
@@ -84,41 +84,3 @@ export class FollowingRepository extends Repository<Following> {
return Promise.all(followings.map(x => this.pack(x, me, opts)));
}
}
-
-export const packedFollowingSchema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- id: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- example: 'xxxxxxxxxx',
- },
- createdAt: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'date-time',
- },
- followeeId: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- },
- followee: {
- type: 'object' as const,
- optional: true as const, nullable: false as const,
- ref: 'User' as const,
- },
- followerId: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- },
- follower: {
- type: 'object' as const,
- optional: true as const, nullable: false as const,
- ref: 'User' as const,
- },
- },
-};
diff --git a/packages/backend/src/models/repositories/gallery-post.ts b/packages/backend/src/models/repositories/gallery-post.ts
index 6d37e3120e..e9233bb91e 100644
--- a/packages/backend/src/models/repositories/gallery-post.ts
+++ b/packages/backend/src/models/repositories/gallery-post.ts
@@ -38,74 +38,3 @@ export class GalleryPostRepository extends Repository<GalleryPost> {
return Promise.all(posts.map(x => this.pack(x, me)));
}
}
-
-export const packedGalleryPostSchema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- id: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- example: 'xxxxxxxxxx',
- },
- createdAt: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'date-time',
- },
- updatedAt: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'date-time',
- },
- title: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- },
- description: {
- type: 'string' as const,
- optional: false as const, nullable: true as const,
- },
- userId: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- },
- user: {
- type: 'object' as const,
- ref: 'User' as const,
- optional: false as const, nullable: false as const,
- },
- fileIds: {
- type: 'array' as const,
- optional: true as const, nullable: false as const,
- items: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- },
- },
- files: {
- type: 'array' as const,
- optional: true as const, nullable: false as const,
- items: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- ref: 'DriveFile' as const,
- },
- },
- tags: {
- type: 'array' as const,
- optional: true as const, nullable: false as const,
- items: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- },
- },
- isSensitive: {
- type: 'boolean' as const,
- optional: false as const, nullable: false as const,
- },
- },
-};
diff --git a/packages/backend/src/models/repositories/games/reversi/game.ts b/packages/backend/src/models/repositories/games/reversi/game.ts
deleted file mode 100644
index a9e0496760..0000000000
--- a/packages/backend/src/models/repositories/games/reversi/game.ts
+++ /dev/null
@@ -1,191 +0,0 @@
-import { User } from '@/models/entities/user';
-import { EntityRepository, Repository } from 'typeorm';
-import { Users } from '../../../index';
-import { ReversiGame } from '@/models/entities/games/reversi/game';
-import { Packed } from '@/misc/schema';
-
-@EntityRepository(ReversiGame)
-export class ReversiGameRepository extends Repository<ReversiGame> {
- public async pack(
- src: ReversiGame['id'] | ReversiGame,
- me?: { id: User['id'] } | null | undefined,
- options?: {
- detail?: boolean
- }
- ): Promise<Packed<'ReversiGame'>> {
- const opts = Object.assign({
- detail: true,
- }, options);
-
- const game = typeof src === 'object' ? src : await this.findOneOrFail(src);
-
- return {
- id: game.id,
- createdAt: game.createdAt.toISOString(),
- startedAt: game.startedAt && game.startedAt.toISOString(),
- isStarted: game.isStarted,
- isEnded: game.isEnded,
- form1: game.form1,
- form2: game.form2,
- user1Accepted: game.user1Accepted,
- user2Accepted: game.user2Accepted,
- user1Id: game.user1Id,
- user2Id: game.user2Id,
- user1: await Users.pack(game.user1Id, me),
- user2: await Users.pack(game.user2Id, me),
- winnerId: game.winnerId,
- winner: game.winnerId ? await Users.pack(game.winnerId, me) : null,
- surrendered: game.surrendered,
- black: game.black,
- bw: game.bw,
- isLlotheo: game.isLlotheo,
- canPutEverywhere: game.canPutEverywhere,
- loopedBoard: game.loopedBoard,
- ...(opts.detail ? {
- logs: game.logs.map(log => ({
- at: log.at.toISOString(),
- color: log.color,
- pos: log.pos,
- })),
- map: game.map,
- } : {}),
- };
- }
-}
-
-export const packedReversiGameSchema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- id: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- example: 'xxxxxxxxxx',
- },
- createdAt: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'date-time',
- },
- startedAt: {
- type: 'string' as const,
- optional: false as const, nullable: true as const,
- format: 'date-time',
- },
- isStarted: {
- type: 'boolean' as const,
- optional: false as const, nullable: false as const,
- },
- isEnded: {
- type: 'boolean' as const,
- optional: false as const, nullable: false as const,
- },
- form1: {
- type: 'any' as const,
- optional: false as const, nullable: true as const,
- },
- form2: {
- type: 'any' as const,
- optional: false as const, nullable: true as const,
- },
- user1Accepted: {
- type: 'boolean' as const,
- optional: false as const, nullable: false as const,
- },
- user2Accepted: {
- type: 'boolean' as const,
- optional: false as const, nullable: false as const,
- },
- user1Id: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- example: 'xxxxxxxxxx',
- },
- user2Id: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- example: 'xxxxxxxxxx',
- },
- user1: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- ref: 'User' as const,
- },
- user2: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- ref: 'User' as const,
- },
- winnerId: {
- type: 'string' as const,
- optional: false as const, nullable: true as const,
- format: 'id',
- example: 'xxxxxxxxxx',
- },
- winner: {
- type: 'object' as const,
- optional: false as const, nullable: true as const,
- ref: 'User' as const,
- },
- surrendered: {
- type: 'string' as const,
- optional: false as const, nullable: true as const,
- format: 'id',
- example: 'xxxxxxxxxx',
- },
- black: {
- type: 'number' as const,
- optional: false as const, nullable: true as const,
- },
- bw: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- },
- isLlotheo: {
- type: 'boolean' as const,
- optional: false as const, nullable: false as const,
- },
- canPutEverywhere: {
- type: 'boolean' as const,
- optional: false as const, nullable: false as const,
- },
- loopedBoard: {
- type: 'boolean' as const,
- optional: false as const, nullable: false as const,
- },
- logs: {
- type: 'array' as const,
- optional: true as const, nullable: false as const,
- items: {
- type: 'object' as const,
- optional: true as const, nullable: false as const,
- properties: {
- at: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'date-time',
- },
- color: {
- type: 'boolean' as const,
- optional: false as const, nullable: false as const,
- },
- pos: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- },
- },
- },
- map: {
- type: 'array' as const,
- optional: true as const, nullable: false as const,
- items: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- },
- },
- },
-};
diff --git a/packages/backend/src/models/repositories/games/reversi/matching.ts b/packages/backend/src/models/repositories/games/reversi/matching.ts
deleted file mode 100644
index b55f598068..0000000000
--- a/packages/backend/src/models/repositories/games/reversi/matching.ts
+++ /dev/null
@@ -1,69 +0,0 @@
-import { EntityRepository, Repository } from 'typeorm';
-import { ReversiMatching } from '@/models/entities/games/reversi/matching';
-import { Users } from '../../../index';
-import { awaitAll } from '@/prelude/await-all';
-import { User } from '@/models/entities/user';
-import { Packed } from '@/misc/schema';
-
-@EntityRepository(ReversiMatching)
-export class ReversiMatchingRepository extends Repository<ReversiMatching> {
- public async pack(
- src: ReversiMatching['id'] | ReversiMatching,
- me: { id: User['id'] }
- ): Promise<Packed<'ReversiMatching'>> {
- const matching = typeof src === 'object' ? src : await this.findOneOrFail(src);
-
- return await awaitAll({
- id: matching.id,
- createdAt: matching.createdAt.toISOString(),
- parentId: matching.parentId,
- parent: Users.pack(matching.parentId, me, {
- detail: true,
- }),
- childId: matching.childId,
- child: Users.pack(matching.childId, me, {
- detail: true,
- }),
- });
- }
-}
-
-export const packedReversiMatchingSchema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- id: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- example: 'xxxxxxxxxx',
- },
- createdAt: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'date-time',
- },
- parentId: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- example: 'xxxxxxxxxx',
- },
- parent: {
- type: 'object' as const,
- optional: false as const, nullable: true as const,
- ref: 'User' as const,
- },
- childId: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- example: 'xxxxxxxxxx',
- },
- child: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- ref: 'User' as const,
- },
- },
-};
diff --git a/packages/backend/src/models/repositories/hashtag.ts b/packages/backend/src/models/repositories/hashtag.ts
index 6e513c7ebb..c4b8d50c4e 100644
--- a/packages/backend/src/models/repositories/hashtag.ts
+++ b/packages/backend/src/models/repositories/hashtag.ts
@@ -24,39 +24,3 @@ export class HashtagRepository extends Repository<Hashtag> {
return Promise.all(hashtags.map(x => this.pack(x)));
}
}
-
-export const packedHashtagSchema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- tag: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- example: 'misskey',
- },
- mentionedUsersCount: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- mentionedLocalUsersCount: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- mentionedRemoteUsersCount: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- attachedUsersCount: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- attachedLocalUsersCount: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- attachedRemoteUsersCount: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- },
-};
diff --git a/packages/backend/src/models/repositories/messaging-message.ts b/packages/backend/src/models/repositories/messaging-message.ts
index 1b2dd3a246..0a342430b9 100644
--- a/packages/backend/src/models/repositories/messaging-message.ts
+++ b/packages/backend/src/models/repositories/messaging-message.ts
@@ -42,78 +42,3 @@ export class MessagingMessageRepository extends Repository<MessagingMessage> {
};
}
}
-
-export const packedMessagingMessageSchema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- id: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- example: 'xxxxxxxxxx',
- },
- createdAt: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'date-time',
- },
- userId: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- },
- user: {
- type: 'object' as const,
- ref: 'User' as const,
- optional: true as const, nullable: false as const,
- },
- text: {
- type: 'string' as const,
- optional: false as const, nullable: true as const,
- },
- fileId: {
- type: 'string' as const,
- optional: true as const, nullable: true as const,
- format: 'id',
- },
- file: {
- type: 'object' as const,
- optional: true as const, nullable: true as const,
- ref: 'DriveFile' as const,
- },
- recipientId: {
- type: 'string' as const,
- optional: false as const, nullable: true as const,
- format: 'id',
- },
- recipient: {
- type: 'object' as const,
- optional: true as const, nullable: true as const,
- ref: 'User' as const,
- },
- groupId: {
- type: 'string' as const,
- optional: false as const, nullable: true as const,
- format: 'id',
- },
- group: {
- type: 'object' as const,
- optional: true as const, nullable: true as const,
- ref: 'UserGroup' as const,
- },
- isRead: {
- type: 'boolean' as const,
- optional: true as const, nullable: false as const,
- },
- reads: {
- type: 'array' as const,
- optional: true as const, nullable: false as const,
- items: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- },
- },
- },
-};
diff --git a/packages/backend/src/models/repositories/muting.ts b/packages/backend/src/models/repositories/muting.ts
index b82d1f0daa..bdbe9b47da 100644
--- a/packages/backend/src/models/repositories/muting.ts
+++ b/packages/backend/src/models/repositories/muting.ts
@@ -30,31 +30,3 @@ export class MutingRepository extends Repository<Muting> {
return Promise.all(mutings.map(x => this.pack(x, me)));
}
}
-
-export const packedMutingSchema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- id: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- example: 'xxxxxxxxxx',
- },
- createdAt: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'date-time',
- },
- muteeId: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- },
- mutee: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- ref: 'User' as const,
- },
- },
-};
diff --git a/packages/backend/src/models/repositories/note-favorite.ts b/packages/backend/src/models/repositories/note-favorite.ts
index 47586a9116..c5de55c0c0 100644
--- a/packages/backend/src/models/repositories/note-favorite.ts
+++ b/packages/backend/src/models/repositories/note-favorite.ts
@@ -26,31 +26,3 @@ export class NoteFavoriteRepository extends Repository<NoteFavorite> {
return Promise.all(favorites.map(x => this.pack(x, me)));
}
}
-
-export const packedNoteFavoriteSchema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- id: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- example: 'xxxxxxxxxx',
- },
- createdAt: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'date-time',
- },
- note: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- ref: 'Note' as const,
- },
- noteId: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- },
- },
-};
diff --git a/packages/backend/src/models/repositories/note-reaction.ts b/packages/backend/src/models/repositories/note-reaction.ts
index dfb25cbea1..097574effa 100644
--- a/packages/backend/src/models/repositories/note-reaction.ts
+++ b/packages/backend/src/models/repositories/note-reaction.ts
@@ -31,30 +31,3 @@ export class NoteReactionRepository extends Repository<NoteReaction> {
};
}
}
-
-export const packedNoteReactionSchema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- id: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- example: 'xxxxxxxxxx',
- },
- createdAt: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'date-time',
- },
- user: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- ref: 'User' as const,
- },
- type: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- },
- },
-};
diff --git a/packages/backend/src/models/repositories/note.ts b/packages/backend/src/models/repositories/note.ts
index 96dfad70e9..9a7fef4977 100644
--- a/packages/backend/src/models/repositories/note.ts
+++ b/packages/backend/src/models/repositories/note.ts
@@ -218,7 +218,7 @@ export class NoteRepository extends Repository<Note> {
const reactionEmojiNames = Object.keys(note.reactions).filter(x => x?.startsWith(':')).map(x => decodeReaction(x).reaction).map(x => x.replace(/:/g, ''));
- const packed = await awaitAll({
+ const packed: Packed<'Note'> = await awaitAll({
id: note.id,
createdAt: note.createdAt.toISOString(),
userId: note.userId,
@@ -320,188 +320,3 @@ export class NoteRepository extends Repository<Note> {
})));
}
}
-
-export const packedNoteSchema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- id: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- example: 'xxxxxxxxxx',
- },
- createdAt: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'date-time',
- },
- text: {
- type: 'string' as const,
- optional: false as const, nullable: true as const,
- },
- cw: {
- type: 'string' as const,
- optional: true as const, nullable: true as const,
- },
- userId: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- },
- user: {
- type: 'object' as const,
- ref: 'User' as const,
- optional: false as const, nullable: false as const,
- },
- replyId: {
- type: 'string' as const,
- optional: true as const, nullable: true as const,
- format: 'id',
- example: 'xxxxxxxxxx',
- },
- renoteId: {
- type: 'string' as const,
- optional: true as const, nullable: true as const,
- format: 'id',
- example: 'xxxxxxxxxx',
- },
- reply: {
- type: 'object' as const,
- optional: true as const, nullable: true as const,
- ref: 'Note' as const,
- },
- renote: {
- type: 'object' as const,
- optional: true as const, nullable: true as const,
- ref: 'Note' as const,
- },
- isHidden: {
- type: 'boolean' as const,
- optional: true as const, nullable: false as const,
- },
- visibility: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- },
- mentions: {
- type: 'array' as const,
- optional: true as const, nullable: false as const,
- items: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- },
- },
- visibleUserIds: {
- type: 'array' as const,
- optional: true as const, nullable: false as const,
- items: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- },
- },
- fileIds: {
- type: 'array' as const,
- optional: true as const, nullable: false as const,
- items: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- },
- },
- files: {
- type: 'array' as const,
- optional: true as const, nullable: false as const,
- items: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- ref: 'DriveFile' as const,
- },
- },
- tags: {
- type: 'array' as const,
- optional: true as const, nullable: false as const,
- items: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- },
- },
- poll: {
- type: 'object' as const,
- optional: true as const, nullable: true as const,
- },
- channelId: {
- type: 'string' as const,
- optional: true as const, nullable: true as const,
- format: 'id',
- example: 'xxxxxxxxxx',
- },
- channel: {
- type: 'object' as const,
- optional: true as const, nullable: true as const,
- items: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- id: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- },
- name: {
- type: 'string' as const,
- optional: false as const, nullable: true as const,
- },
- },
- },
- },
- localOnly: {
- type: 'boolean' as const,
- optional: true as const, nullable: false as const,
- },
- emojis: {
- type: 'array' as const,
- optional: false as const, nullable: false as const,
- items: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- name: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- },
- url: {
- type: 'string' as const,
- optional: false as const, nullable: true as const,
- },
- },
- },
- },
- reactions: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- },
- renoteCount: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- repliesCount: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- uri: {
- type: 'string' as const,
- optional: true as const, nullable: false as const,
- },
- url: {
- type: 'string' as const,
- optional: true as const, nullable: false as const,
- },
-
- myReaction: {
- type: 'object' as const,
- optional: true as const, nullable: true as const,
- },
- },
-};
diff --git a/packages/backend/src/models/repositories/notification.ts b/packages/backend/src/models/repositories/notification.ts
index 47d569ed21..5e42798898 100644
--- a/packages/backend/src/models/repositories/notification.ts
+++ b/packages/backend/src/models/repositories/notification.ts
@@ -107,69 +107,3 @@ export class NotificationRepository extends Repository<Notification> {
})));
}
}
-
-export const packedNotificationSchema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- id: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- example: 'xxxxxxxxxx',
- },
- createdAt: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'date-time',
- },
- isRead: {
- type: 'boolean' as const,
- optional: false as const, nullable: false as const,
- },
- type: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- enum: [...notificationTypes],
- },
- user: {
- type: 'object' as const,
- ref: 'User' as const,
- optional: true as const, nullable: true as const,
- },
- userId: {
- type: 'string' as const,
- optional: true as const, nullable: true as const,
- format: 'id',
- },
- note: {
- type: 'object' as const,
- ref: 'Note' as const,
- optional: true as const, nullable: true as const,
- },
- reaction: {
- type: 'string' as const,
- optional: true as const, nullable: true as const,
- },
- choice: {
- type: 'number' as const,
- optional: true as const, nullable: true as const,
- },
- invitation: {
- type: 'object' as const,
- optional: true as const, nullable: true as const,
- },
- body: {
- type: 'string' as const,
- optional: true as const, nullable: true as const,
- },
- header: {
- type: 'string' as const,
- optional: true as const, nullable: true as const,
- },
- icon: {
- type: 'string' as const,
- optional: true as const, nullable: true as const,
- },
- },
-};
diff --git a/packages/backend/src/models/repositories/page.ts b/packages/backend/src/models/repositories/page.ts
index 46b453cad9..ec76c2e418 100644
--- a/packages/backend/src/models/repositories/page.ts
+++ b/packages/backend/src/models/repositories/page.ts
@@ -87,56 +87,3 @@ export class PageRepository extends Repository<Page> {
return Promise.all(pages.map(x => this.pack(x, me)));
}
}
-
-export const packedPageSchema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- id: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- example: 'xxxxxxxxxx',
- },
- createdAt: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'date-time',
- },
- updatedAt: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'date-time',
- },
- title: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- },
- name: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- },
- summary: {
- type: 'string' as const,
- optional: false as const, nullable: true as const,
- },
- content: {
- type: 'array' as const,
- optional: false as const, nullable: false as const,
- },
- variables: {
- type: 'array' as const,
- optional: false as const, nullable: false as const,
- },
- userId: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- },
- user: {
- type: 'object' as const,
- ref: 'User' as const,
- optional: false as const, nullable: false as const,
- },
- },
-};
diff --git a/packages/backend/src/models/repositories/queue.ts b/packages/backend/src/models/repositories/queue.ts
deleted file mode 100644
index 521c634390..0000000000
--- a/packages/backend/src/models/repositories/queue.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-export const packedQueueCountSchema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- waiting: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- active: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- completed: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- failed: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- delayed: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- paused: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- },
-};
diff --git a/packages/backend/src/models/repositories/user-group.ts b/packages/backend/src/models/repositories/user-group.ts
index 02a0348885..3ed37ca0ed 100644
--- a/packages/backend/src/models/repositories/user-group.ts
+++ b/packages/backend/src/models/repositories/user-group.ts
@@ -23,39 +23,3 @@ export class UserGroupRepository extends Repository<UserGroup> {
};
}
}
-
-export const packedUserGroupSchema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- id: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- example: 'xxxxxxxxxx',
- },
- createdAt: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'date-time',
- },
- name: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- },
- ownerId: {
- type: 'string' as const,
- nullable: false as const, optional: false as const,
- format: 'id',
- },
- userIds: {
- type: 'array' as const,
- nullable: false as const, optional: true as const,
- items: {
- type: 'string' as const,
- nullable: false as const, optional: false as const,
- format: 'id',
- },
- },
- },
-};
diff --git a/packages/backend/src/models/repositories/user-list.ts b/packages/backend/src/models/repositories/user-list.ts
index 792a17cb49..a2bffe8357 100644
--- a/packages/backend/src/models/repositories/user-list.ts
+++ b/packages/backend/src/models/repositories/user-list.ts
@@ -22,34 +22,3 @@ export class UserListRepository extends Repository<UserList> {
};
}
}
-
-export const packedUserListSchema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- id: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- example: 'xxxxxxxxxx',
- },
- createdAt: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'date-time',
- },
- name: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- },
- userIds: {
- type: 'array' as const,
- nullable: false as const, optional: true as const,
- items: {
- type: 'string' as const,
- nullable: false as const, optional: false as const,
- format: 'id',
- },
- },
- },
-};
diff --git a/packages/backend/src/models/repositories/user.ts b/packages/backend/src/models/repositories/user.ts
index 3dc7c67ec2..2b8398832d 100644
--- a/packages/backend/src/models/repositories/user.ts
+++ b/packages/backend/src/models/repositories/user.ts
@@ -4,11 +4,19 @@ import { User, ILocalUser, IRemoteUser } from '@/models/entities/user';
import { Notes, NoteUnreads, FollowRequests, Notifications, MessagingMessages, UserNotePinings, Followings, Blockings, Mutings, UserProfiles, UserSecurityKeys, UserGroupJoinings, Pages, Announcements, AnnouncementReads, Antennas, AntennaNotes, ChannelFollowings, Instances } from '../index';
import config from '@/config/index';
import { Packed } from '@/misc/schema';
-import { awaitAll } from '@/prelude/await-all';
+import { awaitAll, Promiseable } from '@/prelude/await-all';
import { populateEmojis } from '@/misc/populate-emojis';
import { getAntennas } from '@/misc/antenna-cache';
import { USER_ACTIVE_THRESHOLD, USER_ONLINE_THRESHOLD } from '@/const';
+type IsUserDetailed<Detailed extends boolean> = Detailed extends true ? Packed<'UserDetailed'> : Packed<'UserLite'>;
+type IsMeAndIsUserDetailed<ExpectsMe extends boolean | null, Detailed extends boolean> =
+ Detailed extends true ?
+ ExpectsMe extends true ? Packed<'MeDetailed'> :
+ ExpectsMe extends false ? Packed<'UserDetailedNotMe'> :
+ Packed<'UserDetailed'> :
+ Packed<'UserLite'>;
+
@EntityRepository(User)
export class UserRepository extends Repository<User> {
public async getRelation(me: User['id'], target: User['id']) {
@@ -144,7 +152,7 @@ export class UserRepository extends Repository<User> {
return count > 0;
}
- public getOnlineStatus(user: User): string {
+ public getOnlineStatus(user: User): 'unknown' | 'online' | 'active' | 'offline' {
if (user.hideOnlineStatus) return 'unknown';
if (user.lastActiveDate == null) return 'unknown';
const elapsed = Date.now() - user.lastActiveDate.getTime();
@@ -159,18 +167,18 @@ export class UserRepository extends Repository<User> {
if (user.avatarUrl) {
return user.avatarUrl;
} else {
- return `${config.url}/random-avatar/${user.id}`;
+ return `${config.url}/identicon/${user.id}`;
}
}
- public async pack(
+ public async pack<ExpectsMe extends boolean | null = null, D extends boolean = false>(
src: User['id'] | User,
me?: { id: User['id'] } | null | undefined,
options?: {
- detail?: boolean,
+ detail?: D,
includeSecrets?: boolean,
}
- ): Promise<Packed<'User'>> {
+ ): Promise<IsMeAndIsUserDetailed<ExpectsMe, D>> {
const opts = Object.assign({
detail: false,
includeSecrets: false,
@@ -178,8 +186,9 @@ export class UserRepository extends Repository<User> {
const user = typeof src === 'object' ? src : await this.findOneOrFail(src);
const meId = me ? me.id : null;
+ const isMe = meId === user.id;
- const relation = meId && (meId !== user.id) && opts.detail ? await this.getRelation(meId, user.id) : null;
+ const relation = meId && !isMe && opts.detail ? await this.getRelation(meId, user.id) : null;
const pins = opts.detail ? await UserNotePinings.createQueryBuilder('pin')
.where('pin.userId = :userId', { userId: user.id })
.innerJoinAndSelect('pin.note', 'note')
@@ -188,12 +197,12 @@ export class UserRepository extends Repository<User> {
const profile = opts.detail ? await UserProfiles.findOneOrFail(user.id) : null;
const followingCount = profile == null ? null :
- (profile.ffVisibility === 'public') || (meId === user.id) ? user.followingCount :
+ (profile.ffVisibility === 'public') || isMe ? user.followingCount :
(profile.ffVisibility === 'followers') && (relation && relation.isFollowing) ? user.followingCount :
null;
const followersCount = profile == null ? null :
- (profile.ffVisibility === 'public') || (meId === user.id) ? user.followersCount :
+ (profile.ffVisibility === 'public') || isMe ? user.followersCount :
(profile.ffVisibility === 'followers') && (relation && relation.isFollowing) ? user.followersCount :
null;
@@ -227,12 +236,11 @@ export class UserRepository extends Repository<User> {
uri: user.uri,
createdAt: user.createdAt.toISOString(),
updatedAt: user.updatedAt ? user.updatedAt.toISOString() : null,
- lastFetchedAt: user.lastFetchedAt?.toISOString(),
+ lastFetchedAt: user.lastFetchedAt ? user.lastFetchedAt.toISOString() : null,
bannerUrl: user.bannerUrl,
bannerBlurhash: user.bannerBlurhash,
bannerColor: null, // 後方互換性のため
isLocked: user.isLocked,
- isModerator: user.isModerator || falsy,
isSilenced: user.isSilenced || falsy,
isSuspended: user.isSuspended || falsy,
description: profile!.description,
@@ -260,7 +268,7 @@ export class UserRepository extends Repository<User> {
: false,
} : {}),
- ...(opts.detail && meId === user.id ? {
+ ...(opts.detail && isMe ? {
avatarId: user.avatarId,
bannerId: user.bannerId,
injectFeaturedNote: profile!.injectFeaturedNote,
@@ -315,19 +323,19 @@ export class UserRepository extends Repository<User> {
isBlocked: relation.isBlocked,
isMuted: relation.isMuted,
} : {}),
- };
+ } as Promiseable<Packed<'User'>> as Promiseable<IsMeAndIsUserDetailed<ExpectsMe, D>>;
return await awaitAll(packed);
}
- public packMany(
+ public packMany<D extends boolean = false>(
users: (User['id'] | User)[],
me?: { id: User['id'] } | null | undefined,
options?: {
- detail?: boolean,
+ detail?: D,
includeSecrets?: boolean,
}
- ) {
+ ): Promise<IsUserDetailed<D>[]> {
return Promise.all(users.map(u => this.pack(u, me, options)));
}
@@ -352,313 +360,3 @@ export class UserRepository extends Repository<User> {
public validateBirthday = $.str.match(/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/);
//#endregion
}
-
-export const packedUserSchema = {
- type: 'object' as const,
- nullable: false as const, optional: false as const,
- properties: {
- id: {
- type: 'string' as const,
- nullable: false as const, optional: false as const,
- format: 'id',
- example: 'xxxxxxxxxx',
- },
- name: {
- type: 'string' as const,
- nullable: true as const, optional: false as const,
- example: '藍',
- },
- username: {
- type: 'string' as const,
- nullable: false as const, optional: false as const,
- example: 'ai',
- },
- host: {
- type: 'string' as const,
- nullable: true as const, optional: false as const,
- example: 'misskey.example.com',
- },
- avatarUrl: {
- type: 'string' as const,
- format: 'url',
- nullable: true as const, optional: false as const,
- },
- avatarBlurhash: {
- type: 'any' as const,
- nullable: true as const, optional: false as const,
- },
- avatarColor: {
- type: 'any' as const,
- nullable: true as const, optional: false as const,
- default: null,
- },
- isAdmin: {
- type: 'boolean' as const,
- nullable: false as const, optional: true as const,
- default: false,
- },
- isModerator: {
- type: 'boolean' as const,
- nullable: false as const, optional: true as const,
- default: false,
- },
- isBot: {
- type: 'boolean' as const,
- nullable: false as const, optional: true as const,
- },
- isCat: {
- type: 'boolean' as const,
- nullable: false as const, optional: true as const,
- },
- emojis: {
- type: 'array' as const,
- nullable: false as const, optional: false as const,
- items: {
- type: 'object' as const,
- nullable: false as const, optional: false as const,
- properties: {
- name: {
- type: 'string' as const,
- nullable: false as const, optional: false as const,
- },
- url: {
- type: 'string' as const,
- nullable: false as const, optional: false as const,
- format: 'url',
- },
- },
- },
- },
- url: {
- type: 'string' as const,
- format: 'url',
- nullable: true as const, optional: true as const,
- },
- createdAt: {
- type: 'string' as const,
- nullable: false as const, optional: true as const,
- format: 'date-time',
- },
- updatedAt: {
- type: 'string' as const,
- nullable: true as const, optional: true as const,
- format: 'date-time',
- },
- bannerUrl: {
- type: 'string' as const,
- format: 'url',
- nullable: true as const, optional: true as const,
- },
- bannerBlurhash: {
- type: 'any' as const,
- nullable: true as const, optional: true as const,
- },
- bannerColor: {
- type: 'any' as const,
- nullable: true as const, optional: true as const,
- default: null,
- },
- isLocked: {
- type: 'boolean' as const,
- nullable: false as const, optional: true as const,
- },
- isSuspended: {
- type: 'boolean' as const,
- nullable: false as const, optional: true as const,
- example: false,
- },
- description: {
- type: 'string' as const,
- nullable: true as const, optional: true as const,
- example: 'Hi masters, I am Ai!',
- },
- location: {
- type: 'string' as const,
- nullable: true as const, optional: true as const,
- },
- birthday: {
- type: 'string' as const,
- nullable: true as const, optional: true as const,
- example: '2018-03-12',
- },
- fields: {
- type: 'array' as const,
- nullable: false as const, optional: true as const,
- items: {
- type: 'object' as const,
- nullable: false as const, optional: false as const,
- properties: {
- name: {
- type: 'string' as const,
- nullable: false as const, optional: false as const,
- },
- value: {
- type: 'string' as const,
- nullable: false as const, optional: false as const,
- },
- },
- maxLength: 4,
- },
- },
- followersCount: {
- type: 'number' as const,
- nullable: false as const, optional: true as const,
- },
- followingCount: {
- type: 'number' as const,
- nullable: false as const, optional: true as const,
- },
- notesCount: {
- type: 'number' as const,
- nullable: false as const, optional: true as const,
- },
- pinnedNoteIds: {
- type: 'array' as const,
- nullable: false as const, optional: true as const,
- items: {
- type: 'string' as const,
- nullable: false as const, optional: false as const,
- format: 'id',
- },
- },
- pinnedNotes: {
- type: 'array' as const,
- nullable: false as const, optional: true as const,
- items: {
- type: 'object' as const,
- nullable: false as const, optional: false as const,
- ref: 'Note' as const,
- },
- },
- pinnedPageId: {
- type: 'string' as const,
- nullable: true as const, optional: true as const,
- },
- pinnedPage: {
- type: 'object' as const,
- nullable: true as const, optional: true as const,
- ref: 'Page' as const,
- },
- twoFactorEnabled: {
- type: 'boolean' as const,
- nullable: false as const, optional: true as const,
- default: false,
- },
- usePasswordLessLogin: {
- type: 'boolean' as const,
- nullable: false as const, optional: true as const,
- default: false,
- },
- securityKeys: {
- type: 'boolean' as const,
- nullable: false as const, optional: true as const,
- default: false,
- },
- avatarId: {
- type: 'string' as const,
- nullable: true as const, optional: true as const,
- format: 'id',
- },
- bannerId: {
- type: 'string' as const,
- nullable: true as const, optional: true as const,
- format: 'id',
- },
- autoWatch: {
- type: 'boolean' as const,
- nullable: false as const, optional: true as const,
- },
- injectFeaturedNote: {
- type: 'boolean' as const,
- nullable: false as const, optional: true as const,
- },
- alwaysMarkNsfw: {
- type: 'boolean' as const,
- nullable: false as const, optional: true as const,
- },
- carefulBot: {
- type: 'boolean' as const,
- nullable: false as const, optional: true as const,
- },
- autoAcceptFollowed: {
- type: 'boolean' as const,
- nullable: false as const, optional: true as const,
- },
- hasUnreadSpecifiedNotes: {
- type: 'boolean' as const,
- nullable: false as const, optional: true as const,
- },
- hasUnreadMentions: {
- type: 'boolean' as const,
- nullable: false as const, optional: true as const,
- },
- hasUnreadAnnouncement: {
- type: 'boolean' as const,
- nullable: false as const, optional: true as const,
- },
- hasUnreadAntenna: {
- type: 'boolean' as const,
- nullable: false as const, optional: true as const,
- },
- hasUnreadChannel: {
- type: 'boolean' as const,
- nullable: false as const, optional: true as const,
- },
- hasUnreadMessagingMessage: {
- type: 'boolean' as const,
- nullable: false as const, optional: true as const,
- },
- hasUnreadNotification: {
- type: 'boolean' as const,
- nullable: false as const, optional: true as const,
- },
- hasPendingReceivedFollowRequest: {
- type: 'boolean' as const,
- nullable: false as const, optional: true as const,
- },
- integrations: {
- type: 'object' as const,
- nullable: false as const, optional: true as const,
- },
- mutedWords: {
- type: 'array' as const,
- nullable: false as const, optional: true as const,
- },
- mutedInstances: {
- type: 'array' as const,
- nullable: false as const, optional: true as const,
- },
- mutingNotificationTypes: {
- type: 'array' as const,
- nullable: false as const, optional: true as const,
- },
- isFollowing: {
- type: 'boolean' as const,
- optional: true as const, nullable: false as const,
- },
- hasPendingFollowRequestFromYou: {
- type: 'boolean' as const,
- optional: true as const, nullable: false as const,
- },
- hasPendingFollowRequestToYou: {
- type: 'boolean' as const,
- optional: true as const, nullable: false as const,
- },
- isFollowed: {
- type: 'boolean' as const,
- optional: true as const, nullable: false as const,
- },
- isBlocking: {
- type: 'boolean' as const,
- optional: true as const, nullable: false as const,
- },
- isBlocked: {
- type: 'boolean' as const,
- optional: true as const, nullable: false as const,
- },
- isMuted: {
- type: 'boolean' as const,
- optional: true as const, nullable: false as const,
- },
- },
-};
diff --git a/packages/backend/src/models/schema/antenna.ts b/packages/backend/src/models/schema/antenna.ts
new file mode 100644
index 0000000000..9cf522802c
--- /dev/null
+++ b/packages/backend/src/models/schema/antenna.ts
@@ -0,0 +1,89 @@
+export const packedAntennaSchema = {
+ type: 'object',
+ properties: {
+ id: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ },
+ createdAt: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'date-time',
+ },
+ name: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
+ keywords: {
+ type: 'array',
+ optional: false, nullable: false,
+ items: {
+ type: 'array',
+ optional: false, nullable: false,
+ items: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
+ },
+ },
+ excludeKeywords: {
+ type: 'array',
+ optional: false, nullable: false,
+ items: {
+ type: 'array',
+ optional: false, nullable: false,
+ items: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
+ },
+ },
+ src: {
+ type: 'string',
+ optional: false, nullable: false,
+ enum: ['home', 'all', 'users', 'list', 'group'],
+ },
+ userListId: {
+ type: 'string',
+ optional: false, nullable: true,
+ format: 'id',
+ },
+ userGroupId: {
+ type: 'string',
+ optional: false, nullable: true,
+ format: 'id',
+ },
+ users: {
+ type: 'array',
+ optional: false, nullable: false,
+ items: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
+ },
+ caseSensitive: {
+ type: 'boolean',
+ optional: false, nullable: false,
+ default: false,
+ },
+ notify: {
+ type: 'boolean',
+ optional: false, nullable: false,
+ },
+ withReplies: {
+ type: 'boolean',
+ optional: false, nullable: false,
+ default: false,
+ },
+ withFile: {
+ type: 'boolean',
+ optional: false, nullable: false,
+ },
+ hasUnreadNote: {
+ type: 'boolean',
+ optional: false, nullable: false,
+ default: false,
+ },
+ },
+} as const;
diff --git a/packages/backend/src/models/schema/app.ts b/packages/backend/src/models/schema/app.ts
new file mode 100644
index 0000000000..c80dc81c33
--- /dev/null
+++ b/packages/backend/src/models/schema/app.ts
@@ -0,0 +1,33 @@
+export const packedAppSchema = {
+ type: 'object',
+ properties: {
+ id: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
+ name: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
+ callbackUrl: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ permission: {
+ type: 'array',
+ optional: false, nullable: false,
+ items: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
+ },
+ secret: {
+ type: 'string',
+ optional: true, nullable: false,
+ },
+ isAuthorized: {
+ type: 'boolean',
+ optional: true, nullable: false,
+ },
+ },
+} as const;
diff --git a/packages/backend/src/models/schema/blocking.ts b/packages/backend/src/models/schema/blocking.ts
new file mode 100644
index 0000000000..5532322420
--- /dev/null
+++ b/packages/backend/src/models/schema/blocking.ts
@@ -0,0 +1,26 @@
+export const packedBlockingSchema = {
+ type: 'object',
+ properties: {
+ id: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ example: 'xxxxxxxxxx',
+ },
+ createdAt: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'date-time',
+ },
+ blockeeId: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ },
+ blockee: {
+ type: 'object',
+ optional: false, nullable: false,
+ ref: 'UserDetailed',
+ },
+ },
+} as const;
diff --git a/packages/backend/src/models/schema/channel.ts b/packages/backend/src/models/schema/channel.ts
new file mode 100644
index 0000000000..7f4f2a48b8
--- /dev/null
+++ b/packages/backend/src/models/schema/channel.ts
@@ -0,0 +1,51 @@
+export const packedChannelSchema = {
+ type: 'object',
+ properties: {
+ id: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ example: 'xxxxxxxxxx',
+ },
+ createdAt: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'date-time',
+ },
+ lastNotedAt: {
+ type: 'string',
+ optional: false, nullable: true,
+ format: 'date-time',
+ },
+ name: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
+ description: {
+ type: 'string',
+ nullable: true, optional: false,
+ },
+ bannerUrl: {
+ type: 'string',
+ format: 'url',
+ nullable: true, optional: false,
+ },
+ notesCount: {
+ type: 'number',
+ nullable: false, optional: false,
+ },
+ usersCount: {
+ type: 'number',
+ nullable: false, optional: false,
+ },
+ isFollowing: {
+ type: 'boolean',
+ optional: true, nullable: false,
+ },
+ userId: {
+ type: 'string',
+ nullable: true, optional: false,
+ format: 'id',
+ },
+ },
+} as const;
diff --git a/packages/backend/src/models/schema/clip.ts b/packages/backend/src/models/schema/clip.ts
new file mode 100644
index 0000000000..f0ee2ce0c4
--- /dev/null
+++ b/packages/backend/src/models/schema/clip.ts
@@ -0,0 +1,38 @@
+export const packedClipSchema = {
+ type: 'object',
+ properties: {
+ id: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ example: 'xxxxxxxxxx',
+ },
+ createdAt: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'date-time',
+ },
+ userId: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ },
+ user: {
+ type: 'object',
+ ref: 'UserLite',
+ optional: false, nullable: false,
+ },
+ name: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
+ description: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ isPublic: {
+ type: 'boolean',
+ optional: false, nullable: false,
+ },
+ },
+} as const;
diff --git a/packages/backend/src/models/schema/drive-file.ts b/packages/backend/src/models/schema/drive-file.ts
new file mode 100644
index 0000000000..4359076612
--- /dev/null
+++ b/packages/backend/src/models/schema/drive-file.ts
@@ -0,0 +1,107 @@
+export const packedDriveFileSchema = {
+ type: 'object',
+ properties: {
+ id: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ example: 'xxxxxxxxxx',
+ },
+ createdAt: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'date-time',
+ },
+ name: {
+ type: 'string',
+ optional: false, nullable: false,
+ example: 'lenna.jpg',
+ },
+ type: {
+ type: 'string',
+ optional: false, nullable: false,
+ example: 'image/jpeg',
+ },
+ md5: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'md5',
+ example: '15eca7fba0480996e2245f5185bf39f2',
+ },
+ size: {
+ type: 'number',
+ optional: false, nullable: false,
+ example: 51469,
+ },
+ isSensitive: {
+ type: 'boolean',
+ optional: false, nullable: false,
+ },
+ blurhash: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ properties: {
+ type: 'object',
+ optional: false, nullable: false,
+ properties: {
+ width: {
+ type: 'number',
+ optional: true, nullable: false,
+ example: 1280,
+ },
+ height: {
+ type: 'number',
+ optional: true, nullable: false,
+ example: 720,
+ },
+ orientation: {
+ type: 'number',
+ optional: true, nullable: false,
+ example: 8,
+ },
+ avgColor: {
+ type: 'string',
+ optional: true, nullable: false,
+ example: 'rgb(40,65,87)',
+ },
+ },
+ },
+ url: {
+ type: 'string',
+ optional: false, nullable: true,
+ format: 'url',
+ },
+ thumbnailUrl: {
+ type: 'string',
+ optional: false, nullable: true,
+ format: 'url',
+ },
+ comment: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ folderId: {
+ type: 'string',
+ optional: false, nullable: true,
+ format: 'id',
+ example: 'xxxxxxxxxx',
+ },
+ folder: {
+ type: 'object',
+ optional: true, nullable: true,
+ ref: 'DriveFolder',
+ },
+ userId: {
+ type: 'string',
+ optional: false, nullable: true,
+ format: 'id',
+ example: 'xxxxxxxxxx',
+ },
+ user: {
+ type: 'object',
+ optional: true, nullable: true,
+ ref: 'UserLite',
+ },
+ },
+} as const;
diff --git a/packages/backend/src/models/schema/drive-folder.ts b/packages/backend/src/models/schema/drive-folder.ts
new file mode 100644
index 0000000000..88cb8ab4a2
--- /dev/null
+++ b/packages/backend/src/models/schema/drive-folder.ts
@@ -0,0 +1,39 @@
+export const packedDriveFolderSchema = {
+ type: 'object',
+ properties: {
+ id: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ example: 'xxxxxxxxxx',
+ },
+ createdAt: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'date-time',
+ },
+ name: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
+ foldersCount: {
+ type: 'number',
+ optional: true, nullable: false,
+ },
+ filesCount: {
+ type: 'number',
+ optional: true, nullable: false,
+ },
+ parentId: {
+ type: 'string',
+ optional: false, nullable: true,
+ format: 'id',
+ example: 'xxxxxxxxxx',
+ },
+ parent: {
+ type: 'object',
+ optional: true, nullable: true,
+ ref: 'DriveFolder',
+ },
+ },
+} as const;
diff --git a/packages/backend/src/models/schema/emoji.ts b/packages/backend/src/models/schema/emoji.ts
new file mode 100644
index 0000000000..5f9af88db4
--- /dev/null
+++ b/packages/backend/src/models/schema/emoji.ts
@@ -0,0 +1,36 @@
+export const packedEmojiSchema = {
+ type: 'object',
+ properties: {
+ id: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ example: 'xxxxxxxxxx',
+ },
+ aliases: {
+ type: 'array',
+ optional: false, nullable: false,
+ items: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ },
+ },
+ name: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
+ category: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ host: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ url: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
+ },
+} as const;
diff --git a/packages/backend/src/models/schema/federation-instance.ts b/packages/backend/src/models/schema/federation-instance.ts
new file mode 100644
index 0000000000..eef2f9e24f
--- /dev/null
+++ b/packages/backend/src/models/schema/federation-instance.ts
@@ -0,0 +1,105 @@
+import config from "@/config";
+
+export const packedFederationInstanceSchema = {
+ type: 'object',
+ properties: {
+ id: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ },
+ caughtAt: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'date-time',
+ },
+ host: {
+ type: 'string',
+ optional: false, nullable: false,
+ example: 'misskey.example.com',
+ },
+ usersCount: {
+ type: 'number',
+ optional: false, nullable: false,
+ },
+ notesCount: {
+ type: 'number',
+ optional: false, nullable: false,
+ },
+ followingCount: {
+ type: 'number',
+ optional: false, nullable: false,
+ },
+ followersCount: {
+ type: 'number',
+ optional: false, nullable: false,
+ },
+ driveUsage: {
+ type: 'number',
+ optional: false, nullable: false,
+ },
+ driveFiles: {
+ type: 'number',
+ optional: false, nullable: false,
+ },
+ latestRequestSentAt: {
+ type: 'string',
+ optional: false, nullable: true,
+ format: 'date-time',
+ },
+ lastCommunicatedAt: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'date-time',
+ },
+ isNotResponding: {
+ type: 'boolean',
+ optional: false, nullable: false,
+ },
+ isSuspended: {
+ type: 'boolean',
+ optional: false, nullable: false,
+ },
+ softwareName: {
+ type: 'string',
+ optional: false, nullable: true,
+ example: 'misskey',
+ },
+ softwareVersion: {
+ type: 'string',
+ optional: false, nullable: true,
+ example: config.version,
+ },
+ openRegistrations: {
+ type: 'boolean',
+ optional: false, nullable: true,
+ example: true,
+ },
+ name: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ description: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ maintainerName: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ maintainerEmail: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ iconUrl: {
+ type: 'string',
+ optional: false, nullable: true,
+ format: 'url',
+ },
+ infoUpdatedAt: {
+ type: 'string',
+ optional: false, nullable: true,
+ format: 'date-time',
+ },
+ },
+} as const;
diff --git a/packages/backend/src/models/schema/following.ts b/packages/backend/src/models/schema/following.ts
new file mode 100644
index 0000000000..2bcffbfc4d
--- /dev/null
+++ b/packages/backend/src/models/schema/following.ts
@@ -0,0 +1,36 @@
+export const packedFollowingSchema = {
+ type: 'object',
+ properties: {
+ id: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ example: 'xxxxxxxxxx',
+ },
+ createdAt: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'date-time',
+ },
+ followeeId: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ },
+ followee: {
+ type: 'object',
+ optional: true, nullable: false,
+ ref: 'UserDetailed',
+ },
+ followerId: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ },
+ follower: {
+ type: 'object',
+ optional: true, nullable: false,
+ ref: 'UserDetailed',
+ },
+ },
+} as const;
diff --git a/packages/backend/src/models/schema/gallery-post.ts b/packages/backend/src/models/schema/gallery-post.ts
new file mode 100644
index 0000000000..fc503d4a64
--- /dev/null
+++ b/packages/backend/src/models/schema/gallery-post.ts
@@ -0,0 +1,69 @@
+export const packedGalleryPostSchema = {
+ type: 'object',
+ properties: {
+ id: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ example: 'xxxxxxxxxx',
+ },
+ createdAt: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'date-time',
+ },
+ updatedAt: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'date-time',
+ },
+ title: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
+ description: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ userId: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ },
+ user: {
+ type: 'object',
+ ref: 'UserLite',
+ optional: false, nullable: false,
+ },
+ fileIds: {
+ type: 'array',
+ optional: true, nullable: false,
+ items: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ },
+ },
+ files: {
+ type: 'array',
+ optional: true, nullable: false,
+ items: {
+ type: 'object',
+ optional: false, nullable: false,
+ ref: 'DriveFile',
+ },
+ },
+ tags: {
+ type: 'array',
+ optional: true, nullable: false,
+ items: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
+ },
+ isSensitive: {
+ type: 'boolean',
+ optional: false, nullable: false,
+ },
+ },
+} as const;
diff --git a/packages/backend/src/models/schema/hashtag.ts b/packages/backend/src/models/schema/hashtag.ts
new file mode 100644
index 0000000000..98f8827640
--- /dev/null
+++ b/packages/backend/src/models/schema/hashtag.ts
@@ -0,0 +1,34 @@
+export const packedHashtagSchema = {
+ type: 'object',
+ properties: {
+ tag: {
+ type: 'string',
+ optional: false, nullable: false,
+ example: 'misskey',
+ },
+ mentionedUsersCount: {
+ type: 'number',
+ optional: false, nullable: false,
+ },
+ mentionedLocalUsersCount: {
+ type: 'number',
+ optional: false, nullable: false,
+ },
+ mentionedRemoteUsersCount: {
+ type: 'number',
+ optional: false, nullable: false,
+ },
+ attachedUsersCount: {
+ type: 'number',
+ optional: false, nullable: false,
+ },
+ attachedLocalUsersCount: {
+ type: 'number',
+ optional: false, nullable: false,
+ },
+ attachedRemoteUsersCount: {
+ type: 'number',
+ optional: false, nullable: false,
+ },
+ },
+} as const;
diff --git a/packages/backend/src/models/schema/messaging-message.ts b/packages/backend/src/models/schema/messaging-message.ts
new file mode 100644
index 0000000000..b1ffa45955
--- /dev/null
+++ b/packages/backend/src/models/schema/messaging-message.ts
@@ -0,0 +1,73 @@
+export const packedMessagingMessageSchema = {
+ type: 'object',
+ properties: {
+ id: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ example: 'xxxxxxxxxx',
+ },
+ createdAt: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'date-time',
+ },
+ userId: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ },
+ user: {
+ type: 'object',
+ ref: 'UserLite',
+ optional: true, nullable: false,
+ },
+ text: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ fileId: {
+ type: 'string',
+ optional: true, nullable: true,
+ format: 'id',
+ },
+ file: {
+ type: 'object',
+ optional: true, nullable: true,
+ ref: 'DriveFile',
+ },
+ recipientId: {
+ type: 'string',
+ optional: false, nullable: true,
+ format: 'id',
+ },
+ recipient: {
+ type: 'object',
+ optional: true, nullable: true,
+ ref: 'UserLite',
+ },
+ groupId: {
+ type: 'string',
+ optional: false, nullable: true,
+ format: 'id',
+ },
+ group: {
+ type: 'object',
+ optional: true, nullable: true,
+ ref: 'UserGroup',
+ },
+ isRead: {
+ type: 'boolean',
+ optional: true, nullable: false,
+ },
+ reads: {
+ type: 'array',
+ optional: true, nullable: false,
+ items: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ },
+ },
+ },
+} as const;
diff --git a/packages/backend/src/models/schema/muting.ts b/packages/backend/src/models/schema/muting.ts
new file mode 100644
index 0000000000..d75a4fbfed
--- /dev/null
+++ b/packages/backend/src/models/schema/muting.ts
@@ -0,0 +1,26 @@
+export const packedMutingSchema = {
+ type: 'object',
+ properties: {
+ id: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ example: 'xxxxxxxxxx',
+ },
+ createdAt: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'date-time',
+ },
+ muteeId: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ },
+ mutee: {
+ type: 'object',
+ optional: false, nullable: false,
+ ref: 'UserDetailed',
+ },
+ },
+} as const;
diff --git a/packages/backend/src/models/schema/note-favorite.ts b/packages/backend/src/models/schema/note-favorite.ts
new file mode 100644
index 0000000000..d133f7367d
--- /dev/null
+++ b/packages/backend/src/models/schema/note-favorite.ts
@@ -0,0 +1,26 @@
+export const packedNoteFavoriteSchema = {
+ type: 'object',
+ properties: {
+ id: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ example: 'xxxxxxxxxx',
+ },
+ createdAt: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'date-time',
+ },
+ note: {
+ type: 'object',
+ optional: false, nullable: false,
+ ref: 'Note',
+ },
+ noteId: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ },
+ },
+} as const;
diff --git a/packages/backend/src/models/schema/note-reaction.ts b/packages/backend/src/models/schema/note-reaction.ts
new file mode 100644
index 0000000000..0d8fc5449b
--- /dev/null
+++ b/packages/backend/src/models/schema/note-reaction.ts
@@ -0,0 +1,25 @@
+export const packedNoteReactionSchema = {
+ type: 'object',
+ properties: {
+ id: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ example: 'xxxxxxxxxx',
+ },
+ createdAt: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'date-time',
+ },
+ user: {
+ type: 'object',
+ optional: false, nullable: false,
+ ref: 'UserLite',
+ },
+ type: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
+ },
+} as const;
diff --git a/packages/backend/src/models/schema/note.ts b/packages/backend/src/models/schema/note.ts
new file mode 100644
index 0000000000..cdf4b9a544
--- /dev/null
+++ b/packages/backend/src/models/schema/note.ts
@@ -0,0 +1,183 @@
+export const packedNoteSchema = {
+ type: 'object',
+ properties: {
+ id: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ example: 'xxxxxxxxxx',
+ },
+ createdAt: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'date-time',
+ },
+ text: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ cw: {
+ type: 'string',
+ optional: true, nullable: true,
+ },
+ userId: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ },
+ user: {
+ type: 'object',
+ ref: 'UserLite',
+ optional: false, nullable: false,
+ },
+ replyId: {
+ type: 'string',
+ optional: true, nullable: true,
+ format: 'id',
+ example: 'xxxxxxxxxx',
+ },
+ renoteId: {
+ type: 'string',
+ optional: true, nullable: true,
+ format: 'id',
+ example: 'xxxxxxxxxx',
+ },
+ reply: {
+ type: 'object',
+ optional: true, nullable: true,
+ ref: 'Note',
+ },
+ renote: {
+ type: 'object',
+ optional: true, nullable: true,
+ ref: 'Note',
+ },
+ isHidden: {
+ type: 'boolean',
+ optional: true, nullable: false,
+ },
+ visibility: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
+ mentions: {
+ type: 'array',
+ optional: true, nullable: false,
+ items: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ },
+ },
+ visibleUserIds: {
+ type: 'array',
+ optional: true, nullable: false,
+ items: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ },
+ },
+ fileIds: {
+ type: 'array',
+ optional: true, nullable: false,
+ items: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ },
+ },
+ files: {
+ type: 'array',
+ optional: true, nullable: false,
+ items: {
+ type: 'object',
+ optional: false, nullable: false,
+ ref: 'DriveFile',
+ },
+ },
+ tags: {
+ type: 'array',
+ optional: true, nullable: false,
+ items: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
+ },
+ poll: {
+ type: 'object',
+ optional: true, nullable: true,
+ },
+ channelId: {
+ type: 'string',
+ optional: true, nullable: true,
+ format: 'id',
+ example: 'xxxxxxxxxx',
+ },
+ channel: {
+ type: 'object',
+ optional: true, nullable: true,
+ items: {
+ type: 'object',
+ optional: false, nullable: false,
+ properties: {
+ id: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
+ name: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ },
+ },
+ },
+ localOnly: {
+ type: 'boolean',
+ optional: true, nullable: false,
+ },
+ emojis: {
+ type: 'array',
+ optional: false, nullable: false,
+ items: {
+ type: 'object',
+ optional: false, nullable: false,
+ properties: {
+ name: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
+ url: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ },
+ },
+ },
+ reactions: {
+ type: 'object',
+ optional: false, nullable: false,
+ },
+ renoteCount: {
+ type: 'number',
+ optional: false, nullable: false,
+ },
+ repliesCount: {
+ type: 'number',
+ optional: false, nullable: false,
+ },
+ uri: {
+ type: 'string',
+ optional: true, nullable: false,
+ },
+ url: {
+ type: 'string',
+ optional: true, nullable: false,
+ },
+
+ myReaction: {
+ type: 'object',
+ optional: true, nullable: true,
+ },
+ },
+} as const;
diff --git a/packages/backend/src/models/schema/notification.ts b/packages/backend/src/models/schema/notification.ts
new file mode 100644
index 0000000000..f3c293c480
--- /dev/null
+++ b/packages/backend/src/models/schema/notification.ts
@@ -0,0 +1,66 @@
+import { notificationTypes } from "@/types";
+
+export const packedNotificationSchema = {
+ type: 'object',
+ properties: {
+ id: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ example: 'xxxxxxxxxx',
+ },
+ createdAt: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'date-time',
+ },
+ isRead: {
+ type: 'boolean',
+ optional: false, nullable: false,
+ },
+ type: {
+ type: 'string',
+ optional: false, nullable: false,
+ enum: [...notificationTypes],
+ },
+ user: {
+ type: 'object',
+ ref: 'UserLite',
+ optional: true, nullable: true,
+ },
+ userId: {
+ type: 'string',
+ optional: true, nullable: true,
+ format: 'id',
+ },
+ note: {
+ type: 'object',
+ ref: 'Note',
+ optional: true, nullable: true,
+ },
+ reaction: {
+ type: 'string',
+ optional: true, nullable: true,
+ },
+ choice: {
+ type: 'number',
+ optional: true, nullable: true,
+ },
+ invitation: {
+ type: 'object',
+ optional: true, nullable: true,
+ },
+ body: {
+ type: 'string',
+ optional: true, nullable: true,
+ },
+ header: {
+ type: 'string',
+ optional: true, nullable: true,
+ },
+ icon: {
+ type: 'string',
+ optional: true, nullable: true,
+ },
+ },
+} as const;
diff --git a/packages/backend/src/models/schema/page.ts b/packages/backend/src/models/schema/page.ts
new file mode 100644
index 0000000000..55ba3ce7f7
--- /dev/null
+++ b/packages/backend/src/models/schema/page.ts
@@ -0,0 +1,51 @@
+export const packedPageSchema = {
+ type: 'object',
+ properties: {
+ id: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ example: 'xxxxxxxxxx',
+ },
+ createdAt: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'date-time',
+ },
+ updatedAt: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'date-time',
+ },
+ title: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
+ name: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
+ summary: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ content: {
+ type: 'array',
+ optional: false, nullable: false,
+ },
+ variables: {
+ type: 'array',
+ optional: false, nullable: false,
+ },
+ userId: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ },
+ user: {
+ type: 'object',
+ ref: 'UserLite',
+ optional: false, nullable: false,
+ },
+ },
+} as const;
diff --git a/packages/backend/src/models/schema/queue.ts b/packages/backend/src/models/schema/queue.ts
new file mode 100644
index 0000000000..7ceeda26af
--- /dev/null
+++ b/packages/backend/src/models/schema/queue.ts
@@ -0,0 +1,25 @@
+export const packedQueueCountSchema = {
+ type: 'object',
+ properties: {
+ waiting: {
+ type: 'number',
+ optional: false, nullable: false,
+ },
+ active: {
+ type: 'number',
+ optional: false, nullable: false,
+ },
+ completed: {
+ type: 'number',
+ optional: false, nullable: false,
+ },
+ failed: {
+ type: 'number',
+ optional: false, nullable: false,
+ },
+ delayed: {
+ type: 'number',
+ optional: false, nullable: false,
+ },
+ },
+} as const;
diff --git a/packages/backend/src/models/schema/user-group.ts b/packages/backend/src/models/schema/user-group.ts
new file mode 100644
index 0000000000..a73bf82bb8
--- /dev/null
+++ b/packages/backend/src/models/schema/user-group.ts
@@ -0,0 +1,34 @@
+export const packedUserGroupSchema = {
+ type: 'object',
+ properties: {
+ id: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ example: 'xxxxxxxxxx',
+ },
+ createdAt: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'date-time',
+ },
+ name: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
+ ownerId: {
+ type: 'string',
+ nullable: false, optional: false,
+ format: 'id',
+ },
+ userIds: {
+ type: 'array',
+ nullable: false, optional: true,
+ items: {
+ type: 'string',
+ nullable: false, optional: false,
+ format: 'id',
+ },
+ },
+ },
+} as const;
diff --git a/packages/backend/src/models/schema/user-list.ts b/packages/backend/src/models/schema/user-list.ts
new file mode 100644
index 0000000000..3ba5dc4a8a
--- /dev/null
+++ b/packages/backend/src/models/schema/user-list.ts
@@ -0,0 +1,29 @@
+export const packedUserListSchema = {
+ type: 'object',
+ properties: {
+ id: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ example: 'xxxxxxxxxx',
+ },
+ createdAt: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'date-time',
+ },
+ name: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
+ userIds: {
+ type: 'array',
+ nullable: false, optional: true,
+ items: {
+ type: 'string',
+ nullable: false, optional: false,
+ format: 'id',
+ },
+ },
+ },
+} as const;
diff --git a/packages/backend/src/models/schema/user.ts b/packages/backend/src/models/schema/user.ts
new file mode 100644
index 0000000000..616bedc0dc
--- /dev/null
+++ b/packages/backend/src/models/schema/user.ts
@@ -0,0 +1,467 @@
+export const packedUserLiteSchema = {
+ type: 'object',
+ properties: {
+ id: {
+ type: 'string',
+ nullable: false, optional: false,
+ format: 'id',
+ example: 'xxxxxxxxxx',
+ },
+ name: {
+ type: 'string',
+ nullable: true, optional: false,
+ example: '藍',
+ },
+ username: {
+ type: 'string',
+ nullable: false, optional: false,
+ example: 'ai',
+ },
+ host: {
+ type: 'string',
+ nullable: true, optional: false,
+ example: 'misskey.example.com',
+ },
+ avatarUrl: {
+ type: 'string',
+ format: 'url',
+ nullable: true, optional: false,
+ },
+ avatarBlurhash: {
+ type: 'any',
+ nullable: true, optional: false,
+ },
+ avatarColor: {
+ type: 'any',
+ nullable: true, optional: false,
+ default: null,
+ },
+ isAdmin: {
+ type: 'boolean',
+ nullable: false, optional: true,
+ default: false,
+ },
+ isModerator: {
+ type: 'boolean',
+ nullable: false, optional: true,
+ default: false,
+ },
+ isBot: {
+ type: 'boolean',
+ nullable: false, optional: true,
+ },
+ isCat: {
+ type: 'boolean',
+ nullable: false, optional: true,
+ },
+ emojis: {
+ type: 'array',
+ nullable: false, optional: false,
+ items: {
+ type: 'object',
+ nullable: false, optional: false,
+ properties: {
+ name: {
+ type: 'string',
+ nullable: false, optional: false,
+ },
+ url: {
+ type: 'string',
+ nullable: false, optional: false,
+ format: 'url',
+ },
+ },
+ },
+ },
+ onlineStatus: {
+ type: 'string',
+ format: 'url',
+ nullable: true, optional: false,
+ enum: ['unknown', 'online', 'active', 'offline'],
+ },
+ },
+} as const;
+
+export const packedUserDetailedNotMeOnlySchema = {
+ type: 'object',
+ properties: {
+ url: {
+ type: 'string',
+ format: 'url',
+ nullable: true, optional: false,
+ },
+ uri: {
+ type: 'string',
+ format: 'uri',
+ nullable: true, optional: false,
+ },
+ createdAt: {
+ type: 'string',
+ nullable: false, optional: false,
+ format: 'date-time',
+ },
+ updatedAt: {
+ type: 'string',
+ nullable: true, optional: false,
+ format: 'date-time',
+ },
+ lastFetchedAt: {
+ type: 'string',
+ nullable: true, optional: false,
+ format: 'date-time',
+ },
+ bannerUrl: {
+ type: 'string',
+ format: 'url',
+ nullable: true, optional: false,
+ },
+ bannerBlurhash: {
+ type: 'any',
+ nullable: true, optional: false,
+ },
+ bannerColor: {
+ type: 'any',
+ nullable: true, optional: false,
+ default: null,
+ },
+ isLocked: {
+ type: 'boolean',
+ nullable: false, optional: false,
+ },
+ isSilenced: {
+ type: 'boolean',
+ nullable: false, optional: false,
+ },
+ isSuspended: {
+ type: 'boolean',
+ nullable: false, optional: false,
+ example: false,
+ },
+ description: {
+ type: 'string',
+ nullable: true, optional: false,
+ example: 'Hi masters, I am Ai!',
+ },
+ location: {
+ type: 'string',
+ nullable: true, optional: false,
+ },
+ birthday: {
+ type: 'string',
+ nullable: true, optional: false,
+ example: '2018-03-12',
+ },
+ lang: {
+ type: 'string',
+ nullable: true, optional: false,
+ example: 'ja-JP',
+ },
+ fields: {
+ type: 'array',
+ nullable: false, optional: false,
+ items: {
+ type: 'object',
+ nullable: false, optional: false,
+ properties: {
+ name: {
+ type: 'string',
+ nullable: false, optional: false,
+ },
+ value: {
+ type: 'string',
+ nullable: false, optional: false,
+ },
+ },
+ maxLength: 4,
+ },
+ },
+ followersCount: {
+ type: 'number',
+ nullable: false, optional: false,
+ },
+ followingCount: {
+ type: 'number',
+ nullable: false, optional: false,
+ },
+ notesCount: {
+ type: 'number',
+ nullable: false, optional: false,
+ },
+ pinnedNoteIds: {
+ type: 'array',
+ nullable: false, optional: false,
+ items: {
+ type: 'string',
+ nullable: false, optional: false,
+ format: 'id',
+ },
+ },
+ pinnedNotes: {
+ type: 'array',
+ nullable: false, optional: false,
+ items: {
+ type: 'object',
+ nullable: false, optional: false,
+ ref: 'Note',
+ },
+ },
+ pinnedPageId: {
+ type: 'string',
+ nullable: true, optional: false,
+ },
+ pinnedPage: {
+ type: 'object',
+ nullable: true, optional: false,
+ ref: 'Page',
+ },
+ publicReactions: {
+ type: 'boolean',
+ nullable: false, optional: false,
+ },
+ twoFactorEnabled: {
+ type: 'boolean',
+ nullable: false, optional: false,
+ default: false,
+ },
+ usePasswordLessLogin: {
+ type: 'boolean',
+ nullable: false, optional: false,
+ default: false,
+ },
+ securityKeys: {
+ type: 'boolean',
+ nullable: false, optional: false,
+ default: false,
+ },
+ //#region relations
+ isFollowing: {
+ type: 'boolean',
+ nullable: false, optional: true,
+ },
+ isFollowed: {
+ type: 'boolean',
+ nullable: false, optional: true,
+ },
+ hasPendingFollowRequestFromYou: {
+ type: 'boolean',
+ nullable: false, optional: true,
+ },
+ hasPendingFollowRequestToYou: {
+ type: 'boolean',
+ nullable: false, optional: true,
+ },
+ isBlocking: {
+ type: 'boolean',
+ nullable: false, optional: true,
+ },
+ isBlocked: {
+ type: 'boolean',
+ nullable: false, optional: true,
+ },
+ isMuted: {
+ type: 'boolean',
+ nullable: false, optional: true,
+ },
+ //#endregion
+ },
+} as const;
+
+export const packedMeDetailedOnlySchema = {
+ type: 'object',
+ properties: {
+ avatarId: {
+ type: 'string',
+ nullable: true, optional: false,
+ format: 'id',
+ },
+ bannerId: {
+ type: 'string',
+ nullable: true, optional: false,
+ format: 'id',
+ },
+ injectFeaturedNote: {
+ type: 'boolean',
+ nullable: true, optional: false,
+ },
+ receiveAnnouncementEmail: {
+ type: 'boolean',
+ nullable: true, optional: false,
+ },
+ alwaysMarkNsfw: {
+ type: 'boolean',
+ nullable: true, optional: false,
+ },
+ carefulBot: {
+ type: 'boolean',
+ nullable: true, optional: false,
+ },
+ autoAcceptFollowed: {
+ type: 'boolean',
+ nullable: true, optional: false,
+ },
+ noCrawle: {
+ type: 'boolean',
+ nullable: true, optional: false,
+ },
+ isExplorable: {
+ type: 'boolean',
+ nullable: false, optional: false,
+ },
+ isDeleted: {
+ type: 'boolean',
+ nullable: false, optional: false,
+ },
+ hideOnlineStatus: {
+ type: 'boolean',
+ nullable: false, optional: false,
+ },
+ hasUnreadSpecifiedNotes: {
+ type: 'boolean',
+ nullable: false, optional: false,
+ },
+ hasUnreadMentions: {
+ type: 'boolean',
+ nullable: false, optional: false,
+ },
+ hasUnreadAnnouncement: {
+ type: 'boolean',
+ nullable: false, optional: false,
+ },
+ hasUnreadAntenna: {
+ type: 'boolean',
+ nullable: false, optional: false,
+ },
+ hasUnreadChannel: {
+ type: 'boolean',
+ nullable: false, optional: false,
+ },
+ hasUnreadMessagingMessage: {
+ type: 'boolean',
+ nullable: false, optional: false,
+ },
+ hasUnreadNotification: {
+ type: 'boolean',
+ nullable: false, optional: false,
+ },
+ hasPendingReceivedFollowRequest: {
+ type: 'boolean',
+ nullable: false, optional: false,
+ },
+ integrations: {
+ type: 'object',
+ nullable: true, optional: false,
+ },
+ mutedWords: {
+ type: 'array',
+ nullable: false, optional: false,
+ items: {
+ type: 'array',
+ nullable: false, optional: false,
+ items: {
+ type: 'string',
+ nullable: false, optional: false,
+ },
+ },
+ },
+ mutedInstances: {
+ type: 'array',
+ nullable: true, optional: false,
+ items: {
+ type: 'string',
+ nullable: false, optional: false,
+ },
+ },
+ mutingNotificationTypes: {
+ type: 'array',
+ nullable: true, optional: false,
+ items: {
+ type: 'string',
+ nullable: false, optional: false,
+ },
+ },
+ emailNotificationTypes: {
+ type: 'array',
+ nullable: true, optional: false,
+ items: {
+ type: 'string',
+ nullable: false, optional: false,
+ },
+ },
+ //#region secrets
+ email: {
+ type: 'string',
+ nullable: true, optional: true,
+ },
+ emailVerified: {
+ type: 'boolean',
+ nullable: true, optional: true,
+ },
+ securityKeysList: {
+ type: 'array',
+ nullable: false, optional: true,
+ items: {
+ type: 'object',
+ nullable: false, optional: false,
+ },
+ },
+ //#endregion
+ },
+} as const;
+
+export const packedUserDetailedNotMeSchema = {
+ type: 'object',
+ allOf: [
+ {
+ type: 'object',
+ ref: 'UserLite',
+ },
+ {
+ type: 'object',
+ ref: 'UserDetailedNotMeOnly',
+ },
+ ],
+} as const;
+
+export const packedMeDetailedSchema = {
+ type: 'object',
+ allOf: [
+ {
+ type: 'object',
+ ref: 'UserLite',
+ },
+ {
+ type: 'object',
+ ref: 'UserDetailedNotMeOnly',
+ },
+ {
+ type: 'object',
+ ref: 'MeDetailedOnly',
+ },
+ ],
+} as const;
+
+export const packedUserDetailedSchema = {
+ oneOf: [
+ {
+ type: 'object',
+ ref: 'UserDetailedNotMe',
+ },
+ {
+ type: 'object',
+ ref: 'MeDetailed',
+ },
+ ],
+} as const;
+
+export const packedUserSchema = {
+ oneOf: [
+ {
+ type: 'object',
+ ref: 'UserLite',
+ },
+ {
+ type: 'object',
+ ref: 'UserDetailed',
+ },
+ ],
+} as const;