diff --git a/src/repositories/tileRepository.ts b/src/repositories/tileRepository.ts index edbfdb5..f02a8a0 100644 --- a/src/repositories/tileRepository.ts +++ b/src/repositories/tileRepository.ts @@ -1,5 +1,8 @@ import prisma from '../utilities/prisma' // Import the global Prisma instance import { Tile } from '@prisma/client' +import zoneRepository from './zoneRepository' +import { unduplicateArray } from '../utilities/utilities' +import { FlattenZoneArray } from '../utilities/zone' class TileRepository { async getById(id: string): Promise { @@ -8,9 +11,28 @@ class TileRepository { }) } + async getByIds(ids: string[]): Promise { + return prisma.tile.findMany({ + where: { + id: { + in: ids + } + } + }) + } + async getAll(): Promise { return prisma.tile.findMany() } + + async getByZoneId(zoneId: number): Promise { + const zone = await zoneRepository.getById(zoneId) + if (!zone) return [] + + const zoneTileArray = unduplicateArray(FlattenZoneArray(JSON.parse(JSON.stringify(zone.tiles)))) + + return this.getByIds(zoneTileArray) + } } export default new TileRepository() diff --git a/src/repositories/zoneRepository.ts b/src/repositories/zoneRepository.ts index c596027..40bbd8c 100644 --- a/src/repositories/zoneRepository.ts +++ b/src/repositories/zoneRepository.ts @@ -91,52 +91,6 @@ class ZoneRepository { return [] } } - - async getZoneAssets(zone_id: number): Promise { - const zone = await this.getById(zone_id) - if (!zone) return [] - - const assets: TAsset[] = [] - - // 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, - url: '/assets/tiles/' + tileInfo.id + '.png', - group: 'tiles', - updatedAt: tileInfo?.updatedAt || new Date() - }) - } - - // Add object assets - for (const zoneObject of zone.zoneObjects) { - if (!zoneObject.object) continue - - assets.push({ - key: zoneObject.object.id, - url: '/assets/objects/' + zoneObject.object.id + '.png', - group: 'objects', - updatedAt: zoneObject.object.updatedAt || new Date() - }) - } - - // Filter out duplicate assets - return assets.reduce((acc: TAsset[], 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 new ZoneRepository() diff --git a/src/services/zoneService.ts b/src/services/zoneService.ts index 0cc4acd..da1e270 100644 --- a/src/services/zoneService.ts +++ b/src/services/zoneService.ts @@ -1,4 +1,14 @@ import prisma from '../utilities/prisma' +import { TAsset } 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 { @@ -27,6 +37,49 @@ class ZoneService { console.log('Demo zone created.') return true } + + async getZoneAssets(zone: getZoneAsetsZoneType): Promise { + const assets: TAsset[] = [] + + // 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, + url: '/assets/tiles/' + tileInfo.id + '.png', + group: 'tiles', + updatedAt: tileInfo?.updatedAt || new Date() + }) + } + + // Add object assets + for (const zoneObject of zone.zoneObjects) { + if (!zoneObject.object) continue + + assets.push({ + key: zoneObject.object.id, + url: '/assets/objects/' + zoneObject.object.id + '.png', + group: 'objects', + updatedAt: zoneObject.object.updatedAt || new Date() + }) + } + + // Filter out duplicate assets + return assets.reduce((acc: TAsset[], 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 diff --git a/src/utilities/http.ts b/src/utilities/http.ts index 52cbd63..56ea45d 100644 --- a/src/utilities/http.ts +++ b/src/utilities/http.ts @@ -6,7 +6,9 @@ import { loginAccountSchema, registerAccountSchema } from './zodTypes' import fs from 'fs' import { httpLogger } from './logger' import { getPublicPath } from './storage' -import zoneRepository from '../repositories/zoneRepository' +import TileRepository from '../repositories/tileRepository' +import { TAsset } from './types' +import ZoneRepository from '../repositories/zoneRepository' async function addHttpRoutes(app: Application) { /** @@ -59,38 +61,61 @@ async function addHttpRoutes(app: Application) { }) /** - * Get all tiles from a zone as an array of ids + * Get all tiles * @param req * @param res */ - // app.get('/assets/tiles/:zoneId', async (req: Request, res: Response) => { - // const zoneId = req.params.zoneId - // - // // Check if zoneId is valid number - // if (!zoneId || parseInt(zoneId) === 0) { - // return res.status(400).json({ message: 'Invalid zone ID' }) - // } - // - // // Get zone by id - // const zone = await zoneRepository.getById(parseInt(zoneId)) - // if (!zone) { - // return res.status(404).json({ message: 'Zone not found' }) - // } - // - // let tiles = zone.tiles; - // - // // Convert to array - // tiles = JSON.parse(JSON.stringify(tiles)) as string[] - // - // // Flatten the array - // tiles = [...new Set(tiles.flat())] - // - // // Remove duplicates - // tiles = tiles.filter((value, index, self) => self.indexOf(value) === index); - // - // // Return the array - // res.json(tiles) - // }) + app.get('/assets/list_tiles', async (req: Request, res: Response) => { + // Get all tiles + let assets: TAsset[] = [] + const tiles = await TileRepository.getAll() + for (const tile of tiles) { + assets.push({ + key: tile.id, + url: '/assets/tiles/' + tile.id + '.png', + group: 'tiles', + updatedAt: tile.updatedAt + }) + } + + // Return the array + res.json(tiles) + }) + + /** + * Get all tiles + * @param req + * @param res + */ + app.get('/assets/list_tiles/:zoneId', async (req: Request, res: Response) => { + const zoneId = req.params.zoneId + + // Check if zoneId is valid number + if (!zoneId || parseInt(zoneId) === 0) { + return res.status(400).json({ message: 'Invalid zone ID' }) + } + + // Get zone by id + const zone = await ZoneRepository.getById(parseInt(zoneId)) + if (!zone) { + return res.status(404).json({ message: 'Zone not found' }) + } + + // Get all tiles + let assets: TAsset[] = [] + const tiles = await TileRepository.getByZoneId(parseInt(zoneId)) + for (const tile of tiles) { + assets.push({ + key: tile.id, + url: '/assets/tiles/' + tile.id + '.png', + group: 'tiles', + updatedAt: tile.updatedAt + }) + } + + // Return the array + res.json(tiles) + }) /** * Get a specific asset diff --git a/src/utilities/utilities.ts b/src/utilities/utilities.ts new file mode 100644 index 0000000..fdab9a7 --- /dev/null +++ b/src/utilities/utilities.ts @@ -0,0 +1,3 @@ +export function unduplicateArray(array: any[]) { + return [...new Set(array.flat())] +} \ No newline at end of file diff --git a/src/utilities/zone.ts b/src/utilities/zone.ts new file mode 100644 index 0000000..e9c064c --- /dev/null +++ b/src/utilities/zone.ts @@ -0,0 +1,9 @@ +export function FlattenZoneArray(tiles: string[][]) { + const normalArray = [] + + for (const row of tiles) { + normalArray.push(...row) + } + + return normalArray +} \ No newline at end of file