From c25b21c5c7f8dc449a8e7d4562b9bae5111988a1 Mon Sep 17 00:00:00 2001 From: Dennis Postma Date: Sun, 2 Jun 2024 22:09:36 +0200 Subject: [PATCH] Character name field is always unique, updated init migration --- .../migration.sql | 1 + prisma/schema.prisma | 2 +- src/app/events/CharacterCreate.ts | 8 ++++++++ src/app/repositories/CharacterRepository.ts | 13 +++++++++++++ 4 files changed, 23 insertions(+), 1 deletion(-) rename prisma/migrations/{20240530223506_init => 20240602200800_init}/migration.sql (97%) diff --git a/prisma/migrations/20240530223506_init/migration.sql b/prisma/migrations/20240602200800_init/migration.sql similarity index 97% rename from prisma/migrations/20240530223506_init/migration.sql rename to prisma/migrations/20240602200800_init/migration.sql index da9eb3d..a6f9516 100644 --- a/prisma/migrations/20240530223506_init/migration.sql +++ b/prisma/migrations/20240602200800_init/migration.sql @@ -23,6 +23,7 @@ CREATE TABLE `Character` ( `rotation` INTEGER NOT NULL, `zoneId` INTEGER NOT NULL, + UNIQUE INDEX `Character_name_key`(`name`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index a12a3cf..233efe4 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -30,7 +30,7 @@ model Character { id Int @id @default(autoincrement()) userId Int user User @relation(fields: [userId], references: [id]) - name String + name String @unique hitpoints Int @default(100) mana Int @default(100) level Int @default(1) diff --git a/src/app/events/CharacterCreate.ts b/src/app/events/CharacterCreate.ts index a9223cb..a1c87ad 100644 --- a/src/app/events/CharacterCreate.ts +++ b/src/app/events/CharacterCreate.ts @@ -11,6 +11,14 @@ export default function (socket: TSocket, io: Server) { data = ZCharacterCreate.parse(data); const user_id = socket.user?.id as number; + + // Check if character name already exists + const characterExists = await CharacterRepository.getByName(data.name); + + if (characterExists) { + return socket.emit('notification', {message: 'Character name already exists'}); + } + const character: Character = await CharacterRepository.create(user_id, data.name) as Character; const characters: Character[] = await CharacterRepository.getByUserId(user_id) as Character[]; diff --git a/src/app/repositories/CharacterRepository.ts b/src/app/repositories/CharacterRepository.ts index 8cf1bda..8fea578 100644 --- a/src/app/repositories/CharacterRepository.ts +++ b/src/app/repositories/CharacterRepository.ts @@ -59,6 +59,19 @@ class CharacterRepository { throw new Error(`Failed to delete character: ${error.message}`); } } + + async getByName(name: string): Promise { + try { + return await prisma.character.findFirst({ + where: { + name, + }, + }); + } catch (error: any) { + // Handle error + throw new Error(`Failed to get character by name: ${error.message}`); + } + } } export default new CharacterRepository; \ No newline at end of file