import fs from 'fs' import { Server } from 'socket.io' import { gameMasterLogger } from '#application/logger' import prisma from '#application/prisma' import { getPublicPath } from '#application/storage' import { TSocket } from '#application/types' import CharacterRepository from '#repositories/characterRepository' type Payload = { id: string } export default class GMSpriteDeleteEvent { private readonly public_folder: string constructor( private readonly io: Server, private readonly socket: TSocket ) { this.public_folder = getPublicPath('sprites') } public listen(): void { this.socket.on('gm:sprite:delete', this.handleEvent.bind(this)) } private async handleEvent(data: Payload, callback: (response: boolean) => void): Promise { const character = await CharacterRepository.getById(this.socket.characterId!) if (character?.role !== 'gm') { return callback(false) } try { await this.deleteSpriteFolder(data.id) await this.deleteSpriteFromDatabase(data.id) gameMasterLogger.info(`Sprite ${data.id} deleted.`) callback(true) } catch (error: any) { gameMasterLogger.error('gm:sprite:delete error', error.message) callback(false) } } private async deleteSpriteFolder(spriteId: string): Promise { const finalFilePath = getPublicPath('sprites', spriteId) if (fs.existsSync(finalFilePath)) { await fs.promises.rmdir(finalFilePath, { recursive: true }) } } private async deleteSpriteFromDatabase(spriteId: string): Promise { await prisma.sprite.delete({ where: { id: spriteId } }) } }