import { Server } from 'socket.io' import { TSocket } from '../../../../utilities/types' import fs from 'fs' import prisma from '../../../../utilities/prisma' import { gameMasterLogger } from '../../../../utilities/logger' import { getPublicPath } from '../../../../utilities/storage' 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.handleSpriteDelete.bind(this)) } private async handleSpriteDelete(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 } }) } }