import fs from 'fs/promises' import type { UUID } from '#application/types' import { BaseEvent } from '#application/base/baseEvent' import Storage from '#application/storage' import TileRepository from '#repositories/tileRepository' type Payload = { id: UUID } export default class GMTileDeleteEvent extends BaseEvent { public listen(): void { this.socket.on('gm:tile:delete', this.handleEvent.bind(this)) } private async handleEvent(data: Payload, callback: (response: boolean) => void): Promise { try { if (!(await this.isCharacterGM())) return this.logger.info(`Deleting tile ${data.id}`) await this.deleteTileFile(data.id) const tileRepository = new TileRepository() await (await tileRepository.getById(data.id))?.delete() this.logger.info(`Tile ${data.id} deleted successfully.`) return callback(true) } catch (error: unknown) { this.logger.error('gm:tile:delete error', error) return callback(false) } } private async deleteTileFile(tileId: string): Promise { const finalFilePath = Storage.getPublicPath('tiles', `${tileId}.png`) try { await fs.unlink(finalFilePath) } catch (error: any) { if (error.code !== 'ENOENT') { throw error } this.logger.warn(`File ${finalFilePath} does not exist.`) } } }