refactor: fix types

This commit is contained in:
syuilo 2023-02-17 15:36:36 +09:00
parent 0e1b5d6f14
commit 60df819c60
19 changed files with 91 additions and 118 deletions

View file

@ -61,7 +61,7 @@ export class CustomEmojiService {
await this.db.queryResultCache!.remove(['meta_emojis']); await this.db.queryResultCache!.remove(['meta_emojis']);
this.globalEventService.publishBroadcastStream('emojiAdded', { this.globalEventService.publishBroadcastStream('emojiAdded', {
emoji: await this.emojiEntityService.pack(emoji.id), emoji: await this.emojiEntityService.packDetailed(emoji.id),
}); });
} }

View file

@ -5,44 +5,59 @@ import type { Packed } from '@/misc/schema.js';
import type { } from '@/models/entities/Blocking.js'; import type { } from '@/models/entities/Blocking.js';
import type { Emoji } from '@/models/entities/Emoji.js'; import type { Emoji } from '@/models/entities/Emoji.js';
import { bindThis } from '@/decorators.js'; import { bindThis } from '@/decorators.js';
import { UserEntityService } from './UserEntityService.js';
@Injectable() @Injectable()
export class EmojiEntityService { export class EmojiEntityService {
constructor( constructor(
@Inject(DI.emojisRepository) @Inject(DI.emojisRepository)
private emojisRepository: EmojisRepository, private emojisRepository: EmojisRepository,
private userEntityService: UserEntityService,
) { ) {
} }
@bindThis @bindThis
public async pack( public async packSimple(
src: Emoji['id'] | Emoji, src: Emoji['id'] | Emoji,
opts: { omitHost?: boolean; omitId?: boolean; withUrl?: boolean; } = { omitHost: true, omitId: true, withUrl: true }, ): Promise<Packed<'EmojiSimple'>> {
): Promise<Packed<'Emoji'>> {
opts = { omitHost: true, omitId: true, withUrl: true, ...opts };
const emoji = typeof src === 'object' ? src : await this.emojisRepository.findOneByOrFail({ id: src }); const emoji = typeof src === 'object' ? src : await this.emojisRepository.findOneByOrFail({ id: src });
return { return {
id: opts.omitId ? undefined : emoji.id,
aliases: emoji.aliases, aliases: emoji.aliases,
name: emoji.name, name: emoji.name,
category: emoji.category, category: emoji.category,
host: opts.omitHost ? undefined : emoji.host,
// || emoji.originalUrl してるのは後方互換性のためpublicUrlはstringなので??はだめ) // || emoji.originalUrl してるのは後方互換性のためpublicUrlはstringなので??はだめ)
url: opts.withUrl ? (emoji.publicUrl || emoji.originalUrl) : undefined, url: emoji.publicUrl || emoji.originalUrl,
}; };
} }
@bindThis @bindThis
public packMany( public packSimpleMany(
emojis: any[], emojis: any[],
opts: { omitHost?: boolean; omitId?: boolean; withUrl?: boolean; } = {},
) { ) {
return Promise.all(emojis.map(x => this.pack(x, opts))); return Promise.all(emojis.map(x => this.packSimple(x)));
}
@bindThis
public async packDetailed(
src: Emoji['id'] | Emoji,
): Promise<Packed<'EmojiDetailed'>> {
const emoji = typeof src === 'object' ? src : await this.emojisRepository.findOneByOrFail({ id: src });
return {
id: emoji.id,
aliases: emoji.aliases,
name: emoji.name,
category: emoji.category,
host: emoji.host,
// || emoji.originalUrl してるのは後方互換性のためpublicUrlはstringなので??はだめ)
url: emoji.publicUrl || emoji.originalUrl,
};
}
@bindThis
public packDetailedMany(
emojis: any[],
) {
return Promise.all(emojis.map(x => this.packDetailed(x)));
} }
} }

View file

@ -26,7 +26,7 @@ import { packedClipSchema } from '@/models/schema/clip.js';
import { packedFederationInstanceSchema } from '@/models/schema/federation-instance.js'; import { packedFederationInstanceSchema } from '@/models/schema/federation-instance.js';
import { packedQueueCountSchema } from '@/models/schema/queue.js'; import { packedQueueCountSchema } from '@/models/schema/queue.js';
import { packedGalleryPostSchema } from '@/models/schema/gallery-post.js'; import { packedGalleryPostSchema } from '@/models/schema/gallery-post.js';
import { packedEmojiSchema } from '@/models/schema/emoji.js'; import { packedEmojiDetailedSchema, packedEmojiSimpleSchema } from '@/models/schema/emoji.js';
import { packedFlashSchema } from '@/models/schema/flash.js'; import { packedFlashSchema } from '@/models/schema/flash.js';
export const refs = { export const refs = {
@ -57,7 +57,8 @@ export const refs = {
Clip: packedClipSchema, Clip: packedClipSchema,
FederationInstance: packedFederationInstanceSchema, FederationInstance: packedFederationInstanceSchema,
GalleryPost: packedGalleryPostSchema, GalleryPost: packedGalleryPostSchema,
Emoji: packedEmojiSchema, EmojiSimple: packedEmojiSimpleSchema,
EmojiDetailed: packedEmojiDetailedSchema,
Flash: packedFlashSchema, Flash: packedFlashSchema,
}; };

View file

@ -1,11 +1,37 @@
export const packedEmojiSchema = { export const packedEmojiSimpleSchema = {
type: 'object',
properties: {
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,
},
url: {
type: 'string',
optional: false, nullable: false,
},
},
} as const;
export const packedEmojiDetailedSchema = {
type: 'object', type: 'object',
properties: { properties: {
id: { id: {
type: 'string', type: 'string',
optional: true, nullable: false, optional: false, nullable: false,
format: 'id', format: 'id',
example: 'xxxxxxxxxx',
}, },
aliases: { aliases: {
type: 'array', type: 'array',
@ -26,12 +52,12 @@ export const packedEmojiSchema = {
}, },
host: { host: {
type: 'string', type: 'string',
optional: true, nullable: true, optional: false, nullable: true,
description: 'The local host is represented with `null`.', description: 'The local host is represented with `null`.',
}, },
url: { url: {
type: 'string', type: 'string',
optional: true, nullable: false, optional: false, nullable: false,
}, },
}, },
} as const; } as const;

View file

@ -219,8 +219,8 @@ export class ApiCallService implements OnApplicationShutdown {
const limit = Object.assign({}, ep.meta.limit); const limit = Object.assign({}, ep.meta.limit);
if (!limit.key) { if (limit.key == null) {
limit.key = ep.name; (limit as any).key = ep.name;
} }
// TODO: 毎リクエスト計算するのもあれだしキャッシュしたい // TODO: 毎リクエスト計算するのもあれだしキャッシュしたい

View file

@ -56,7 +56,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
await this.db.queryResultCache!.remove(['meta_emojis']); await this.db.queryResultCache!.remove(['meta_emojis']);
this.globalEventService.publishBroadcastStream('emojiUpdated', { this.globalEventService.publishBroadcastStream('emojiUpdated', {
emojis: await this.emojiEntityService.packMany(ps.ids), emojis: await this.emojiEntityService.packDetailedMany(ps.ids),
}); });
}); });
} }

View file

@ -92,7 +92,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
await this.db.queryResultCache!.remove(['meta_emojis']); await this.db.queryResultCache!.remove(['meta_emojis']);
this.globalEventService.publishBroadcastStream('emojiAdded', { this.globalEventService.publishBroadcastStream('emojiAdded', {
emoji: await this.emojiEntityService.pack(copied.id), emoji: await this.emojiEntityService.packDetailed(copied.id),
}); });
return { return {

View file

@ -54,7 +54,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
} }
this.globalEventService.publishBroadcastStream('emojiDeleted', { this.globalEventService.publishBroadcastStream('emojiDeleted', {
emojis: await this.emojiEntityService.packMany(emojis), emojis: await this.emojiEntityService.packDetailedMany(emojis),
}); });
}); });
} }

View file

@ -4,9 +4,9 @@ import { Endpoint } from '@/server/api/endpoint-base.js';
import type { EmojisRepository } from '@/models/index.js'; import type { EmojisRepository } from '@/models/index.js';
import { DI } from '@/di-symbols.js'; import { DI } from '@/di-symbols.js';
import { ModerationLogService } from '@/core/ModerationLogService.js'; import { ModerationLogService } from '@/core/ModerationLogService.js';
import { ApiError } from '../../../error.js';
import { EmojiEntityService } from '@/core/entities/EmojiEntityService.js'; import { EmojiEntityService } from '@/core/entities/EmojiEntityService.js';
import { GlobalEventService } from '@/core/GlobalEventService.js'; import { GlobalEventService } from '@/core/GlobalEventService.js';
import { ApiError } from '../../../error.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],
@ -57,7 +57,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
await this.db.queryResultCache!.remove(['meta_emojis']); await this.db.queryResultCache!.remove(['meta_emojis']);
this.globalEventService.publishBroadcastStream('emojiDeleted', { this.globalEventService.publishBroadcastStream('emojiDeleted', {
emojis: [await this.emojiEntityService.pack(emoji)], emojis: [await this.emojiEntityService.packDetailed(emoji)],
}); });
this.moderationLogService.insertModerationLog(me, 'deleteEmoji', { this.moderationLogService.insertModerationLog(me, 'deleteEmoji', {

View file

@ -101,7 +101,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
.take(ps.limit) .take(ps.limit)
.getMany(); .getMany();
return this.emojiEntityService.packMany(emojis, { omitHost: false, omitId: false, withUrl: false }); return this.emojiEntityService.packDetailedMany(emojis);
}); });
} }
} }

View file

@ -98,7 +98,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
emojis = await q.take(ps.limit).getMany(); emojis = await q.take(ps.limit).getMany();
} }
return this.emojiEntityService.packMany(emojis, { omitHost: false, omitId: false, withUrl: false }); return this.emojiEntityService.packDetailedMany(emojis);
}); });
} }
} }

View file

@ -56,7 +56,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
await this.db.queryResultCache!.remove(['meta_emojis']); await this.db.queryResultCache!.remove(['meta_emojis']);
this.globalEventService.publishBroadcastStream('emojiUpdated', { this.globalEventService.publishBroadcastStream('emojiUpdated', {
emojis: await this.emojiEntityService.packMany(ps.ids), emojis: await this.emojiEntityService.packDetailedMany(ps.ids),
}); });
}); });
} }

View file

@ -52,7 +52,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
await this.db.queryResultCache!.remove(['meta_emojis']); await this.db.queryResultCache!.remove(['meta_emojis']);
this.globalEventService.publishBroadcastStream('emojiUpdated', { this.globalEventService.publishBroadcastStream('emojiUpdated', {
emojis: await this.emojiEntityService.packMany(ps.ids), emojis: await this.emojiEntityService.packDetailedMany(ps.ids),
}); });
}); });
} }

View file

@ -54,7 +54,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
await this.db.queryResultCache!.remove(['meta_emojis']); await this.db.queryResultCache!.remove(['meta_emojis']);
this.globalEventService.publishBroadcastStream('emojiUpdated', { this.globalEventService.publishBroadcastStream('emojiUpdated', {
emojis: await this.emojiEntityService.packMany(ps.ids), emojis: await this.emojiEntityService.packDetailedMany(ps.ids),
}); });
}); });
} }

View file

@ -3,9 +3,9 @@ import { DataSource } from 'typeorm';
import { Endpoint } from '@/server/api/endpoint-base.js'; import { Endpoint } from '@/server/api/endpoint-base.js';
import type { EmojisRepository } from '@/models/index.js'; import type { EmojisRepository } from '@/models/index.js';
import { DI } from '@/di-symbols.js'; import { DI } from '@/di-symbols.js';
import { ApiError } from '../../../error.js';
import { EmojiEntityService } from '@/core/entities/EmojiEntityService.js'; import { EmojiEntityService } from '@/core/entities/EmojiEntityService.js';
import { GlobalEventService } from '@/core/GlobalEventService.js'; import { GlobalEventService } from '@/core/GlobalEventService.js';
import { ApiError } from '../../../error.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],
@ -68,7 +68,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
await this.db.queryResultCache!.remove(['meta_emojis']); await this.db.queryResultCache!.remove(['meta_emojis']);
const updated = await this.emojiEntityService.pack(emoji.id); const updated = await this.emojiEntityService.packDetailed(emoji.id);
if (emoji.name === ps.name) { if (emoji.name === ps.name) {
this.globalEventService.publishBroadcastStream('emojiUpdated', { this.globalEventService.publishBroadcastStream('emojiUpdated', {
@ -76,7 +76,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
}); });
} else { } else {
this.globalEventService.publishBroadcastStream('emojiDeleted', { this.globalEventService.publishBroadcastStream('emojiDeleted', {
emojis: [await this.emojiEntityService.pack(emoji)], emojis: [await this.emojiEntityService.packDetailed(emoji)],
}); });
this.globalEventService.publishBroadcastStream('emojiAdded', { this.globalEventService.publishBroadcastStream('emojiAdded', {

View file

@ -54,86 +54,22 @@ export const meta = {
}, },
mascotImageUrl: { mascotImageUrl: {
type: 'string', type: 'string',
optional: false, nullable: false, optional: false, nullable: true,
default: '/assets/ai.png', default: '/assets/ai.png',
}, },
bannerUrl: { bannerUrl: {
type: 'string', type: 'string',
optional: false, nullable: false, optional: false, nullable: true,
}, },
errorImageUrl: { errorImageUrl: {
type: 'string', type: 'string',
optional: false, nullable: false, optional: false, nullable: true,
default: 'https://xn--931a.moe/aiart/yubitun.png', default: 'https://xn--931a.moe/aiart/yubitun.png',
}, },
iconUrl: { iconUrl: {
type: 'string', type: 'string',
optional: false, nullable: true, optional: false, nullable: true,
}, },
maxNoteTextLength: {
type: 'number',
optional: false, nullable: false,
},
emojis: {
type: 'array',
optional: false, nullable: false,
items: {
type: 'object',
optional: false, nullable: false,
properties: {
id: {
type: 'string',
optional: false, nullable: false,
format: 'id',
},
aliases: {
type: 'array',
optional: false, nullable: false,
items: {
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,
format: 'url',
},
},
},
},
ads: {
type: 'array',
optional: false, nullable: false,
items: {
type: 'object',
optional: false, nullable: false,
properties: {
place: {
type: 'string',
optional: false, nullable: false,
},
url: {
type: 'string',
optional: false, nullable: false,
format: 'url',
},
imageUrl: {
type: 'string',
optional: false, nullable: false,
format: 'url',
},
},
},
},
enableEmail: { enableEmail: {
type: 'boolean', type: 'boolean',
optional: false, nullable: false, optional: false, nullable: false,
@ -146,10 +82,6 @@ export const meta = {
type: 'boolean', type: 'boolean',
optional: false, nullable: false, optional: false, nullable: false,
}, },
proxyAccountName: {
type: 'string',
optional: false, nullable: true,
},
userStarForReactionFallback: { userStarForReactionFallback: {
type: 'boolean', type: 'boolean',
optional: true, nullable: false, optional: true, nullable: false,
@ -228,7 +160,7 @@ export const meta = {
optional: true, nullable: true, optional: true, nullable: true,
}, },
smtpPort: { smtpPort: {
type: 'string', type: 'number',
optional: true, nullable: true, optional: true, nullable: true,
}, },
smtpUser: { smtpUser: {
@ -299,6 +231,10 @@ export const meta = {
type: 'boolean', type: 'boolean',
optional: true, nullable: false, optional: true, nullable: false,
}, },
policies: {
type: 'object',
optional: false, nullable: false,
},
}, },
}, },
} as const; } as const;
@ -349,7 +285,6 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
iconUrl: instance.iconUrl, iconUrl: instance.iconUrl,
backgroundImageUrl: instance.backgroundImageUrl, backgroundImageUrl: instance.backgroundImageUrl,
logoImageUrl: instance.logoImageUrl, logoImageUrl: instance.logoImageUrl,
maxNoteTextLength: MAX_NOTE_TEXT_LENGTH, // 後方互換性のため
defaultLightTheme: instance.defaultLightTheme, defaultLightTheme: instance.defaultLightTheme,
defaultDarkTheme: instance.defaultDarkTheme, defaultDarkTheme: instance.defaultDarkTheme,
enableEmail: instance.enableEmail, enableEmail: instance.enableEmail,

View file

@ -82,11 +82,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
}); });
return { return {
emojis: await this.emojiEntityService.packMany(emojis, { emojis: await this.emojiEntityService.packSimpleMany(emojis),
omitId: true,
omitHost: true,
withUrl: true,
}),
}; };
}); });
} }

View file

@ -295,7 +295,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
iconUrl: instance.iconUrl, iconUrl: instance.iconUrl,
backgroundImageUrl: instance.backgroundImageUrl, backgroundImageUrl: instance.backgroundImageUrl,
logoImageUrl: instance.logoImageUrl, logoImageUrl: instance.logoImageUrl,
maxNoteTextLength: MAX_NOTE_TEXT_LENGTH, // 後方互換性のため maxNoteTextLength: MAX_NOTE_TEXT_LENGTH,
defaultLightTheme: instance.defaultLightTheme, defaultLightTheme: instance.defaultLightTheme,
defaultDarkTheme: instance.defaultDarkTheme, defaultDarkTheme: instance.defaultDarkTheme,
ads: ads.map(ad => ({ ads: ads.map(ad => ({

View file

@ -42,10 +42,10 @@ export interface InternalStreamTypes {
export interface BroadcastTypes { export interface BroadcastTypes {
emojiAdded: { emojiAdded: {
emoji: Packed<'Emoji'>; emoji: Packed<'EmojiDetailed'>;
}; };
emojiUpdated: { emojiUpdated: {
emojis: Packed<'Emoji'>[]; emojis: Packed<'EmojiDetailed'>[];
}; };
emojiDeleted: { emojiDeleted: {
emojis: { emojis: {