import { Zone, ZoneEventTile, ZoneEventTileType, ZoneObject } from '@prisma/client' import prisma from '../utilities/prisma' import { ZoneEventTileWithTeleport } from '../socketEvents/zone/characterMove' import { appLogger } from '../utilities/logger' import { AssetData } from '../utilities/types' import tileRepository from './tileRepository' class ZoneRepository { async getFirst(): Promise { try { return await prisma.zone.findFirst() } catch (error: any) { appLogger.error(`Failed to get first zone: ${error.message}`) return null } } async getAll(): Promise { try { return await prisma.zone.findMany() } catch (error: any) { appLogger.error(`Failed to get all zone: ${error.message}`) return [] } } async getById(id: number) { try { return await prisma.zone.findUnique({ where: { id: id }, include: { zoneEventTiles: { include: { zone: true, teleport: true } }, zoneObjects: { include: { object: true } }, zoneEffects: true } }) } catch (error: any) { appLogger.error(`Failed to get zone by id: ${error.message}`) return null } } async getEventTiles(id: number): Promise { try { return await prisma.zoneEventTile.findMany({ where: { zoneId: id } }) } catch (error: any) { appLogger.error(`Failed to get zone event tiles: ${error.message}`) return [] } } async getEventTeleportTiles(id: number): Promise { try { return (await prisma.zoneEventTile.findMany({ where: { zoneId: id, type: ZoneEventTileType.TELEPORT }, include: { teleport: true } })) as unknown as ZoneEventTileWithTeleport[] } catch (error: any) { appLogger.error(`Failed to get zone event tiles: ${error.message}`) return [] } } async getZoneObjects(id: number): Promise { try { return await prisma.zoneObject.findMany({ where: { zoneId: id } }) } catch (error: any) { appLogger.error(`Failed to get zone objects: ${error.message}`) return [] } } } export default new ZoneRepository()