diff --git a/src/repositories/baseRepository.ts b/src/repositories/baseRepository.ts new file mode 100644 index 0000000..f59f7de --- /dev/null +++ b/src/repositories/baseRepository.ts @@ -0,0 +1,24 @@ +import { appLogger } from '#utilities/logger' +import { Database } from '#utilities/database' +import { EntityManager, MikroORM } from '@mikro-orm/core' + +export abstract class BaseRepository { + protected orm!: MikroORM + protected em!: EntityManager + + constructor() { + this.initializeORM().catch((error) => { + appLogger.error(`Failed to initialize Repository: ${error instanceof Error ? error.message : String(error)}`) + }) + } + + private async initializeORM() { + try { + this.orm = await Database.getInstance() + this.em = this.orm.em.fork() + } catch (error: any) { + appLogger.error(`Failed to initialize ORM: ${error instanceof Error ? error.message : String(error)}`) + throw error + } + } +} \ No newline at end of file diff --git a/src/repositories/characterHairRepository.ts b/src/repositories/characterHairRepository.ts index a4afa22..5368658 100644 --- a/src/repositories/characterHairRepository.ts +++ b/src/repositories/characterHairRepository.ts @@ -1,29 +1,44 @@ -import prisma from '#utilities/prisma' // Import the global Prisma instance -import { CharacterHair } from '@prisma/client' +import { BaseRepository } from './baseRepository' +import { CharacterHair } from '#entities/characterHair' +import { appLogger } from '#utilities/logger' -class CharacterHairRepository { - async getAll(): Promise { - return prisma.characterHair.findMany() +class CharacterHairRepository extends BaseRepository { + async getAll() { + try { + const repository = this.em.getRepository(CharacterHair) + return await repository.findAll() + } catch (error: any) { + appLogger.error(`Failed to get all character hair: ${error instanceof Error ? error.message : String(error)}`) + return null + } } - async getAllSelectable(): Promise { - return prisma.characterHair.findMany({ - where: { + + async getAllSelectable() { + try { + const repository = this.em.getRepository(CharacterHair) + return await repository.find({ isSelectable: true - } - }) + }) + } catch (error: any) { + appLogger.error(`Failed to get selectable character hair: ${error instanceof Error ? error.message : String(error)}`) + return null + } } + async getById(id: number) { - return prisma.characterHair.findUnique({ - where: { id }, - include: { - sprite: { - include: { - spriteActions: true - } + try { + const repository = this.em.getRepository(CharacterHair) + return await repository.findOne( + { id }, + { + populate: ['sprite.spriteActions'] } - } - }) + ) + } catch (error: any) { + appLogger.error(`Failed to get character hair by ID: ${error instanceof Error ? error.message : String(error)}`) + return null + } } } -export default new CharacterHairRepository() +export default new CharacterHairRepository() \ No newline at end of file diff --git a/src/repositories/userRepository.ts b/src/repositories/userRepository.ts index 08eec32..ddb7607 100644 --- a/src/repositories/userRepository.ts +++ b/src/repositories/userRepository.ts @@ -1,19 +1,13 @@ import { appLogger } from '#utilities/logger' -import { Database } from '#utilities/database' -import { User } from '../entities/user' +import { BaseRepository } from './baseRepository' +import { User } from '#entities/user' -class UserRepository { +class UserRepository extends BaseRepository { async getById(id: number) { try { - const orm = await Database.getInstance() - const em = orm.em.fork() - const repository = em.getRepository(User) - - return await repository.findOne({ - id - }) + const repository = this.em.getRepository(User) + return await repository.findOne({ id }) } catch (error: any) { - // Handle error appLogger.error(`Failed to get user by ID: ${error instanceof Error ? error.message : String(error)}`) return null } @@ -21,15 +15,9 @@ class UserRepository { async getByUsername(username: string) { try { - const orm = await Database.getInstance() - const em = orm.em.fork() - const repository = em.getRepository(User) - - return await repository.findOne({ - username - }) + const repository = this.em.getRepository(User) + return await repository.findOne({ username }) } catch (error: any) { - // Handle error appLogger.error(`Failed to get user by username: ${error instanceof Error ? error.message : String(error)}`) return null } @@ -37,19 +25,13 @@ class UserRepository { async getByEmail(email: string) { try { - const orm = await Database.getInstance() - const em = orm.em.fork() - const repository = em.getRepository(User) - - return await repository.findOne({ - email - }) + const repository = this.em.getRepository(User) + return await repository.findOne({ email }) } catch (error: any) { - // Handle error appLogger.error(`Failed to get user by email: ${error instanceof Error ? error.message : String(error)}`) return null } } } -export default new UserRepository() +export default new UserRepository() \ No newline at end of file