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の型不整合を修正
This commit is contained in:
parent
f59f424795
commit
53f3b779bf
24 changed files with 148 additions and 129 deletions
|
@ -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;
|
||||
|
|
15
src/misc/simple-schema.ts
Normal file
15
src/misc/simple-schema.ts
Normal file
|
@ -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; }
|
|
@ -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,
|
||||
},
|
||||
}
|
||||
};
|
||||
|
|
|
@ -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: {
|
||||
|
|
|
@ -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,
|
||||
}
|
||||
},
|
||||
};
|
||||
|
|
|
@ -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,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
|
|
@ -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,
|
||||
},
|
||||
}
|
||||
};
|
||||
|
|
|
@ -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: {
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
},
|
||||
}
|
||||
};
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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: {
|
||||
|
|
|
@ -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: {
|
||||
|
|
|
@ -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,
|
||||
},
|
||||
}
|
||||
|
|
|
@ -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: {
|
||||
|
|
|
@ -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;
|
||||
|
||||
/**
|
||||
* このエンドポイントにリクエストするのにユーザー情報が必須か否か
|
||||
|
|
|
@ -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)])
|
||||
),
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 = {
|
||||
|
|
Loading…
Reference in a new issue