diff --git a/packages/backend/src/core/CustomEmojiService.ts b/packages/backend/src/core/CustomEmojiService.ts index 9661a0aea3..d438820e27 100644 --- a/packages/backend/src/core/CustomEmojiService.ts +++ b/packages/backend/src/core/CustomEmojiService.ts @@ -379,6 +379,13 @@ export class CustomEmojiService implements OnApplicationShutdown { this.cache.set(`${emoji.name} ${emoji.host}`, emoji); } } + /** + * ローカル内の絵文字に重複がないかチェックします + * @param name 絵文字名 + */ + public async isDuplicateCheck(name: string): Promise { + return (await this.emojisRepository.findOneBy({ name, host: IsNull() })) !== null; + } @bindThis public dispose(): void { diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/add.ts b/packages/backend/src/server/api/endpoints/admin/emoji/add.ts index 24d3a8a943..1b9dc1c2ae 100644 --- a/packages/backend/src/server/api/endpoints/admin/emoji/add.ts +++ b/packages/backend/src/server/api/endpoints/admin/emoji/add.ts @@ -23,6 +23,11 @@ export const meta = { code: 'NO_SUCH_FILE', id: 'fc46b5a4-6b92-4c33-ac66-b806659bb5cf', }, + duplicateName: { + message: 'Duplicate name.', + code: 'DUPLICATE_NAME', + id: 'f7a3462c-4e6e-4069-8421-b9bd4f4c3975', + }, }, } as const; @@ -64,7 +69,8 @@ export default class extends Endpoint { // eslint- super(meta, paramDef, async (ps, me) => { const driveFile = await this.driveFilesRepository.findOneBy({ id: ps.fileId }); if (driveFile == null) throw new ApiError(meta.errors.noSuchFile); - + const duplicateCheck = await this.customEmojiService.isDuplicateCheck(ps.name); + if (duplicateCheck != null) throw new ApiError(meta.errors.duplicateName); const emoji = await this.customEmojiService.add({ driveFile, name: ps.name, diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/update.ts b/packages/backend/src/server/api/endpoints/admin/emoji/update.ts index 2d69857408..c057eeb590 100644 --- a/packages/backend/src/server/api/endpoints/admin/emoji/update.ts +++ b/packages/backend/src/server/api/endpoints/admin/emoji/update.ts @@ -74,6 +74,10 @@ export default class extends Endpoint { // eslint- driveFile = await this.driveFilesRepository.findOneBy({ id: ps.fileId }); if (driveFile == null) throw new ApiError(meta.errors.noSuchFile); } + if (ps.name) { + const duplicateCheck = await this.customEmojiService.isDuplicateCheck(ps.name); + if (duplicateCheck != null) throw new ApiError(meta.errors.sameNameEmojiExists); + } await this.customEmojiService.update(ps.id, { driveFile,