summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortamaina <tamaina@hotmail.co.jp>2021-09-12 01:12:23 +0900
committerGitHub <noreply@github.com>2021-09-12 01:12:23 +0900
commit53f3b779bf16abcda4f6e026c51384f3b8fbcc62 (patch)
tree7c4bfeb42a3fdbc9e2fa36771a2bc2b67a509301 /src
parentRevert "fix: use master branch when build docker image" (diff)
downloadsharkey-53f3b779bf16abcda4f6e026c51384f3b8fbcc62.tar.gz
sharkey-53f3b779bf16abcda4f6e026c51384f3b8fbcc62.tar.bz2
sharkey-53f3b779bf16abcda4f6e026c51384f3b8fbcc62.zip
refactor: Expand schema (#7772)
* packedNotificationSchemaを更新 * read:gallery, write:gallery, read:gallery-likes, write:gallery-likesに翻訳を追加 * fix * add header, choice, invitation * test * fix * yatta * remove no longer needed "as PackedUser/PackedNote" * clean up * add simple-schema * fix lint * define items in full Schema * revert https://github.com/misskey-dev/misskey/pull/7772#discussion_r706627736 * user packとnote packの型不整合を修正
Diffstat (limited to 'src')
-rw-r--r--src/misc/schema.ts70
-rw-r--r--src/misc/simple-schema.ts15
-rw-r--r--src/models/repositories/blocking.ts2
-rw-r--r--src/models/repositories/clip.ts2
-rw-r--r--src/models/repositories/drive-file.ts4
-rw-r--r--src/models/repositories/drive-folder.ts2
-rw-r--r--src/models/repositories/following.ts4
-rw-r--r--src/models/repositories/gallery-post.ts6
-rw-r--r--src/models/repositories/messaging-message.ts8
-rw-r--r--src/models/repositories/muting.ts2
-rw-r--r--src/models/repositories/note-favorite.ts2
-rw-r--r--src/models/repositories/note-reaction.ts2
-rw-r--r--src/models/repositories/note.ts33
-rw-r--r--src/models/repositories/notification.ts4
-rw-r--r--src/models/repositories/page.ts2
-rw-r--r--src/models/repositories/user.ts34
-rw-r--r--src/server/api/endpoints.ts4
-rw-r--r--src/server/api/openapi/schemas.ts49
-rw-r--r--src/server/api/stream/channels/global-timeline.ts2
-rw-r--r--src/server/api/stream/channels/home-timeline.ts2
-rw-r--r--src/server/api/stream/channels/hybrid-timeline.ts5
-rw-r--r--src/server/api/stream/channels/local-timeline.ts5
-rw-r--r--src/server/api/stream/index.ts4
-rw-r--r--src/services/chart/core.ts14
24 files changed, 148 insertions, 129 deletions
diff --git a/src/misc/schema.ts b/src/misc/schema.ts
index e14e6e0dd7..d27c9eff99 100644
--- a/src/misc/schema.ts
+++ b/src/misc/schema.ts
@@ -1,15 +1,57 @@
-export type Schema = {
- type: 'boolean' | 'number' | 'string' | 'array' | 'object' | 'any';
- nullable: boolean;
- optional: boolean;
+import { SimpleObj, SimpleSchema } from './simple-schema';
+import { packedUserSchema } from '@/models/repositories/user';
+import { packedNoteSchema } from '@/models/repositories/note';
+import { packedUserListSchema } from '@/models/repositories/user-list';
+import { packedAppSchema } from '@/models/repositories/app';
+import { packedMessagingMessageSchema } from '@/models/repositories/messaging-message';
+import { packedNotificationSchema } from '@/models/repositories/notification';
+import { packedDriveFileSchema } from '@/models/repositories/drive-file';
+import { packedDriveFolderSchema } from '@/models/repositories/drive-folder';
+import { packedFollowingSchema } from '@/models/repositories/following';
+import { packedMutingSchema } from '@/models/repositories/muting';
+import { packedBlockingSchema } from '@/models/repositories/blocking';
+import { packedNoteReactionSchema } from '@/models/repositories/note-reaction';
+import { packedHashtagSchema } from '@/models/repositories/hashtag';
+import { packedPageSchema } from '@/models/repositories/page';
+import { packedUserGroupSchema } from '@/models/repositories/user-group';
+import { packedNoteFavoriteSchema } from '@/models/repositories/note-favorite';
+import { packedChannelSchema } from '@/models/repositories/channel';
+import { packedAntennaSchema } from '@/models/repositories/antenna';
+import { packedClipSchema } from '@/models/repositories/clip';
+import { packedFederationInstanceSchema } from '@/models/repositories/federation-instance';
+import { packedQueueCountSchema } from '@/models/repositories/queue';
+import { packedGalleryPostSchema } from '@/models/repositories/gallery-post';
+
+export const refs = {
+ User: packedUserSchema,
+ UserList: packedUserListSchema,
+ UserGroup: packedUserGroupSchema,
+ App: packedAppSchema,
+ MessagingMessage: packedMessagingMessageSchema,
+ Note: packedNoteSchema,
+ NoteReaction: packedNoteReactionSchema,
+ NoteFavorite: packedNoteFavoriteSchema,
+ Notification: packedNotificationSchema,
+ DriveFile: packedDriveFileSchema,
+ DriveFolder: packedDriveFolderSchema,
+ Following: packedFollowingSchema,
+ Muting: packedMutingSchema,
+ Blocking: packedBlockingSchema,
+ Hashtag: packedHashtagSchema,
+ Page: packedPageSchema,
+ Channel: packedChannelSchema,
+ QueueCount: packedQueueCountSchema,
+ Antenna: packedAntennaSchema,
+ Clip: packedClipSchema,
+ FederationInstance: packedFederationInstanceSchema,
+ GalleryPost: packedGalleryPostSchema,
+};
+
+export interface Schema extends SimpleSchema {
items?: Schema;
properties?: Obj;
- description?: string;
- example?: any;
- format?: string;
- ref?: string;
- enum?: string[];
-};
+ ref?: keyof typeof refs;
+}
type NonUndefinedPropertyNames<T extends Obj> = {
[K in keyof T]: T[K]['optional'] extends true ? never : K
@@ -22,7 +64,7 @@ type UndefinedPropertyNames<T extends Obj> = {
type OnlyRequired<T extends Obj> = Pick<T, NonUndefinedPropertyNames<T>>;
type OnlyOptional<T extends Obj> = Pick<T, UndefinedPropertyNames<T>>;
-export type Obj = { [key: string]: Schema };
+export interface Obj extends SimpleObj { [key: string]: Schema; }
export type ObjType<s extends Obj> =
{ [P in keyof OnlyOptional<s>]?: SchemaType<s[P]> } &
@@ -48,6 +90,10 @@ export type SchemaType<p extends Schema> =
p['type'] extends 'string' ? NullOrUndefined<p, string> :
p['type'] extends 'boolean' ? NullOrUndefined<p, boolean> :
p['type'] extends 'array' ? NullOrUndefined<p, MyType<NonNullable<p['items']>>[]> :
- p['type'] extends 'object' ? NullOrUndefined<p, ObjType<NonNullable<p['properties']>>> :
+ p['type'] extends 'object' ? (
+ p['ref'] extends keyof typeof refs
+ ? NullOrUndefined<p, SchemaType<typeof refs[p['ref']]>>
+ : NullOrUndefined<p, ObjType<NonNullable<p['properties']>>>
+ ) :
p['type'] extends 'any' ? NullOrUndefined<p, any> :
any;
diff --git a/src/misc/simple-schema.ts b/src/misc/simple-schema.ts
new file mode 100644
index 0000000000..abbb348e24
--- /dev/null
+++ b/src/misc/simple-schema.ts
@@ -0,0 +1,15 @@
+export interface SimpleSchema {
+ type: 'boolean' | 'number' | 'string' | 'array' | 'object' | 'any';
+ nullable: boolean;
+ optional: boolean;
+ items?: SimpleSchema;
+ properties?: SimpleObj;
+ description?: string;
+ example?: any;
+ format?: string;
+ ref?: string;
+ enum?: string[];
+ default?: boolean | null;
+}
+
+export interface SimpleObj { [key: string]: SimpleSchema; }
diff --git a/src/models/repositories/blocking.ts b/src/models/repositories/blocking.ts
index dd3a10905c..515b3a6b16 100644
--- a/src/models/repositories/blocking.ts
+++ b/src/models/repositories/blocking.ts
@@ -56,7 +56,7 @@ export const packedBlockingSchema = {
blockee: {
type: 'object' as const,
optional: false as const, nullable: false as const,
- ref: 'User',
+ ref: 'User' as const,
},
}
};
diff --git a/src/models/repositories/clip.ts b/src/models/repositories/clip.ts
index 49dc3a332e..e3d718bef4 100644
--- a/src/models/repositories/clip.ts
+++ b/src/models/repositories/clip.ts
@@ -53,7 +53,7 @@ export const packedClipSchema = {
},
user: {
type: 'object' as const,
- ref: 'User',
+ ref: 'User' as const,
optional: false as const, nullable: false as const,
},
name: {
diff --git a/src/models/repositories/drive-file.ts b/src/models/repositories/drive-file.ts
index 42a60ff03c..63bd020cbe 100644
--- a/src/models/repositories/drive-file.ts
+++ b/src/models/repositories/drive-file.ts
@@ -234,7 +234,7 @@ export const packedDriveFileSchema = {
folder: {
type: 'object' as const,
optional: true as const, nullable: true as const,
- ref: 'DriveFolder'
+ ref: 'DriveFolder' as const,
},
userId: {
type: 'string' as const,
@@ -245,7 +245,7 @@ export const packedDriveFileSchema = {
user: {
type: 'object' as const,
optional: true as const, nullable: true as const,
- ref: 'User'
+ ref: 'User' as const,
}
},
};
diff --git a/src/models/repositories/drive-folder.ts b/src/models/repositories/drive-folder.ts
index 4228284f82..bc73018f29 100644
--- a/src/models/repositories/drive-folder.ts
+++ b/src/models/repositories/drive-folder.ts
@@ -87,7 +87,7 @@ export const packedDriveFolderSchema = {
parent: {
type: 'object' as const,
optional: true as const, nullable: true as const,
- ref: 'DriveFolder'
+ ref: 'DriveFolder' as const,
},
},
};
diff --git a/src/models/repositories/following.ts b/src/models/repositories/following.ts
index 3bb120bc4b..24ddd0d676 100644
--- a/src/models/repositories/following.ts
+++ b/src/models/repositories/following.ts
@@ -110,7 +110,7 @@ export const packedFollowingSchema = {
followee: {
type: 'object' as const,
optional: true as const, nullable: false as const,
- ref: 'User',
+ ref: 'User' as const,
},
followerId: {
type: 'string' as const,
@@ -120,7 +120,7 @@ export const packedFollowingSchema = {
follower: {
type: 'object' as const,
optional: true as const, nullable: false as const,
- ref: 'User',
+ ref: 'User' as const,
},
}
};
diff --git a/src/models/repositories/gallery-post.ts b/src/models/repositories/gallery-post.ts
index 03edb35213..afa22e9edf 100644
--- a/src/models/repositories/gallery-post.ts
+++ b/src/models/repositories/gallery-post.ts
@@ -1,6 +1,6 @@
import { EntityRepository, Repository } from 'typeorm';
import { GalleryPost } from '@/models/entities/gallery-post';
-import { SchemaType } from '../../misc/schema';
+import { SchemaType } from '@/misc/schema';
import { Users, DriveFiles, GalleryLikes } from '../index';
import { awaitAll } from '@/prelude/await-all';
import { User } from '@/models/entities/user';
@@ -76,7 +76,7 @@ export const packedGalleryPostSchema = {
},
user: {
type: 'object' as const,
- ref: 'User',
+ ref: 'User' as const,
optional: false as const, nullable: false as const,
},
fileIds: {
@@ -94,7 +94,7 @@ export const packedGalleryPostSchema = {
items: {
type: 'object' as const,
optional: false as const, nullable: false as const,
- ref: 'DriveFile'
+ ref: 'DriveFile' as const,
}
},
tags: {
diff --git a/src/models/repositories/messaging-message.ts b/src/models/repositories/messaging-message.ts
index 1a4a8eecc4..f97905af2f 100644
--- a/src/models/repositories/messaging-message.ts
+++ b/src/models/repositories/messaging-message.ts
@@ -67,7 +67,7 @@ export const packedMessagingMessageSchema = {
},
user: {
type: 'object' as const,
- ref: 'User',
+ ref: 'User' as const,
optional: true as const, nullable: false as const,
},
text: {
@@ -82,7 +82,7 @@ export const packedMessagingMessageSchema = {
file: {
type: 'object' as const,
optional: true as const, nullable: true as const,
- ref: 'DriveFile',
+ ref: 'DriveFile' as const,
},
recipientId: {
type: 'string' as const,
@@ -92,7 +92,7 @@ export const packedMessagingMessageSchema = {
recipient: {
type: 'object' as const,
optional: true as const, nullable: true as const,
- ref: 'User'
+ ref: 'User' as const,
},
groupId: {
type: 'string' as const,
@@ -102,7 +102,7 @@ export const packedMessagingMessageSchema = {
group: {
type: 'object' as const,
optional: true as const, nullable: true as const,
- ref: 'UserGroup'
+ ref: 'UserGroup' as const,
},
isRead: {
type: 'boolean' as const,
diff --git a/src/models/repositories/muting.ts b/src/models/repositories/muting.ts
index e46f4ae448..d957b1792d 100644
--- a/src/models/repositories/muting.ts
+++ b/src/models/repositories/muting.ts
@@ -56,7 +56,7 @@ export const packedMutingSchema = {
mutee: {
type: 'object' as const,
optional: false as const, nullable: false as const,
- ref: 'User',
+ ref: 'User' as const,
},
}
};
diff --git a/src/models/repositories/note-favorite.ts b/src/models/repositories/note-favorite.ts
index 3248c32ded..47586a9116 100644
--- a/src/models/repositories/note-favorite.ts
+++ b/src/models/repositories/note-favorite.ts
@@ -45,7 +45,7 @@ export const packedNoteFavoriteSchema = {
note: {
type: 'object' as const,
optional: false as const, nullable: false as const,
- ref: 'Note',
+ ref: 'Note' as const,
},
noteId: {
type: 'string' as const,
diff --git a/src/models/repositories/note-reaction.ts b/src/models/repositories/note-reaction.ts
index c349edf182..e73a832109 100644
--- a/src/models/repositories/note-reaction.ts
+++ b/src/models/repositories/note-reaction.ts
@@ -42,7 +42,7 @@ export const packedNoteReactionSchema = {
user: {
type: 'object' as const,
optional: false as const, nullable: false as const,
- ref: 'User',
+ ref: 'User' as const,
},
type: {
type: 'string' as const,
diff --git a/src/models/repositories/note.ts b/src/models/repositories/note.ts
index 9e0f5e55f0..376a09d0c6 100644
--- a/src/models/repositories/note.ts
+++ b/src/models/repositories/note.ts
@@ -95,7 +95,7 @@ export class NoteRepository extends Repository<Note> {
hide = true;
} else if (meId === packedNote.userId) {
hide = false;
- } else if (packedNote.reply && (meId === (packedNote.reply as PackedNote).userId)) {
+ } else if (packedNote.reply && (meId === packedNote.reply.userId)) {
// 自分の投稿に対するリプライ
hide = false;
} else if (packedNote.mentions && packedNote.mentions.some(id => meId === id)) {
@@ -353,7 +353,7 @@ export const packedNoteSchema = {
},
user: {
type: 'object' as const,
- ref: 'User',
+ ref: 'User' as const,
optional: false as const, nullable: false as const,
},
replyId: {
@@ -371,12 +371,12 @@ export const packedNoteSchema = {
reply: {
type: 'object' as const,
optional: true as const, nullable: true as const,
- ref: 'Note'
+ ref: 'Note' as const,
},
renote: {
type: 'object' as const,
optional: true as const, nullable: true as const,
- ref: 'Note'
+ ref: 'Note' as const,
},
viaMobile: {
type: 'boolean' as const,
@@ -423,7 +423,7 @@ export const packedNoteSchema = {
items: {
type: 'object' as const,
optional: false as const, nullable: false as const,
- ref: 'DriveFile'
+ ref: 'DriveFile' as const,
}
},
tags: {
@@ -447,11 +447,24 @@ export const packedNoteSchema = {
channel: {
type: 'object' as const,
optional: true as const, nullable: true as const,
- ref: 'Channel'
+ 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: false as const, nullable: true as const,
+ optional: true as const, nullable: false as const,
},
emojis: {
type: 'array' as const,
@@ -466,7 +479,7 @@ export const packedNoteSchema = {
},
url: {
type: 'string' as const,
- optional: false as const, nullable: false as const,
+ optional: false as const, nullable: true as const,
},
},
},
@@ -485,11 +498,11 @@ export const packedNoteSchema = {
},
uri: {
type: 'string' as const,
- optional: false as const, nullable: true as const,
+ optional: true as const, nullable: false as const,
},
url: {
type: 'string' as const,
- optional: false as const, nullable: true as const,
+ optional: true as const, nullable: false as const,
},
myReaction: {
diff --git a/src/models/repositories/notification.ts b/src/models/repositories/notification.ts
index ed9de7ef4c..b7f9e3643c 100644
--- a/src/models/repositories/notification.ts
+++ b/src/models/repositories/notification.ts
@@ -136,7 +136,7 @@ export const packedNotificationSchema = {
},
user: {
type: 'object' as const,
- ref: 'User',
+ ref: 'User' as const,
optional: true as const, nullable: true as const,
},
userId: {
@@ -146,7 +146,7 @@ export const packedNotificationSchema = {
},
note: {
type: 'object' as const,
- ref: 'Note',
+ ref: 'Note' as const,
optional: true as const, nullable: true as const,
},
reaction: {
diff --git a/src/models/repositories/page.ts b/src/models/repositories/page.ts
index 757aaa5a3f..1a61e2c99c 100644
--- a/src/models/repositories/page.ts
+++ b/src/models/repositories/page.ts
@@ -137,7 +137,7 @@ export const packedPageSchema = {
},
user: {
type: 'object' as const,
- ref: 'User',
+ ref: 'User' as const,
optional: false as const, nullable: false as const,
},
}
diff --git a/src/models/repositories/user.ts b/src/models/repositories/user.ts
index d4bb995ce2..39c90cf5ed 100644
--- a/src/models/repositories/user.ts
+++ b/src/models/repositories/user.ts
@@ -375,12 +375,12 @@ export const packedUserSchema = {
},
isAdmin: {
type: 'boolean' as const,
- nullable: false as const, optional: false as const,
+ nullable: false as const, optional: true as const,
default: false
},
isModerator: {
type: 'boolean' as const,
- nullable: false as const, optional: false as const,
+ nullable: false as const, optional: true as const,
default: false
},
isBot: {
@@ -402,23 +402,11 @@ export const packedUserSchema = {
type: 'string' as const,
nullable: false as const, optional: false as const
},
- host: {
- type: 'string' as const,
- nullable: true as const, optional: false as const
- },
url: {
type: 'string' as const,
nullable: false as const, optional: false as const,
format: 'url'
},
- aliases: {
- type: 'array' as const,
- nullable: false as const, optional: false as const,
- items: {
- type: 'string' as const,
- nullable: false as const, optional: false as const
- }
- }
}
}
},
@@ -457,7 +445,7 @@ export const packedUserSchema = {
},
isSuspended: {
type: 'boolean' as const,
- nullable: false as const, optional: false as const,
+ nullable: false as const, optional: true as const,
example: false
},
description: {
@@ -476,7 +464,7 @@ export const packedUserSchema = {
},
fields: {
type: 'array' as const,
- nullable: false as const, optional: false as const,
+ nullable: false as const, optional: true as const,
items: {
type: 'object' as const,
nullable: false as const, optional: false as const,
@@ -520,31 +508,31 @@ export const packedUserSchema = {
items: {
type: 'object' as const,
nullable: false as const, optional: false as const,
- ref: 'Note'
+ ref: 'Note' as const,
}
},
pinnedPageId: {
type: 'string' as const,
- nullable: true as const, optional: false as const
+ nullable: true as const, optional: true as const
},
pinnedPage: {
type: 'object' as const,
- nullable: true as const, optional: false as const,
- ref: 'Page'
+ nullable: true as const, optional: true as const,
+ ref: 'Page' as const,
},
twoFactorEnabled: {
type: 'boolean' as const,
- nullable: false as const, optional: false as const,
+ nullable: false as const, optional: true as const,
default: false
},
usePasswordLessLogin: {
type: 'boolean' as const,
- nullable: false as const, optional: false as const,
+ nullable: false as const, optional: true as const,
default: false
},
securityKeys: {
type: 'boolean' as const,
- nullable: false as const, optional: false as const,
+ nullable: false as const, optional: true as const,
default: false
},
avatarId: {
diff --git a/src/server/api/endpoints.ts b/src/server/api/endpoints.ts
index 640b14ed6a..6d9d2b0782 100644
--- a/src/server/api/endpoints.ts
+++ b/src/server/api/endpoints.ts
@@ -3,7 +3,7 @@ import { dirname } from 'path';
import { Context } from 'cafy';
import * as path from 'path';
import * as glob from 'glob';
-import { Schema } from '@/misc/schema';
+import { SimpleSchema } from '@/misc/simple-schema';
//const _filename = fileURLToPath(import.meta.url);
const _filename = __filename;
@@ -34,7 +34,7 @@ export interface IEndpointMeta {
};
};
- res?: Schema;
+ res?: SimpleSchema;
/**
* このエンドポイントにリクエストするのにユーザー情報が必須か否か
diff --git a/src/server/api/openapi/schemas.ts b/src/server/api/openapi/schemas.ts
index 5402dc6f48..12fc207c47 100644
--- a/src/server/api/openapi/schemas.ts
+++ b/src/server/api/openapi/schemas.ts
@@ -1,26 +1,4 @@
-import { packedUserSchema } from '@/models/repositories/user';
-import { Schema } from '@/misc/schema';
-import { packedNoteSchema } from '@/models/repositories/note';
-import { packedUserListSchema } from '@/models/repositories/user-list';
-import { packedAppSchema } from '@/models/repositories/app';
-import { packedMessagingMessageSchema } from '@/models/repositories/messaging-message';
-import { packedNotificationSchema } from '@/models/repositories/notification';
-import { packedDriveFileSchema } from '@/models/repositories/drive-file';
-import { packedDriveFolderSchema } from '@/models/repositories/drive-folder';
-import { packedFollowingSchema } from '@/models/repositories/following';
-import { packedMutingSchema } from '@/models/repositories/muting';
-import { packedBlockingSchema } from '@/models/repositories/blocking';
-import { packedNoteReactionSchema } from '@/models/repositories/note-reaction';
-import { packedHashtagSchema } from '@/models/repositories/hashtag';
-import { packedPageSchema } from '@/models/repositories/page';
-import { packedUserGroupSchema } from '@/models/repositories/user-group';
-import { packedNoteFavoriteSchema } from '@/models/repositories/note-favorite';
-import { packedChannelSchema } from '@/models/repositories/channel';
-import { packedAntennaSchema } from '@/models/repositories/antenna';
-import { packedClipSchema } from '@/models/repositories/clip';
-import { packedFederationInstanceSchema } from '@/models/repositories/federation-instance';
-import { packedQueueCountSchema } from '@/models/repositories/queue';
-import { packedGalleryPostSchema } from '@/models/repositories/gallery-post';
+import { refs, Schema } from '@/misc/schema';
export function convertSchemaToOpenApiSchema(schema: Schema) {
const res: any = schema;
@@ -72,26 +50,7 @@ export const schemas = {
required: ['error']
},
- User: convertSchemaToOpenApiSchema(packedUserSchema),
- UserList: convertSchemaToOpenApiSchema(packedUserListSchema),
- UserGroup: convertSchemaToOpenApiSchema(packedUserGroupSchema),
- App: convertSchemaToOpenApiSchema(packedAppSchema),
- MessagingMessage: convertSchemaToOpenApiSchema(packedMessagingMessageSchema),
- Note: convertSchemaToOpenApiSchema(packedNoteSchema),
- NoteReaction: convertSchemaToOpenApiSchema(packedNoteReactionSchema),
- NoteFavorite: convertSchemaToOpenApiSchema(packedNoteFavoriteSchema),
- Notification: convertSchemaToOpenApiSchema(packedNotificationSchema),
- DriveFile: convertSchemaToOpenApiSchema(packedDriveFileSchema),
- DriveFolder: convertSchemaToOpenApiSchema(packedDriveFolderSchema),
- Following: convertSchemaToOpenApiSchema(packedFollowingSchema),
- Muting: convertSchemaToOpenApiSchema(packedMutingSchema),
- Blocking: convertSchemaToOpenApiSchema(packedBlockingSchema),
- Hashtag: convertSchemaToOpenApiSchema(packedHashtagSchema),
- Page: convertSchemaToOpenApiSchema(packedPageSchema),
- Channel: convertSchemaToOpenApiSchema(packedChannelSchema),
- QueueCount: convertSchemaToOpenApiSchema(packedQueueCountSchema),
- Antenna: convertSchemaToOpenApiSchema(packedAntennaSchema),
- Clip: convertSchemaToOpenApiSchema(packedClipSchema),
- FederationInstance: convertSchemaToOpenApiSchema(packedFederationInstanceSchema),
- GalleryPost: convertSchemaToOpenApiSchema(packedGalleryPostSchema),
+ ...Object.fromEntries(
+ Object.entries(refs).map(([key, schema]) => [key, convertSchemaToOpenApiSchema(schema)])
+ ),
};
diff --git a/src/server/api/stream/channels/global-timeline.ts b/src/server/api/stream/channels/global-timeline.ts
index 2cb138966f..384ed61409 100644
--- a/src/server/api/stream/channels/global-timeline.ts
+++ b/src/server/api/stream/channels/global-timeline.ts
@@ -43,7 +43,7 @@ export default class extends Channel {
// 関係ない返信は除外
if (note.reply) {
- const reply = note.reply as PackedNote;
+ const reply = note.reply;
// 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合
if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return;
}
diff --git a/src/server/api/stream/channels/home-timeline.ts b/src/server/api/stream/channels/home-timeline.ts
index c7a9728741..0e21ab552e 100644
--- a/src/server/api/stream/channels/home-timeline.ts
+++ b/src/server/api/stream/channels/home-timeline.ts
@@ -51,7 +51,7 @@ export default class extends Channel {
// 関係ない返信は除外
if (note.reply) {
- const reply = note.reply as PackedNote;
+ const reply = note.reply;
// 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合
if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return;
}
diff --git a/src/server/api/stream/channels/hybrid-timeline.ts b/src/server/api/stream/channels/hybrid-timeline.ts
index 5c454764ec..0b28ff616b 100644
--- a/src/server/api/stream/channels/hybrid-timeline.ts
+++ b/src/server/api/stream/channels/hybrid-timeline.ts
@@ -4,7 +4,6 @@ import Channel from '../channel';
import { fetchMeta } from '@/misc/fetch-meta';
import { Notes } from '@/models/index';
import { PackedNote } from '@/models/repositories/note';
-import { PackedUser } from '@/models/repositories/user';
import { checkWordMute } from '@/misc/check-word-mute';
import { isBlockerUserRelated } from '@/misc/is-blocker-user-related';
@@ -31,7 +30,7 @@ export default class extends Channel {
if (!(
(note.channelId == null && this.user!.id === note.userId) ||
(note.channelId == null && this.following.has(note.userId)) ||
- (note.channelId == null && ((note.user as PackedUser).host == null && note.visibility === 'public')) ||
+ (note.channelId == null && (note.user.host == null && note.visibility === 'public')) ||
(note.channelId != null && this.followingChannels.has(note.channelId))
)) return;
@@ -60,7 +59,7 @@ export default class extends Channel {
// 関係ない返信は除外
if (note.reply) {
- const reply = note.reply as PackedNote;
+ const reply = note.reply;
// 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合
if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return;
}
diff --git a/src/server/api/stream/channels/local-timeline.ts b/src/server/api/stream/channels/local-timeline.ts
index 4bf0d02ed3..20061410c4 100644
--- a/src/server/api/stream/channels/local-timeline.ts
+++ b/src/server/api/stream/channels/local-timeline.ts
@@ -4,7 +4,6 @@ import Channel from '../channel';
import { fetchMeta } from '@/misc/fetch-meta';
import { Notes } from '@/models/index';
import { PackedNote } from '@/models/repositories/note';
-import { PackedUser } from '@/models/repositories/user';
import { checkWordMute } from '@/misc/check-word-mute';
import { isBlockerUserRelated } from '@/misc/is-blocker-user-related';
@@ -26,7 +25,7 @@ export default class extends Channel {
@autobind
private async onNote(note: PackedNote) {
- if ((note.user as PackedUser).host !== null) return;
+ if (note.user.host !== null) return;
if (note.visibility !== 'public') return;
if (note.channelId != null && !this.followingChannels.has(note.channelId)) return;
@@ -45,7 +44,7 @@ export default class extends Channel {
// 関係ない返信は除外
if (note.reply) {
- const reply = note.reply as PackedNote;
+ const reply = note.reply;
// 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合
if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return;
}
diff --git a/src/server/api/stream/index.ts b/src/server/api/stream/index.ts
index 469f28f11c..f83bc9331e 100644
--- a/src/server/api/stream/index.ts
+++ b/src/server/api/stream/index.ts
@@ -165,8 +165,8 @@ export default class Connection {
};
add(note);
- if (note.reply) add(note.reply as PackedNote);
- if (note.renote) add(note.renote as PackedNote);
+ if (note.reply) add(note.reply);
+ if (note.renote) add(note.renote);
}
@autobind
diff --git a/src/services/chart/core.ts b/src/services/chart/core.ts
index eee7d20efb..c0d3280c2b 100644
--- a/src/services/chart/core.ts
+++ b/src/services/chart/core.ts
@@ -7,7 +7,7 @@
import * as nestedProperty from 'nested-property';
import autobind from 'autobind-decorator';
import Logger from '../logger';
-import { Schema } from '@/misc/schema';
+import { SimpleSchema } from '@/misc/simple-schema';
import { EntitySchema, getRepository, Repository, LessThan, Between } from 'typeorm';
import { dateUTC, isTimeSame, isTimeBefore, subtractTime, addTime } from '@/prelude/time';
import { getChartInsertLock } from '@/misc/app-lock';
@@ -56,7 +56,7 @@ export default abstract class Chart<T extends Record<string, any>> {
diff: DeepPartial<T>;
group: string | null;
}[] = [];
- public schema: Schema;
+ public schema: SimpleSchema;
protected repository: Repository<Log>;
protected abstract genNewLog(latest: T): DeepPartial<T>;
@@ -69,7 +69,7 @@ export default abstract class Chart<T extends Record<string, any>> {
protected abstract fetchActual(group: string | null): Promise<DeepPartial<T>>;
@autobind
- private static convertSchemaToFlatColumnDefinitions(schema: Schema) {
+ private static convertSchemaToFlatColumnDefinitions(schema: SimpleSchema) {
const columns = {} as any;
const flatColumns = (x: Obj, path?: string) => {
for (const [k, v] of Object.entries(x)) {
@@ -181,7 +181,7 @@ export default abstract class Chart<T extends Record<string, any>> {
}
@autobind
- public static schemaToEntity(name: string, schema: Schema): EntitySchema {
+ public static schemaToEntity(name: string, schema: SimpleSchema): EntitySchema {
return new EntitySchema({
name: `__chart__${camelToSnake(name)}`,
columns: {
@@ -211,7 +211,7 @@ export default abstract class Chart<T extends Record<string, any>> {
});
}
- constructor(name: string, schema: Schema, grouped = false) {
+ constructor(name: string, schema: SimpleSchema, grouped = false) {
this.name = name;
this.schema = schema;
const entity = Chart.schemaToEntity(name, schema);
@@ -546,8 +546,8 @@ export default abstract class Chart<T extends Record<string, any>> {
}
}
-export function convertLog(logSchema: Schema): Schema {
- const v: Schema = JSON.parse(JSON.stringify(logSchema)); // copy
+export function convertLog(logSchema: SimpleSchema): SimpleSchema {
+ const v: SimpleSchema = JSON.parse(JSON.stringify(logSchema)); // copy
if (v.type === 'number') {
v.type = 'array';
v.items = {