From 357a3fce679be657933715eef2fcbb9ba9ce0821 Mon Sep 17 00:00:00 2001 From: Gerald Schmittinger Date: Tue, 25 Feb 2025 00:39:24 +0100 Subject: [PATCH] Implemented mechanism to easily retrieve repositories. --- backend/src/data/repositories.ts | 16 ++++++++++++++++ backend/src/orm.ts | 11 +++++------ backend/tests/data/users.test.ts | 8 ++++---- backend/tests/{testutils.ts => setup-tests.ts} | 2 +- 4 files changed, 26 insertions(+), 11 deletions(-) create mode 100644 backend/src/data/repositories.ts rename backend/tests/{testutils.ts => setup-tests.ts} (76%) diff --git a/backend/src/data/repositories.ts b/backend/src/data/repositories.ts new file mode 100644 index 00000000..892e7ca3 --- /dev/null +++ b/backend/src/data/repositories.ts @@ -0,0 +1,16 @@ +import {AnyEntity, EntityName, EntityRepository} from "@mikro-orm/core"; +import {forkEntityManager} from "../orm"; +import {StudentRepository} from "./users/student-repository"; +import {Student} from "../entities/users/student.entity"; + +function repositoryGetter>(entity: EntityName): () => R { + let cachedRepo: R | undefined; + return (): R => { + if (!cachedRepo) { + cachedRepo = forkEntityManager().getRepository(entity) as R; + } + return cachedRepo; + } +} + +export const getStudentRepository = repositoryGetter(Student); diff --git a/backend/src/orm.ts b/backend/src/orm.ts index 35110024..e31efc14 100644 --- a/backend/src/orm.ts +++ b/backend/src/orm.ts @@ -1,4 +1,4 @@ -import {AnyEntity, EntityName, EntityRepository, MikroORM} from '@mikro-orm/core'; +import { EntityManager, MikroORM} from '@mikro-orm/core'; import config from './mikro-orm.config.js'; import {EnvVars, getEnvVar} from "./util/envvars"; @@ -17,10 +17,9 @@ export async function initORM(testingMode: boolean = false) { } } } - -export function getRepository(entityName: EntityName): EntityRepository { - if (orm === undefined) { - throw new Error("ORM is not initialized yet"); +export function forkEntityManager(): EntityManager { + if (!orm) { + throw Error("Accessing the Entity Manager before the ORM is fully initialized.") } - return orm.em.fork().getRepository(entityName); + return orm.em.fork(); } diff --git a/backend/tests/data/users.test.ts b/backend/tests/data/users.test.ts index c201f36f..c806f13c 100644 --- a/backend/tests/data/users.test.ts +++ b/backend/tests/data/users.test.ts @@ -1,8 +1,8 @@ -import {initializeTests} from "../testutils" +import {setupTestApp} from "../setup-tests" import {Student} from "../../src/entities/users/student.entity"; import {describe, it, expect, beforeAll} from "vitest"; -import {getRepository} from "../../src/orm"; import {StudentRepository} from "../../src/data/users/student-repository"; +import {getStudentRepository} from "../../src/data/repositories"; const username = "teststudent"; const firstName = "John"; @@ -11,8 +11,8 @@ describe("StudentRepository", () => { let studentRepository: StudentRepository; beforeAll(async () => { - await initializeTests() - studentRepository = getRepository(Student) as StudentRepository; + setupTestApp(); + studentRepository = getStudentRepository(); }); it("should return the queried student after he was added", async () => { diff --git a/backend/tests/testutils.ts b/backend/tests/setup-tests.ts similarity index 76% rename from backend/tests/testutils.ts rename to backend/tests/setup-tests.ts index af08b222..0fef6675 100644 --- a/backend/tests/testutils.ts +++ b/backend/tests/setup-tests.ts @@ -1,7 +1,7 @@ import {initORM} from "../src/orm"; import dotenv from "dotenv"; -export async function initializeTests() { +export async function setupTestApp() { dotenv.config({path: ".env.test"}); await initORM(true); }