1
0
forked from noxious/server

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 {
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())

View File

@ -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.'});
}
});
}

View File

@ -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) {

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({
where: { id },
data: {
name,
tags,
origin_x,
origin_y
},

View File

@ -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' })
});