feat(emoji): 管理用のカスタム絵文字フィールドの追加 (MisskeyIO#397)

This commit is contained in:
まっちゃとーにゅ 2024-02-01 10:22:51 +09:00 committed by GitHub
parent c4cc9dae87
commit 8befa531a5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
18 changed files with 168 additions and 23 deletions

View file

@ -66,6 +66,8 @@ export class CustomEmojiService implements OnApplicationShutdown {
license: string | null;
isSensitive: boolean;
localOnly: boolean;
requestedBy: string | null;
memo: string | null;
roleIdsThatCanBeUsedThisEmojiAsReaction: MiRole['id'][];
roleIdsThatCanNotBeUsedThisEmojiAsReaction: MiRole['id'][];
}, moderator?: MiUser): Promise<MiEmoji> {
@ -82,6 +84,8 @@ export class CustomEmojiService implements OnApplicationShutdown {
license: data.license,
isSensitive: data.isSensitive,
localOnly: data.localOnly,
requestedBy: data.requestedBy,
memo: data.memo,
roleIdsThatCanBeUsedThisEmojiAsReaction: data.roleIdsThatCanBeUsedThisEmojiAsReaction,
roleIdsThatCanNotBeUsedThisEmojiAsReaction: data.roleIdsThatCanNotBeUsedThisEmojiAsReaction,
}).then(x => this.emojisRepository.findOneByOrFail(x.identifiers[0]));
@ -113,6 +117,8 @@ export class CustomEmojiService implements OnApplicationShutdown {
license?: string | null;
isSensitive?: boolean;
localOnly?: boolean;
requestedBy?: string | null;
memo?: string | null;
roleIdsThatCanBeUsedThisEmojiAsReaction?: MiRole['id'][];
roleIdsThatCanNotBeUsedThisEmojiAsReaction?: MiRole['id'][];
}, moderator?: MiUser): Promise<void> {
@ -131,6 +137,8 @@ export class CustomEmojiService implements OnApplicationShutdown {
originalUrl: data.driveFile != null ? data.driveFile.url : undefined,
publicUrl: data.driveFile != null ? (data.driveFile.webpublicUrl ?? data.driveFile.url) : undefined,
type: data.driveFile != null ? (data.driveFile.webpublicType ?? data.driveFile.type) : undefined,
requestedBy: data.requestedBy ?? undefined,
memo: data.memo ?? undefined,
roleIdsThatCanBeUsedThisEmojiAsReaction: data.roleIdsThatCanBeUsedThisEmojiAsReaction ?? undefined,
roleIdsThatCanNotBeUsedThisEmojiAsReaction: data.roleIdsThatCanNotBeUsedThisEmojiAsReaction ?? undefined,
});

View file

@ -9,12 +9,15 @@ import type { EmojisRepository } from '@/models/_.js';
import type { Packed } from '@/misc/json-schema.js';
import type { MiEmoji } from '@/models/Emoji.js';
import { bindThis } from '@/decorators.js';
import { IdService } from '@/core/IdService.js';
@Injectable()
export class EmojiEntityService {
constructor(
@Inject(DI.emojisRepository)
private emojisRepository: EmojisRepository,
private idService: IdService,
) {
}
@ -75,4 +78,39 @@ export class EmojiEntityService {
.filter(result => result.status === 'fulfilled')
.map(result => (result as PromiseFulfilledResult<Packed<'EmojiDetailed'>>).value);
}
@bindThis
public async packInternal(
src: MiEmoji['id'] | MiEmoji,
): Promise<Packed<'EmojiDetailed'>> {
const emoji = typeof src === 'object' ? src : await this.emojisRepository.findOneByOrFail({ id: src });
return {
id: emoji.id,
createdAt: this.idService.parse(emoji.id).date.toISOString(),
updatedAt: emoji.updatedAt?.toISOString() ?? null,
aliases: emoji.aliases,
name: emoji.name,
category: emoji.category,
host: emoji.host,
// || emoji.originalUrl してるのは後方互換性のためpublicUrlはstringなので??はだめ)
url: emoji.publicUrl || emoji.originalUrl,
license: emoji.license,
isSensitive: emoji.isSensitive,
localOnly: emoji.localOnly,
requestedBy: emoji.requestedBy,
memo: emoji.memo,
roleIdsThatCanBeUsedThisEmojiAsReaction: emoji.roleIdsThatCanBeUsedThisEmojiAsReaction,
roleIdsThatCanNotBeUsedThisEmojiAsReaction: emoji.roleIdsThatCanNotBeUsedThisEmojiAsReaction,
};
}
@bindThis
public async packInternalMany(
emojis: (MiEmoji['id'] | MiEmoji)[],
) : Promise<Packed<'EmojiDetailed'>[]> {
return (await Promise.allSettled(emojis.map(x => this.packInternal(x))))
.filter(result => result.status === 'fulfilled')
.map(result => (result as PromiseFulfilledResult<Packed<'EmojiDetailed'>>).value);
}
}