From d7982493e1cf71c7808c5383b2fca3ecb4c56173 Mon Sep 17 00:00:00 2001 From: Dennis Postma Date: Sun, 5 Jan 2025 06:22:22 +0100 Subject: [PATCH] Map event tile improvements --- src/entities/map.ts | 2 +- src/entities/mapEventTile.ts | 2 +- src/entities/mapEventTileTeleport.ts | 2 +- src/entities/placedMapObject.ts | 4 +-- .../assetManager/characterType/update.ts | 13 ++----- .../gameMaster/assetManager/item/update.ts | 12 ++----- .../gameMaster/assetManager/sprite/list.ts | 3 +- src/events/gameMaster/mapEditor/update.ts | 22 ++++++------ src/events/map/characterMove.ts | 35 ++++++++----------- src/models/mapCharacter.ts | 8 +++-- src/repositories/characterHairRepository.ts | 20 ++++++++--- src/repositories/characterRepository.ts | 20 ++++++++--- src/repositories/characterTypeRepository.ts | 15 ++++++-- src/repositories/chatRepository.ts | 22 ++++++++---- src/repositories/itemRepository.ts | 15 ++++++-- src/repositories/mapEventTileRepository.ts | 12 ++++--- src/repositories/mapObjectRepository.ts | 10 ++++-- src/repositories/mapRepository.ts | 30 ++++++++-------- .../passwordResetTokenRepository.ts | 17 ++++++--- src/repositories/spriteRepository.ts | 5 ++- src/repositories/tileRepository.ts | 24 +++++++++---- src/repositories/userRepository.ts | 15 ++++++-- src/repositories/worldRepository.ts | 5 ++- 23 files changed, 198 insertions(+), 115 deletions(-) diff --git a/src/entities/map.ts b/src/entities/map.ts index 0c55814..2eddb52 100644 --- a/src/entities/map.ts +++ b/src/entities/map.ts @@ -46,7 +46,7 @@ export class Map extends BaseEntity { @OneToMany(() => PlacedMapObject, (pmo) => pmo.map, { name: 'placedMapObjects', - orphanRemoval: true, + orphanRemoval: true }) placedMapObjects = new Collection(this) diff --git a/src/entities/mapEventTile.ts b/src/entities/mapEventTile.ts index 3e33b2e..100b1b6 100644 --- a/src/entities/mapEventTile.ts +++ b/src/entities/mapEventTile.ts @@ -26,7 +26,7 @@ export class MapEventTile extends BaseEntity { @Property() positionY!: number - @OneToOne(() => MapEventTileTeleport, (teleport) => teleport.mapEventTile) + @OneToOne(() => MapEventTileTeleport, (teleport) => teleport.mapEventTile, { eager: true }) teleport?: MapEventTileTeleport setId(id: UUID) { diff --git a/src/entities/mapEventTileTeleport.ts b/src/entities/mapEventTileTeleport.ts index 1d62b97..7cfbf8d 100644 --- a/src/entities/mapEventTileTeleport.ts +++ b/src/entities/mapEventTileTeleport.ts @@ -16,7 +16,7 @@ export class MapEventTileTeleport extends BaseEntity { @OneToOne({ deleteRule: 'cascade' }) mapEventTile!: MapEventTile - @ManyToOne({ deleteRule: 'cascade' }) + @ManyToOne({ deleteRule: 'cascade', eager: true }) toMap!: Map @Property() diff --git a/src/entities/placedMapObject.ts b/src/entities/placedMapObject.ts index b1a6b90..4fa0cef 100644 --- a/src/entities/placedMapObject.ts +++ b/src/entities/placedMapObject.ts @@ -14,10 +14,10 @@ export class PlacedMapObject extends BaseEntity { @PrimaryKey() id = randomUUID() - @ManyToOne(()=> Map, { deleteRule: 'cascade' }) + @ManyToOne({ deleteRule: 'cascade' }) map!: Map - @ManyToOne({ deleteRule: 'cascade' }) + @ManyToOne({ deleteRule: 'cascade', eager: true }) mapObject!: MapObject @Property() diff --git a/src/events/gameMaster/assetManager/characterType/update.ts b/src/events/gameMaster/assetManager/characterType/update.ts index 47107a7..8b3b168 100644 --- a/src/events/gameMaster/assetManager/characterType/update.ts +++ b/src/events/gameMaster/assetManager/characterType/update.ts @@ -1,7 +1,7 @@ -import { UUID } from '#application/types' import { BaseEvent } from '#application/base/baseEvent' -import CharacterTypeRepository from '#repositories/characterTypeRepository' import { CharacterGender, CharacterRace } from '#application/enums' +import { UUID } from '#application/types' +import CharacterTypeRepository from '#repositories/characterTypeRepository' import SpriteRepository from '#repositories/spriteRepository' type Payload = { @@ -19,7 +19,6 @@ export default class CharacterTypeUpdateEvent extends BaseEvent { } private async handleEvent(data: Payload, callback: (success: boolean) => void): Promise { - try { if (!(await this.isCharacterGM())) return @@ -31,13 +30,7 @@ export default class CharacterTypeUpdateEvent extends BaseEvent { const sprite = await spriteRepository.getById(data.spriteId) if (!sprite) return callback(false) - await characterType - .setName(data.name) - .setGender(data.gender) - .setRace(data.race) - .setIsSelectable(data.isSelectable) - .setSprite(sprite) - .save() + await characterType.setName(data.name).setGender(data.gender).setRace(data.race).setIsSelectable(data.isSelectable).setSprite(sprite).save() return callback(true) } catch (error) { diff --git a/src/events/gameMaster/assetManager/item/update.ts b/src/events/gameMaster/assetManager/item/update.ts index ea2b84d..c8de11d 100644 --- a/src/events/gameMaster/assetManager/item/update.ts +++ b/src/events/gameMaster/assetManager/item/update.ts @@ -1,7 +1,7 @@ import { BaseEvent } from '#application/base/baseEvent' -import ItemRepository from '#repositories/itemRepository' import { ItemType, ItemRarity } from '#application/enums' import { UUID } from '#application/types' +import ItemRepository from '#repositories/itemRepository' import SpriteRepository from '#repositories/spriteRepository' type Payload = { @@ -20,7 +20,6 @@ export default class ItemUpdateEvent extends BaseEvent { } private async handleEvent(data: Payload, callback: (success: boolean) => void): Promise { - try { if (!(await this.isCharacterGM())) return @@ -32,14 +31,7 @@ export default class ItemUpdateEvent extends BaseEvent { const sprite = await spriteRepository.getById(data.spriteId) if (!sprite) return callback(false) - await item - .setName(data.name) - .setDescription(data.description) - .setItemType(data.itemType) - .setStackable(data.stackable) - .setRarity(data.rarity) - .setSprite(sprite) - .save() + await item.setName(data.name).setDescription(data.description).setItemType(data.itemType).setStackable(data.stackable).setRarity(data.rarity).setSprite(sprite).save() return callback(true) } catch (error) { diff --git a/src/events/gameMaster/assetManager/sprite/list.ts b/src/events/gameMaster/assetManager/sprite/list.ts index 9965962..38ec242 100644 --- a/src/events/gameMaster/assetManager/sprite/list.ts +++ b/src/events/gameMaster/assetManager/sprite/list.ts @@ -1,6 +1,5 @@ -import { Sprite } from '@prisma/client' - import { BaseEvent } from '#application/base/baseEvent' +import { Sprite } from '#entities/sprite' import SpriteRepository from '#repositories/spriteRepository' interface IPayload {} diff --git a/src/events/gameMaster/mapEditor/update.ts b/src/events/gameMaster/mapEditor/update.ts index c3608ce..ee56254 100644 --- a/src/events/gameMaster/mapEditor/update.ts +++ b/src/events/gameMaster/mapEditor/update.ts @@ -21,7 +21,7 @@ interface IPayload { positionX: number positionY: number teleport?: { - toMapId: UUID + toMap: Map toPositionX: number toPositionY: number toRotation: number @@ -32,6 +32,7 @@ interface IPayload { } export default class MapUpdateEvent extends BaseEvent { + private readonly populateOptions = ['mapEventTiles', 'placedMapObjects', 'mapEffects']; public listen(): void { this.socket.on('gm:map:update', this.handleEvent.bind(this)) } @@ -48,7 +49,7 @@ export default class MapUpdateEvent extends BaseEvent { return callback(null) } - let mapRepository = new MapRepository() + const mapRepository = new MapRepository() let map = await mapRepository.getById(data.mapId) if (!map) { @@ -57,7 +58,7 @@ export default class MapUpdateEvent extends BaseEvent { } // @ts-ignore - await mapRepository.getEntityManager().populate(map, ['*']) + await mapRepository.getEntityManager().populate(map, this.populateOptions) // Validation logic remains the same if (data.tiles.length > data.height) { @@ -83,7 +84,7 @@ export default class MapUpdateEvent extends BaseEvent { if (tile.teleport) { const teleport = new MapEventTileTeleport() - .setToMap((await mapRepository.getById(tile.teleport.toMapId))!) + .setToMap((await mapRepository.getById(tile.teleport.toMap.id))!) .setToPositionX(tile.teleport.toPositionX) .setToPositionY(tile.teleport.toPositionY) .setToRotation(tile.teleport.toRotation) @@ -91,7 +92,7 @@ export default class MapUpdateEvent extends BaseEvent { mapEventTile.setTeleport(teleport) } - // map.mapEventTiles.add(mapEventTile) + map.mapEventTiles.add(mapEventTile) } // Create and add new map objects @@ -103,26 +104,27 @@ export default class MapUpdateEvent extends BaseEvent { .setPositionX(object.positionX) .setPositionY(object.positionY) .setMap(map) + map.placedMapObjects.add(mapObject) } // Create and add new map effects for (const effect of data.mapEffects) { const mapEffect = new MapEffect().setEffect(effect.effect).setStrength(effect.strength).setMap(map) - // map.mapEffects.add(mapEffect) + + map.mapEffects.add(mapEffect) } console.log(map.getPlacedMapObjects().count()) // Update map properties - // map.setEntityManager(mapRepository.getEntityManager()) await map.setName(data.name).setWidth(data.width).setHeight(data.height).setTiles(data.tiles).setPvp(data.pvp).setUpdatedAt(new Date()).save() // Reload map from database to get fresh data - mapRepository = new MapRepository() map = await mapRepository.getById(data.mapId) + // @ts-ignore - await mapRepository.getEntityManager().populate(map!, ['*']) + await mapRepository.getEntityManager().populate(map!, this.populateOptions) if (!map) { this.logger.info(`User ${character!.getId()} tried to update map ${data.mapId} but it does not exist after update.`) @@ -135,7 +137,7 @@ export default class MapUpdateEvent extends BaseEvent { return callback(map) } catch (error: any) { - this.logger.error(`gm:mapObject:update error: ${error instanceof Error ? error.message : String(error)}`) + this.emitError(`gm:map:update error: ${error instanceof Error ? error.message + error.stack : String(error)}`) return callback(null) } } diff --git a/src/events/map/characterMove.ts b/src/events/map/characterMove.ts index 4c2862e..15af984 100644 --- a/src/events/map/characterMove.ts +++ b/src/events/map/characterMove.ts @@ -15,7 +15,7 @@ export default class CharacterMove extends BaseEvent { private async handleEvent({ positionX, positionY }: { positionX: number; positionY: number }): Promise { const mapCharacter = MapManager.getCharacterById(this.socket.characterId!) - if (!mapCharacter?.character) { + if (!mapCharacter?.getCharacter()) { this.logger.error('map:character:move error: Character not found or not initialized') return } @@ -39,7 +39,7 @@ export default class CharacterMove extends BaseEvent { } private async moveAlongPath(mapCharacter: MapCharacter, path: Array<{ x: number; y: number }>): Promise { - const { character } = mapCharacter + const character = mapCharacter.getCharacter() for (let i = 0; i < path.length - 1; i++) { if (!mapCharacter.isMoving || mapCharacter.currentPath !== path) { @@ -47,10 +47,10 @@ export default class CharacterMove extends BaseEvent { } const [start, end] = [path[i], path[i + 1]] - character.rotation = CharacterService.calculateRotation(start.x, start.y, end.x, end.y) + character.setRotation(CharacterService.calculateRotation(start.x, start.y, end.x, end.y)) const mapEventTileRepository = new MapEventTileRepository() - const mapEventTile = await mapEventTileRepository.getEventTileByMapIdAndPosition(character.map.id, Math.floor(end.x), Math.floor(end.y)) + const mapEventTile = await mapEventTileRepository.getEventTileByMapIdAndPosition(character.getMap().getId(), Math.floor(end.x), Math.floor(end.y)) if (mapEventTile?.type === 'BLOCK') break if (mapEventTile?.type === 'TELEPORT' && mapEventTile.teleport) { @@ -59,15 +59,14 @@ export default class CharacterMove extends BaseEvent { } // Update position first - character.positionX = end.x - character.positionY = end.y + character.setPositionX(end.x).setPositionY(end.y) // Then emit with the same properties this.io.in(character.map.id).emit('map:character:move', { characterId: character.id, - positionX: character.positionX, - positionY: character.positionY, - rotation: character.rotation, + positionX: character.getPositionX(), + positionY: character.getPositionY(), + rotation: character.getRotation(), isMoving: true }) @@ -80,18 +79,12 @@ export default class CharacterMove extends BaseEvent { } private async handleMapEventTile(mapEventTile: MapEventTileWithTeleport): Promise { - const mapCharacter = MapManager.getCharacterById(this.socket.characterId!) - if (!mapCharacter) { - this.logger.error('map:character:move error: Character not found') - return - } - - if (mapEventTile.teleport) { - await TeleportService.teleportCharacter(mapCharacter.character.id, { - targetMapId: mapEventTile.teleport.toMap.id, - targetX: mapEventTile.teleport.toPositionX, - targetY: mapEventTile.teleport.toPositionY, - rotation: mapCharacter.character.rotation + if (mapEventTile.getTeleport()) { + await TeleportService.teleportCharacter(this.socket.characterId!, { + targetMapId: mapEventTile.getTeleport()!.getToMap().getId(), + targetX: mapEventTile.getTeleport()!.getToPositionX(), + targetY: mapEventTile.getTeleport()!.getToPositionY(), + rotation: mapEventTile.getTeleport()!.getToRotation() }) } } diff --git a/src/models/mapCharacter.ts b/src/models/mapCharacter.ts index 7ef02a8..84d44af 100644 --- a/src/models/mapCharacter.ts +++ b/src/models/mapCharacter.ts @@ -1,6 +1,6 @@ import { Server } from 'socket.io' -import { TSocket } from '#application/types' +import { TSocket, UUID } from '#application/types' import { Character } from '#entities/character' import MapManager from '#managers/mapManager' import SocketManager from '#managers/socketManager' @@ -15,11 +15,15 @@ class MapCharacter { this.character = character } + public getCharacter(): Character { + return this.character + } + public async savePosition() { await this.character.setPositionX(this.character.positionX).setPositionY(this.character.positionY).setRotation(this.character.rotation).setMap(this.character.map).save() } - public async teleport(mapId: number, targetX: number, targetY: number): Promise { + public async teleport(mapId: UUID, targetX: number, targetY: number): Promise { await TeleportService.teleportCharacter(this.character.id, { targetMapId: mapId, targetX, diff --git a/src/repositories/characterHairRepository.ts b/src/repositories/characterHairRepository.ts index 12916e7..5128703 100644 --- a/src/repositories/characterHairRepository.ts +++ b/src/repositories/characterHairRepository.ts @@ -6,7 +6,10 @@ class CharacterHairRepository extends BaseRepository { async getFirst() { try { const repository = this.getEntityManager().getRepository(CharacterHair) - return await repository.findOne({ id: { $exists: true } }) + const result = await repository.findOne({ id: { $exists: true } }) + if (result) result.setEntityManager(this.getEntityManager()) + + return result } catch (error: any) { this.logger.error(`Failed to get first character hair: ${error instanceof Error ? error.message : String(error)}`) return null @@ -16,7 +19,10 @@ class CharacterHairRepository extends BaseRepository { async getAll(): Promise { try { const repository = this.getEntityManager().getRepository(CharacterHair) - return await repository.findAll() + const results = await repository.findAll() + for (const result of results) result.setEntityManager(this.getEntityManager()) + + return results } catch (error: any) { this.logger.error(`Failed to get all character hair: ${error instanceof Error ? error.message : String(error)}`) return [] @@ -26,7 +32,10 @@ class CharacterHairRepository extends BaseRepository { async getAllSelectable(populate?: any): Promise { try { const repository = this.getEntityManager().getRepository(CharacterHair) - return await repository.find({ isSelectable: true }, { populate }) + const results = await repository.find({ isSelectable: true }, { populate }) + for (const result of results) result.setEntityManager(this.getEntityManager()) + + return results } catch (error: any) { this.logger.error(`Failed to get selectable character hair: ${error instanceof Error ? error.message : String(error)}`) return [] @@ -36,7 +45,10 @@ class CharacterHairRepository extends BaseRepository { async getById(id: UUID): Promise { try { const repository = this.getEntityManager().getRepository(CharacterHair) - return await repository.findOne({ id }) + const result = await repository.findOne({ id }) + if (result) result.setEntityManager(this.getEntityManager()) + + return result } catch (error: any) { this.logger.error(`Failed to get character hair by ID: ${error instanceof Error ? error.message : String(error)}`) return null diff --git a/src/repositories/characterRepository.ts b/src/repositories/characterRepository.ts index fff667c..bfde58a 100644 --- a/src/repositories/characterRepository.ts +++ b/src/repositories/characterRepository.ts @@ -6,7 +6,10 @@ class CharacterRepository extends BaseRepository { async getByUserId(userId: UUID): Promise { try { const repository = this.getEntityManager().getRepository(Character) - return await repository.find({ user: userId }) + const results = await repository.find({ user: userId }) + for (const result of results) result.setEntityManager(this.getEntityManager()) + + return results } catch (error: any) { this.logger.error(`Failed to get character by user ID: ${error instanceof Error ? error.message : String(error)}`) return [] @@ -16,7 +19,10 @@ class CharacterRepository extends BaseRepository { async getByUserAndId(userId: UUID, characterId: UUID): Promise { try { const repository = this.getEntityManager().getRepository(Character) - return await repository.findOne({ user: userId, id: characterId }) + const result = await repository.findOne({ user: userId, id: characterId }) + if (result) result.setEntityManager(this.getEntityManager()) + + return result } catch (error: any) { this.logger.error(`Failed to get character by user ID and character ID: ${error instanceof Error ? error.message : String(error)}`) return null @@ -26,7 +32,10 @@ class CharacterRepository extends BaseRepository { async getById(id: UUID, populate?: any): Promise { try { const repository = this.getEntityManager().getRepository(Character) - return await repository.findOne({ id }, { populate }) + const result = await repository.findOne({ id }, { populate }) + if (result) result.setEntityManager(this.getEntityManager()) + + return result } catch (error: any) { this.logger.error(`Failed to get character by ID: ${error instanceof Error ? error.message : String(error)}`) return null @@ -36,7 +45,10 @@ class CharacterRepository extends BaseRepository { async getByName(name: string, populate?: any): Promise { try { const repository = this.getEntityManager().getRepository(Character) - return await repository.findOne({ name }, { populate }) + const result = await repository.findOne({ name }, { populate }) + if (result) result.setEntityManager(this.getEntityManager()) + + return result } catch (error: any) { this.logger.error(`Failed to get character by name: ${error instanceof Error ? error.message : String(error)}`) return null diff --git a/src/repositories/characterTypeRepository.ts b/src/repositories/characterTypeRepository.ts index 05a7a6f..a99b684 100644 --- a/src/repositories/characterTypeRepository.ts +++ b/src/repositories/characterTypeRepository.ts @@ -6,7 +6,10 @@ class CharacterTypeRepository extends BaseRepository { async getFirst() { try { const repository = this.getEntityManager().getRepository(CharacterType) - return await repository.findOne({ id: { $exists: true } }) + const result = await repository.findOne({ id: { $exists: true } }) + if (result) result.setEntityManager(this.getEntityManager()) + + return result } catch (error: any) { this.logger.error(`Failed to get first character type: ${error instanceof Error ? error.message : String(error)}`) return null @@ -16,7 +19,10 @@ class CharacterTypeRepository extends BaseRepository { async getAll() { try { const repository = this.getEntityManager().getRepository(CharacterType) - return await repository.findAll() + const results = await repository.findAll() + for (const result of results) result.setEntityManager(this.getEntityManager()) + + return results } catch (error: any) { this.logger.error(`Failed to get all character types: ${error instanceof Error ? error.message : String(error)}`) return [] @@ -26,7 +32,10 @@ class CharacterTypeRepository extends BaseRepository { async getById(id: UUID) { try { const repository = this.getEntityManager().getRepository(CharacterType) - return await repository.findOne({ id }) + const result = await repository.findOne({ id }) + if (result) result.setEntityManager(this.getEntityManager()) + + return result } catch (error: any) { this.logger.error(`Failed to get character type by ID: ${error instanceof Error ? error.message : String(error)}`) return null diff --git a/src/repositories/chatRepository.ts b/src/repositories/chatRepository.ts index c90587c..6beb721 100644 --- a/src/repositories/chatRepository.ts +++ b/src/repositories/chatRepository.ts @@ -6,9 +6,10 @@ class ChatRepository extends BaseRepository { async getById(id: UUID): Promise { try { const repository = this.getEntityManager().getRepository(Chat) - return await repository.find({ - id - }) + const results = await repository.find({ id }) + for (const result of results) result.setEntityManager(this.getEntityManager()) + + return results } catch (error: any) { this.logger.error(`Failed to get chat by ID: ${error instanceof Error ? error.message : String(error)}`) return [] @@ -18,7 +19,10 @@ class ChatRepository extends BaseRepository { async getAll(): Promise { try { const repository = this.getEntityManager().getRepository(Chat) - return await repository.findAll() + const results = await repository.findAll() + for (const result of results) result.setEntityManager(this.getEntityManager()) + + return results } catch (error: any) { this.logger.error(`Failed to get all chats: ${error instanceof Error ? error.message : String(error)}`) return [] @@ -28,7 +32,10 @@ class ChatRepository extends BaseRepository { async getByCharacterId(characterId: UUID): Promise { try { const repository = this.getEntityManager().getRepository(Chat) - return await repository.find({ character: characterId }) + const results = await repository.find({ character: characterId }) + for (const result of results) result.setEntityManager(this.getEntityManager()) + + return results } catch (error: any) { this.logger.error(`Failed to get chats by character ID: ${error instanceof Error ? error.message : String(error)}`) return [] @@ -38,7 +45,10 @@ class ChatRepository extends BaseRepository { async getByMapId(mapId: UUID): Promise { try { const repository = this.getEntityManager().getRepository(Chat) - return await repository.find({ map: mapId }) + const results = await repository.find({ map: mapId }) + for (const result of results) result.setEntityManager(this.getEntityManager()) + + return results } catch (error: any) { this.logger.error(`Failed to get chats by map ID: ${error instanceof Error ? error.message : String(error)}`) return [] diff --git a/src/repositories/itemRepository.ts b/src/repositories/itemRepository.ts index 75aff00..e891dc4 100644 --- a/src/repositories/itemRepository.ts +++ b/src/repositories/itemRepository.ts @@ -6,7 +6,10 @@ class ItemRepository extends BaseRepository { async getById(id: UUID): Promise { try { const repository = this.getEntityManager().getRepository(Item) - return await repository.findOne({ id }) + const result = await repository.findOne({ id }) + if (result) result.setEntityManager(this.getEntityManager()) + + return result } catch (error: any) { this.logger.error(`Failed to get item by ID: ${error instanceof Error ? error.message : String(error)}`) return null @@ -16,7 +19,10 @@ class ItemRepository extends BaseRepository { async getByIds(ids: UUID[]): Promise { try { const repository = this.getEntityManager().getRepository(Item) - return await repository.find({ id: ids }) + const results = await repository.find({ id: ids }) + for (const result of results) result.setEntityManager(this.getEntityManager()) + + return results } catch (error: any) { this.logger.error(`Failed to get items by IDs: ${error instanceof Error ? error.message : String(error)}`) return [] @@ -26,7 +32,10 @@ class ItemRepository extends BaseRepository { async getAll(): Promise { try { const repository = this.getEntityManager().getRepository(Item) - return await repository.findAll() + const results = await repository.findAll() + for (const result of results) result.setEntityManager(this.getEntityManager()) + + return results } catch (error: any) { this.logger.error(`Failed to get all items: ${error instanceof Error ? error.message : String(error)}`) return [] diff --git a/src/repositories/mapEventTileRepository.ts b/src/repositories/mapEventTileRepository.ts index 0df028f..fa5b861 100644 --- a/src/repositories/mapEventTileRepository.ts +++ b/src/repositories/mapEventTileRepository.ts @@ -6,9 +6,10 @@ class MapEventTileRepository extends BaseRepository { async getAll(id: UUID): Promise { try { const repository = this.getEntityManager().getRepository(MapEventTile) - return await repository.find({ - map: id - }) + const results = await repository.find({ map: id }) + for (const result of results) result.setEntityManager(this.getEntityManager()) + + return results } catch (error: any) { this.logger.error(`Failed to get map event tiles: ${error.message}`) return [] @@ -18,11 +19,14 @@ class MapEventTileRepository extends BaseRepository { async getEventTileByMapIdAndPosition(mapId: UUID, positionX: number, positionY: number) { try { const repository = this.getEntityManager().getRepository(MapEventTile) - return await repository.findOne({ + const result = await repository.findOne({ map: mapId, positionX: positionX, positionY: positionY }) + if (result) result.setEntityManager(this.getEntityManager()) + + return result } catch (error: any) { this.logger.error(`Failed to get map event tile: ${error.message}`) return null diff --git a/src/repositories/mapObjectRepository.ts b/src/repositories/mapObjectRepository.ts index bb0a6a0..e4c64b5 100644 --- a/src/repositories/mapObjectRepository.ts +++ b/src/repositories/mapObjectRepository.ts @@ -6,7 +6,10 @@ class MapObjectRepository extends BaseRepository { async getById(id: UUID): Promise { try { const repository = this.getEntityManager().getRepository(MapObject) - return await repository.findOne({ id }) + const result = await repository.findOne({ id }) + if (result) result.setEntityManager(this.getEntityManager()) + + return result } catch (error: any) { return null } @@ -15,7 +18,10 @@ class MapObjectRepository extends BaseRepository { async getAll(): Promise { try { const repository = this.getEntityManager().getRepository(MapObject) - return await repository.findAll() + const results = await repository.findAll() + for (const result of results) result.setEntityManager(this.getEntityManager()) + + return results } catch (error: any) { return [] } diff --git a/src/repositories/mapRepository.ts b/src/repositories/mapRepository.ts index 7c8fc13..4bea1d1 100644 --- a/src/repositories/mapRepository.ts +++ b/src/repositories/mapRepository.ts @@ -8,7 +8,10 @@ class MapRepository extends BaseRepository { async getFirst(): Promise { try { const repository = this.getEntityManager().getRepository(Map) - return await repository.findOne({ id: { $exists: true } }) + const result = await repository.findOne({ id: { $exists: true } }) + if (result) result.setEntityManager(this.getEntityManager()) + + return result } catch (error: any) { this.logger.error(`Failed to get first map: ${error instanceof Error ? error.message : String(error)}`) return null @@ -18,7 +21,10 @@ class MapRepository extends BaseRepository { async getAll(): Promise { try { const repository = this.getEntityManager().getRepository(Map) - return await repository.findAll() + const results = await repository.findAll() + for (const result of results) result.setEntityManager(this.getEntityManager()) + + return results } catch (error: any) { this.logger.error(`Failed to get all map: ${error.message}`) return [] @@ -41,7 +47,10 @@ class MapRepository extends BaseRepository { async getEventTiles(id: UUID): Promise { try { const repository = this.getEntityManager().getRepository(MapEventTile) - return await repository.find({ map: id }) + const results = await repository.find({ map: id }) + for (const result of results) result.setEntityManager(this.getEntityManager()) + + return results } catch (error: any) { this.logger.error(`Failed to get map event tiles: ${error.message}`) return [] @@ -51,26 +60,19 @@ class MapRepository extends BaseRepository { async getFirstEventTile(mapId: UUID, positionX: number, positionY: number): Promise { try { const repository = this.getEntityManager().getRepository(MapEventTile) - return await repository.findOne({ + const result = await repository.findOne({ map: mapId, positionX: positionX, positionY: positionY }) + if (result) result.setEntityManager(this.getEntityManager()) + + return result } catch (error: any) { this.logger.error(`Failed to get map event tile: ${error.message}`) return null } } - - async getMapObjects(id: UUID): Promise { - try { - const repository = this.getEntityManager().getRepository(MapObject) - return await repository.find({ map: id }) - } catch (error: any) { - this.logger.error(`Failed to get map objects: ${error.message}`) - return [] - } - } } export default MapRepository diff --git a/src/repositories/passwordResetTokenRepository.ts b/src/repositories/passwordResetTokenRepository.ts index 6baaf6b..2be1e2f 100644 --- a/src/repositories/passwordResetTokenRepository.ts +++ b/src/repositories/passwordResetTokenRepository.ts @@ -1,4 +1,4 @@ -import { BaseRepository } from '#application/base/baseRepository' // Import the global Prisma instance +import { BaseRepository } from '#application/base/baseRepository' import { UUID } from '#application/types' import { PasswordResetToken } from '#entities/passwordResetToken' @@ -6,7 +6,10 @@ class PasswordResetTokenRepository extends BaseRepository { async getById(id: UUID): Promise { try { const repository = this.getEntityManager().getRepository(PasswordResetToken) - return await repository.findOne({ id }) + const result = await repository.findOne({ id }) + if (result) result.setEntityManager(this.getEntityManager()) + + return result } catch (error: any) { // Handle error this.logger.error(`Failed to get password reset token by ID: ${error instanceof Error ? error.message : String(error)}`) @@ -16,9 +19,12 @@ class PasswordResetTokenRepository extends BaseRepository { async getByUserId(userId: UUID): Promise { try { const repository = this.getEntityManager().getRepository(PasswordResetToken) - return await repository.findOne({ + const result = await repository.findOne({ user: userId }) + if (result) result.setEntityManager(this.getEntityManager()) + + return result } catch (error: any) { // Handle error this.logger.error(`Failed to get password reset token by user ID: ${error instanceof Error ? error.message : String(error)}`) @@ -28,7 +34,10 @@ class PasswordResetTokenRepository extends BaseRepository { async getByToken(token: string): Promise { try { const repository = this.getEntityManager().getRepository(PasswordResetToken) - return await repository.findOne({ token }) + const result = await repository.findOne({ token }) + if (result) result.setEntityManager(this.getEntityManager()) + + return result } catch (error: any) { // Handle error this.logger.error(`Failed to get password reset token by token: ${error instanceof Error ? error.message : String(error)}`) diff --git a/src/repositories/spriteRepository.ts b/src/repositories/spriteRepository.ts index 233b543..a686e0b 100644 --- a/src/repositories/spriteRepository.ts +++ b/src/repositories/spriteRepository.ts @@ -6,7 +6,10 @@ class SpriteRepository extends BaseRepository { async getById(id: UUID, populate?: any) { try { const repository = this.getEntityManager().getRepository(Sprite) - return await repository.findOne({ id }, { populate }) + const result = await repository.findOne({ id }, { populate }) + if (result) result.setEntityManager(this.getEntityManager()) + + return result } catch (error: any) { return null } diff --git a/src/repositories/tileRepository.ts b/src/repositories/tileRepository.ts index 4713039..6147bdc 100644 --- a/src/repositories/tileRepository.ts +++ b/src/repositories/tileRepository.ts @@ -11,7 +11,10 @@ class TileRepository extends BaseRepository { async getById(id: UUID) { try { const repository = this.getEntityManager().getRepository(Tile) - return await repository.findOne({ id }) + const result = await repository.findOne({ id }) + if (result) result.setEntityManager(this.getEntityManager()) + + return result } catch (error: any) { return null } @@ -20,9 +23,12 @@ class TileRepository extends BaseRepository { async getByIds(ids: UUID[]) { try { const repository = this.getEntityManager().getRepository(Tile) - return await repository.find({ + const results = await repository.find({ id: ids }) + for (const result of results) result.setEntityManager(this.getEntityManager()) + + return results } catch (error: any) { return [] } @@ -31,7 +37,10 @@ class TileRepository extends BaseRepository { async getAll() { try { const repository = this.getEntityManager().getRepository(Tile) - return await repository.findAll() + const results = await repository.findAll() + for (const result of results) result.setEntityManager(this.getEntityManager()) + + return results } catch (error: any) { return [] } @@ -39,17 +48,20 @@ class TileRepository extends BaseRepository { async getByMapId(mapId: UUID) { try { - const repository = this.getEntityManager().getRepository(Map) + const mapRepository = this.getEntityManager().getRepository(Map) const tileRepository = this.getEntityManager().getRepository(Tile) - const map = await repository.findOne({ id: mapId }) + const map = await mapRepository.findOne({ id: mapId }) if (!map) return [] const mapTileArray = unduplicateArray(MapService.flattenMapArray(JSON.parse(JSON.stringify(map.tiles)))) - return await tileRepository.find({ + const results = await tileRepository.find({ id: mapTileArray }) + for (const result of results) result.setEntityManager(this.getEntityManager()) + + return results } catch (error: any) { return [] } diff --git a/src/repositories/userRepository.ts b/src/repositories/userRepository.ts index d81f190..3f25d97 100644 --- a/src/repositories/userRepository.ts +++ b/src/repositories/userRepository.ts @@ -6,7 +6,10 @@ class UserRepository extends BaseRepository { async getById(id: UUID) { try { const repository = this.getEntityManager().getRepository(User) - return await repository.findOne({ id }) + const result = await repository.findOne({ id }) + if (result) result.setEntityManager(this.getEntityManager()) + + return result } catch (error: any) { this.logger.error(`Failed to get user by ID: ${error instanceof Error ? error.message : String(error)}`) return null @@ -16,7 +19,10 @@ class UserRepository extends BaseRepository { async getByUsername(username: string) { try { const repository = this.getEntityManager().getRepository(User) - return await repository.findOne({ username }) + const result = await repository.findOne({ username }) + if (result) result.setEntityManager(this.getEntityManager()) + + return result } catch (error: any) { this.logger.error(`Failed to get user by username: ${error instanceof Error ? error.message : String(error)}`) return null @@ -26,7 +32,10 @@ class UserRepository extends BaseRepository { async getByEmail(email: string) { try { const repository = this.getEntityManager().getRepository(User) - return await repository.findOne({ email }) + const result = await repository.findOne({ email }) + if (result) result.setEntityManager(this.getEntityManager()) + + return result } catch (error: any) { this.logger.error(`Failed to get user by email: ${error instanceof Error ? error.message : String(error)}`) return null diff --git a/src/repositories/worldRepository.ts b/src/repositories/worldRepository.ts index 325e8d9..72e63cb 100644 --- a/src/repositories/worldRepository.ts +++ b/src/repositories/worldRepository.ts @@ -5,7 +5,10 @@ class WorldRepository extends BaseRepository { async getFirst() { try { const repository = this.getEntityManager().getRepository(World) - return await repository.findOne({ date: { $exists: true } }) + const result = await repository.findOne({ date: { $exists: true } }) + if (result) result.setEntityManager(this.getEntityManager()) + + return result } catch (error: any) { this.logger.error(`Failed to get first world: ${error instanceof Error ? error.message : String(error)}`) }