Improved validation, added tags field to objects, fixed and improved character delete logics

This commit is contained in:
Dennis Postma 2024-07-16 00:17:05 +02:00
parent 3c0b713af0
commit 6b30d9db1d
6 changed files with 37 additions and 23 deletions

View File

@ -0,0 +1,5 @@
-- AlterTable
ALTER TABLE `Object` ADD COLUMN `tags` JSON NULL;
-- AlterTable
ALTER TABLE `Tile` MODIFY `tags` JSON NULL;

View File

@ -22,7 +22,7 @@ datasource db {
model Tile { model Tile {
id String @id @default(uuid()) id String @id @default(uuid())
name String name String
tags Json tags Json?
createdAt DateTime @default(now()) createdAt DateTime @default(now())
updatedAt DateTime @updatedAt updatedAt DateTime @updatedAt
} }
@ -30,6 +30,7 @@ model Tile {
model Object { model Object {
id String @id @default(uuid()) id String @id @default(uuid())
name String name String
tags Json?
origin_x Decimal @default(0) origin_x Decimal @default(0)
origin_y Decimal @default(0) origin_y Decimal @default(0)
createdAt DateTime @default(now()) createdAt DateTime @default(now())

View File

@ -1,23 +1,30 @@
import {Server} from "socket.io"; import {Server} from "socket.io";
import {TSocket} from "../../utilities/Types"; import {TSocket} from "../../utilities/Types";
import {Character} from "@prisma/client"; import { Character, Zone } from '@prisma/client'
import CharacterRepository from "../../repositories/CharacterRepository"; 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) { 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 // zod validate
try { try {
data = ZCharacterDelete.parse(data); await CharacterRepository.deleteByUserIdAndId(socket.user?.id as number, data.character_id as number);
await CharacterRepository.deleteByUserIdAndId(socket.user?.id as number, data.id as number);
const user_id = socket.user?.id as number; const user_id = socket.user?.id as number;
const characters: Character[] = await CharacterRepository.getByUserId(user_id) as Character[]; const characters: Character[] = await CharacterRepository.getByUserId(user_id) as Character[];
socket.emit('character:list', characters); socket.emit('character:list', characters);
} catch (error: any) { } 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.'});
} }
}); });
} }

View File

@ -6,6 +6,7 @@ import { Object } from '@prisma/client'
interface IPayload { interface IPayload {
id: string; id: string;
name: string; name: string;
tags: string[];
origin_x: number; origin_x: number;
origin_y: number; origin_y: number;
} }
@ -23,7 +24,7 @@ export default function (socket: TSocket, io: Server) {
} }
try { 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); callback(true);
} catch (error) { } catch (error) {

View File

@ -22,11 +22,12 @@ class ObjectRepository {
}); });
} }
async update(id: string, name: string, origin_x: number, origin_y: number): Promise<Object> { async update(id: string, name: string, tags: string[], origin_x: number, origin_y: number): Promise<Object> {
return prisma.object.update({ return prisma.object.update({
where: { id }, where: { id },
data: { data: {
name, name,
tags,
origin_x, origin_x,
origin_y origin_y
}, },

View File

@ -1,29 +1,28 @@
import { z } from 'zod'; import { z } from 'zod';
export const loginAccountSchema = z.object({ export const loginAccountSchema = z.object({
username: z.string().min(3, { username:z.string()
message: 'Username must be at least 3 characters long' .min(3, { message: 'Name must be at least 3 characters long' })
}).max(255), .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, { password: z.string().min(8, {
message: 'Password must be at least 8 characters long' message: 'Password must be at least 8 characters long'
}).max(255) }).max(255)
}); });
export const registerAccountSchema = z.object({ export const registerAccountSchema = z.object({
username: z.string().min(3, { username: z.string()
message: 'Username must be at least 3 characters long' .min(3, { message: 'Name must be at least 3 characters long' })
}).max(255), .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, { password: z.string().min(8, {
message: 'Password must be at least 8 characters long' message: 'Password must be at least 8 characters long'
}).max(255) }).max(255)
}); });
export const ZCharacterCreate = z.object({ export const ZCharacterCreate = z.object({
name: z.string().min(3, { name: z.string()
message: 'Name must be at least 3 characters long' .min(3, { message: 'Name must be at least 3 characters long' })
}).max(255) .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' })
export const ZCharacterDelete = z.object({
character_id: z.number()
}); });