From 3dcb376b23222d7f22a3291e6ae9667b8e485497 Mon Sep 17 00:00:00 2001 From: eternal-flame-AD Date: Tue, 19 Nov 2024 10:35:56 -0600 Subject: [PATCH] improve emoji packing Signed-off-by: eternal-flame-AD --- .../src/core/entities/EmojiEntityService.ts | 67 ++++++++++++++----- .../src/server/api/endpoints/emojis.ts | 3 +- 2 files changed, 51 insertions(+), 19 deletions(-) diff --git a/packages/backend/src/core/entities/EmojiEntityService.ts b/packages/backend/src/core/entities/EmojiEntityService.ts index 841bd731c..8929d4e64 100644 --- a/packages/backend/src/core/entities/EmojiEntityService.ts +++ b/packages/backend/src/core/entities/EmojiEntityService.ts @@ -10,6 +10,7 @@ import type { Packed } from '@/misc/json-schema.js'; import type { } from '@/models/Blocking.js'; import type { MiEmoji } from '@/models/Emoji.js'; import { bindThis } from '@/decorators.js'; +import { In } from 'typeorm'; @Injectable() export class EmojiEntityService { @@ -20,11 +21,9 @@ export class EmojiEntityService { } @bindThis - public async packSimple( - src: MiEmoji['id'] | MiEmoji, - ): Promise> { - const emoji = typeof src === 'object' ? src : await this.emojisRepository.findOneByOrFail({ id: src }); - + public packSimpleNoQuery( + emoji: MiEmoji, + ): Packed<'EmojiSimple'> { return { aliases: emoji.aliases, name: emoji.name, @@ -38,18 +37,34 @@ export class EmojiEntityService { } @bindThis - public packSimpleMany( - emojis: any[], - ) { - return Promise.all(emojis.map(x => this.packSimple(x))); + public async packSimple( + src: MiEmoji['id'] | MiEmoji, + ): Promise> { + const emoji = typeof src === 'object' ? src : await this.emojisRepository.findOneByOrFail({ id: src }); + + return this.packSimpleNoQuery(emoji); } @bindThis - public async packDetailed( - src: MiEmoji['id'] | MiEmoji, - ): Promise> { - const emoji = typeof src === 'object' ? src : await this.emojisRepository.findOneByOrFail({ id: src }); + public async packSimpleMany( + emojis: MiEmoji['id'][] | MiEmoji[], + ): Promise[]> { + if (emojis.length === 0) { + return []; + } + + if (typeof emojis[0] === 'string') { + const res = await this.emojisRepository.findBy({ id: In(emojis as MiEmoji['id'][]) }); + return res.map(this.packSimpleNoQuery); + } + return (emojis as MiEmoji[]).map(this.packSimpleNoQuery); + } + + @bindThis + public packDetailedNoQuery( + emoji: MiEmoji, + ): Packed<'EmojiDetailed'> { return { id: emoji.id, aliases: emoji.aliases, @@ -66,10 +81,28 @@ export class EmojiEntityService { } @bindThis - public packDetailedMany( - emojis: any[], - ) { - return Promise.all(emojis.map(x => this.packDetailed(x))); + public async packDetailed( + src: MiEmoji['id'] | MiEmoji, + ): Promise> { + const emoji = typeof src === 'object' ? src : await this.emojisRepository.findOneByOrFail({ id: src }); + + return this.packDetailedNoQuery(emoji); + } + + @bindThis + public async packDetailedMany( + emojis: MiEmoji['id'][] | MiEmoji[], + ) : Promise[]> { + if (emojis.length === 0) { + return []; + } + + if (typeof emojis[0] === 'string') { + const res = await this.emojisRepository.findBy({ id: In(emojis as MiEmoji['id'][]) }); + return res.map(this.packDetailedNoQuery); + } + + return (emojis as MiEmoji[]).map(this.packDetailedNoQuery); } } diff --git a/packages/backend/src/server/api/endpoints/emojis.ts b/packages/backend/src/server/api/endpoints/emojis.ts index e7ccb89ab..260f7e2a0 100644 --- a/packages/backend/src/server/api/endpoints/emojis.ts +++ b/packages/backend/src/server/api/endpoints/emojis.ts @@ -55,9 +55,8 @@ export default class extends Endpoint { // eslint- .orderBy('LOWER(emoji.category)', 'ASC') .addOrderBy('LOWER(emoji.name)', 'ASC') .getMany(); - return { - emojis: await this.emojiEntityService.packSimpleMany(emojis), + emojis: emojis.map(this.emojiEntityService.packSimpleNoQuery), }; }); }