import prisma from '../utilities/prisma' import { AssetData } from '../utilities/types' import tileRepository from '../repositories/tileRepository' import zoneRepository from '../repositories/zoneRepository' import { Object, Zone, ZoneObject } from '@prisma/client' type getZoneAsetsZoneType = Zone & { zoneObjects: (ZoneObject & { object: Object })[] } class ZoneService { async createDemoZone(): Promise { const tiles = [ ['blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile'], ['blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile'], ['blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile'], ['blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile'], ['blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile'], ['blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile'], ['blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile'], ['blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile'], ['blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile'], ['blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile'] ] await prisma.zone.create({ data: { name: 'Demo zone', width: 10, height: 10, tiles } }) console.log('Demo zone created.') return true } async getZoneAssets(zone: getZoneAsetsZoneType): Promise { const assets: AssetData[] = [] // zone.tiles is prisma jsonvalue let tiles = JSON.parse(JSON.stringify(zone.tiles)) tiles = [...new Set(tiles.flat())] // Add tile assets for (const tile of tiles) { const tileInfo = await tileRepository.getById(tile) if (!tileInfo) continue assets.push({ key: tileInfo.id, data: '/assets/tiles/' + tileInfo.id + '.png', group: 'tiles', updatedAt: tileInfo?.updatedAt || new Date() } as AssetData) } // Add object assets for (const zoneObject of zone.zoneObjects) { if (!zoneObject.object) continue assets.push({ key: zoneObject.object.id, data: '/assets/objects/' + zoneObject.object.id + '.png', group: 'objects', updatedAt: zoneObject.object.updatedAt || new Date() } as AssetData) } // Filter out duplicate assets return assets.reduce((acc: AssetData[], current) => { const x = acc.find((item) => item.key === current.key && item.group === current.group) if (!x) { return acc.concat([current]) } else { return acc } }, []) } } export default ZoneService