1
0
forked from noxious/server

Cleaned character create event

This commit is contained in:
Dennis Postma 2025-02-09 17:12:46 +01:00
parent 3802b2cf9d
commit 2b022ee4e0

View File

@ -1,4 +1,4 @@
import { ZodError } from 'zod' import { ZodError, z } from 'zod'
import { BaseEvent } from '#application/base/baseEvent' import { BaseEvent } from '#application/base/baseEvent'
import { ZCharacterCreate } from '#application/zodTypes' import { ZCharacterCreate } from '#application/zodTypes'
@ -8,65 +8,77 @@ import CharacterTypeRepository from '#repositories/characterTypeRepository'
import MapRepository from '#repositories/mapRepository' import MapRepository from '#repositories/mapRepository'
import UserRepository from '#repositories/userRepository' import UserRepository from '#repositories/userRepository'
const MAX_CHARACTERS = 4
export default class CharacterCreateEvent extends BaseEvent { export default class CharacterCreateEvent extends BaseEvent {
private readonly userRepository: UserRepository = new UserRepository()
private readonly characterRepository: CharacterRepository = new CharacterRepository()
private readonly characterTypeRepository: CharacterTypeRepository = new CharacterTypeRepository()
private readonly mapRepository: MapRepository = new MapRepository()
public listen(): void { public listen(): void {
this.socket.on('character:create', this.handleEvent.bind(this)) this.socket.on('character:create', this.handleEvent.bind(this))
} }
private async handleEvent(data: any): Promise<any> { private async handleEvent(data: z.infer<typeof ZCharacterCreate>, callback: (success: boolean) => void): Promise<void> {
// zod validate
try { try {
data = ZCharacterCreate.parse(data) const validatedData = ZCharacterCreate.parse(data)
await this.createCharacter(validatedData)
const userRepository = new UserRepository() callback(true)
const characterRepository = new CharacterRepository() } catch (error: unknown) {
const characterTypeRepository = new CharacterTypeRepository() this.returnError(error)
const mapRepository = new MapRepository() callback(false)
}
const user = await userRepository.getById(this.socket.userId!) }
private async createCharacter(data: z.infer<typeof ZCharacterCreate>): Promise<void> {
const user = await this.userRepository.getById(this.socket.userId!)
if (!user) { if (!user) {
return this.socket.emit('notification', { title: 'Error', message: 'You are not logged in' }) throw new Error('You are not logged in')
} }
// Check if character name already exists const characterExists = await this.characterRepository.getByName(data.name)
const characterExists = await characterRepository.getByName(data.name)
if (characterExists) { if (characterExists) {
return this.socket.emit('notification', { title: 'Error', message: 'Character name already exists' }) throw new Error('Character name already exists')
} }
let characters: Character[] = await characterRepository.getByUserId(user.getId()) let characters = await this.characterRepository.getByUserId(user.getId())
if (characters.length >= MAX_CHARACTERS) {
if (characters.length >= 4) { throw new Error(`You can only create ${MAX_CHARACTERS} characters`)
return this.socket.emit('notification', { title: 'Error', message: 'You can only create 4 characters' })
} }
// @TODO: Change to default location const map = await this.mapRepository.getFirst()
const map = await mapRepository.getFirst() if (!map) {
throw new Error('No default map found')
}
// @TODO: Change to selected character type const characterType = await this.characterTypeRepository.getFirst()
const characterType = await characterTypeRepository.getFirst() if (!characterType) {
throw new Error('No character type found')
}
const newCharacter = new Character() const newCharacter = new Character()
await newCharacter.setName(data.name).setUser(user).setMap(map!).setCharacterType(characterType).save() await newCharacter.setName(data.name).setUser(user).setMap(map).setCharacterType(characterType).save()
characters = await this.characterRepository.getByUserId(user.getId())
if (!newCharacter) {
return this.socket.emit('notification', { title: 'Error', message: 'Failed to create character. Please try again (later).' })
}
characters = [...characters, newCharacter]
this.socket.emit('character:create:success')
this.socket.emit('character:list', characters) this.socket.emit('character:list', characters)
this.logger.info('character:create success') this.logger.info('character:create success')
} catch (error: any) { }
this.logger.error(`character:create error: ${error.message}`)
private returnError(error: unknown): void {
this.logger.error(`character:create error: ${error instanceof Error ? error.message : 'Unknown error'}`)
let errorMessage = 'Could not create character. Please try again later.'
if (error instanceof ZodError) { if (error instanceof ZodError) {
return this.socket.emit('notification', { title: 'Error', message: error.issues[0]!.message }) errorMessage = error.issues[0]?.message || errorMessage
} } else if (error instanceof Error) {
return this.socket.emit('notification', { title: 'Error', message: 'Could not create character. Please try again (later).' }) errorMessage = error.message
} }
this.socket.emit('notification', {
title: 'Error',
message: errorMessage
})
} }
} }