Improved validation, added tags field to objects, fixed and improved character delete logics
This commit is contained in:
parent
3c0b713af0
commit
6b30d9db1d
@ -0,0 +1,5 @@
|
|||||||
|
-- AlterTable
|
||||||
|
ALTER TABLE `Object` ADD COLUMN `tags` JSON NULL;
|
||||||
|
|
||||||
|
-- AlterTable
|
||||||
|
ALTER TABLE `Tile` MODIFY `tags` JSON NULL;
|
@ -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())
|
||||||
|
@ -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.'});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
@ -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) {
|
||||||
|
@ -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
|
||||||
},
|
},
|
||||||
|
@ -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()
|
|
||||||
});
|
});
|
Loading…
x
Reference in New Issue
Block a user