From 6b30d9db1de0be68a803dbe3070559724aeab458 Mon Sep 17 00:00:00 2001 From: Dennis Postma Date: Tue, 16 Jul 2024 00:17:05 +0200 Subject: [PATCH] Improved validation, added tags field to objects, fixed and improved character delete logics --- .../migration.sql | 5 ++++ prisma/schema.prisma | 3 ++- src/app/events/character/CharacterDelete.ts | 21 ++++++++++------ src/app/events/gm/object/GmObjectUpdate.ts | 3 ++- src/app/repositories/ObjectRepository.ts | 3 ++- src/app/utilities/ZodTypes.ts | 25 +++++++++---------- 6 files changed, 37 insertions(+), 23 deletions(-) create mode 100644 prisma/migrations/20240715213654_add_tags_field_to_objects/migration.sql diff --git a/prisma/migrations/20240715213654_add_tags_field_to_objects/migration.sql b/prisma/migrations/20240715213654_add_tags_field_to_objects/migration.sql new file mode 100644 index 0000000..055c287 --- /dev/null +++ b/prisma/migrations/20240715213654_add_tags_field_to_objects/migration.sql @@ -0,0 +1,5 @@ +-- AlterTable +ALTER TABLE `Object` ADD COLUMN `tags` JSON NULL; + +-- AlterTable +ALTER TABLE `Tile` MODIFY `tags` JSON NULL; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index b4fb851..69dae57 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -22,7 +22,7 @@ datasource db { model Tile { id String @id @default(uuid()) name String - tags Json + tags Json? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } @@ -30,6 +30,7 @@ model Tile { model Object { id String @id @default(uuid()) name String + tags Json? origin_x Decimal @default(0) origin_y Decimal @default(0) createdAt DateTime @default(now()) diff --git a/src/app/events/character/CharacterDelete.ts b/src/app/events/character/CharacterDelete.ts index 91c7566..a453003 100644 --- a/src/app/events/character/CharacterDelete.ts +++ b/src/app/events/character/CharacterDelete.ts @@ -1,23 +1,30 @@ import {Server} from "socket.io"; import {TSocket} from "../../utilities/Types"; -import {Character} from "@prisma/client"; +import { Character, Zone } from '@prisma/client' import CharacterRepository from "../../repositories/CharacterRepository"; -import {ZCharacterDelete} from "../../utilities/ZodTypes"; + +type TypePayload = { + character_id: number; +} + +type TypeResponse = { + zone: Zone; + characters: Character[]; +} export default function (socket: TSocket, io: Server) { - socket.on('character:delete', async (data: any) => { + socket.on('character:delete', async (data: TypePayload, callback: (response: TypeResponse) => void) => { // zod validate try { - data = ZCharacterDelete.parse(data); - - await CharacterRepository.deleteByUserIdAndId(socket.user?.id as number, data.id as number); + await CharacterRepository.deleteByUserIdAndId(socket.user?.id as number, data.character_id as number); const user_id = socket.user?.id as number; const characters: Character[] = await CharacterRepository.getByUserId(user_id) as Character[]; socket.emit('character:list', characters); } catch (error: any) { - return socket.emit('notification', {error: error.errors[0].message}); + console.log(error); + return socket.emit('notification', {message: 'Character delete failed. Please try again.'}); } }); } \ No newline at end of file diff --git a/src/app/events/gm/object/GmObjectUpdate.ts b/src/app/events/gm/object/GmObjectUpdate.ts index 4f3ded6..3d9da15 100644 --- a/src/app/events/gm/object/GmObjectUpdate.ts +++ b/src/app/events/gm/object/GmObjectUpdate.ts @@ -6,6 +6,7 @@ import { Object } from '@prisma/client' interface IPayload { id: string; name: string; + tags: string[]; origin_x: number; origin_y: number; } @@ -23,7 +24,7 @@ export default function (socket: TSocket, io: Server) { } try { - const object = await ObjectRepository.update(data.id, data.name, data.origin_x, data.origin_y); + const object = await ObjectRepository.update(data.id, data.name, data.tags, data.origin_x, data.origin_y); callback(true); } catch (error) { diff --git a/src/app/repositories/ObjectRepository.ts b/src/app/repositories/ObjectRepository.ts index c534277..ff065b9 100644 --- a/src/app/repositories/ObjectRepository.ts +++ b/src/app/repositories/ObjectRepository.ts @@ -22,11 +22,12 @@ class ObjectRepository { }); } - async update(id: string, name: string, origin_x: number, origin_y: number): Promise { + async update(id: string, name: string, tags: string[], origin_x: number, origin_y: number): Promise { return prisma.object.update({ where: { id }, data: { name, + tags, origin_x, origin_y }, diff --git a/src/app/utilities/ZodTypes.ts b/src/app/utilities/ZodTypes.ts index 0fa15d3..f9a8909 100644 --- a/src/app/utilities/ZodTypes.ts +++ b/src/app/utilities/ZodTypes.ts @@ -1,29 +1,28 @@ import { z } from 'zod'; export const loginAccountSchema = z.object({ - username: z.string().min(3, { - message: 'Username must be at least 3 characters long' - }).max(255), + username:z.string() + .min(3, { message: 'Name must be at least 3 characters long' }) + .max(255, { message: 'Name must be at most 255 characters long' }) + .regex(/^[A-Za-z][A-Za-z0-9_-]*$/, { message: 'Name must start with a letter and can only contain letters, numbers, underscores, or dashes' }), password: z.string().min(8, { message: 'Password must be at least 8 characters long' }).max(255) }); export const registerAccountSchema = z.object({ - username: z.string().min(3, { - message: 'Username must be at least 3 characters long' - }).max(255), + username: z.string() + .min(3, { message: 'Name must be at least 3 characters long' }) + .max(255, { message: 'Name must be at most 255 characters long' }) + .regex(/^[A-Za-z][A-Za-z0-9_-]*$/, { message: 'Name must start with a letter and can only contain letters, numbers, underscores, or dashes' }), password: z.string().min(8, { message: 'Password must be at least 8 characters long' }).max(255) }); export const ZCharacterCreate = z.object({ - name: z.string().min(3, { - message: 'Name must be at least 3 characters long' - }).max(255) -}); - -export const ZCharacterDelete = z.object({ - character_id: z.number() + name: z.string() + .min(3, { message: 'Name must be at least 3 characters long' }) + .max(255, { message: 'Name must be at most 255 characters long' }) + .regex(/^[A-Za-z][A-Za-z0-9_-]*$/, { message: 'Name must start with a letter and can only contain letters, numbers, underscores, or dashes' }) }); \ No newline at end of file