diff --git a/backend/src/data/repositories.ts b/backend/src/data/repositories.ts index 892e7ca3..2aaef875 100644 --- a/backend/src/data/repositories.ts +++ b/backend/src/data/repositories.ts @@ -1,16 +1,76 @@ -import {AnyEntity, EntityName, EntityRepository} from "@mikro-orm/core"; +import {AnyEntity, EntityManager, EntityName, EntityRepository} from "@mikro-orm/core"; import {forkEntityManager} from "../orm"; import {StudentRepository} from "./users/student-repository"; import {Student} from "../entities/users/student.entity"; +import {User} from "../entities/users/user.entity"; +import {UserRepository} from "./users/user-repository"; +import {Teacher} from "../entities/users/teacher.entity"; +import {TeacherRepository} from "./users/teacher-repository"; +import {Class} from "../entities/classes/class.entity"; +import {ClassRepository} from "./classes/class-repository"; +import {ClassJoinRequest} from "../entities/classes/class-join-request.entity"; +import {ClassJoinRequestRepository} from "./classes/class-join-request-repository"; +import {TeacherInvitationRepository} from "./classes/teacher-invitation-repository"; +import {TeacherInvitation} from "../entities/classes/teacher-invitation.entity"; +import {Assignment} from "../entities/assignments/assignment.entity"; +import {AssignmentRepository} from "./assignments/assignment-repository"; +import {GroupRepository} from "./assignments/group-repository"; +import {Group} from "../entities/assignments/group.entity"; +import {Submission} from "../entities/assignments/submission.entity"; +import {SubmissionRepository} from "./assignments/submission-repository"; +import {Question} from "../entities/questions/question.entity"; +import {QuestionRepository} from "./questions/question-repository"; +import {Answer} from "../entities/questions/answer.entity"; +import {AnswerRepository} from "./questions/answer-repository"; +import {LearningObject} from "../entities/content/learning-object.entity"; +import {LearningObjectRepository} from "./content/learning-object-repository"; +import {LearningPath} from "../entities/content/learning-path.entity"; +import {LearningPathRepository} from "./content/learning-path-repository"; +import {AttachmentRepository} from "./content/attachment-repository"; +import {Attachment} from "../entities/content/attachment.entity"; + +let entityManager: EntityManager | undefined; + +/** + * Execute all the database operations within the function f in a single transaction. + */ +export function transactional(f: () => Promise) { + entityManager?.transactional(f); +} function repositoryGetter>(entity: EntityName): () => R { let cachedRepo: R | undefined; return (): R => { if (!cachedRepo) { - cachedRepo = forkEntityManager().getRepository(entity) as R; + if (!entityManager) { + entityManager = forkEntityManager(); + } + cachedRepo = entityManager.getRepository(entity) as R; } return cachedRepo; } } +/* Users */ +export const getUserRepository = repositoryGetter(User) export const getStudentRepository = repositoryGetter(Student); +export const getTeacherRepository = repositoryGetter(Teacher); + +/* Classes */ +export const getClassRepository = repositoryGetter(Class); +export const getClassJoinRequestRepository = repositoryGetter(ClassJoinRequest); +export const getTeacherInvitationRepository = repositoryGetter(TeacherInvitationRepository); + +/* Assignments */ +export const getAssignmentRepository = repositoryGetter(Assignment); +export const getGroupRepository = repositoryGetter(Group); +export const getSubmissionRepository = repositoryGetter(Submission); + +/* Questions and answers */ +export const getQuestionRepository = repositoryGetter(Question); +export const getAnswerRepository = repositoryGetter(Answer); + +/* Learning content */ +export const getLearningObjectRepository = repositoryGetter(LearningObject); +export const getLearningPathRepository = repositoryGetter(LearningPath); +export const getAttachmentRepository = repositoryGetter(Assignment); diff --git a/backend/src/data/users/user-repository.ts b/backend/src/data/users/user-repository.ts index 111244cd..65e053ac 100644 --- a/backend/src/data/users/user-repository.ts +++ b/backend/src/data/users/user-repository.ts @@ -1,7 +1,7 @@ import {DwengoEntityRepository} from "../dwengo-entity-repository"; import {User} from "../../entities/users/user.entity"; -export class StudentRepository extends DwengoEntityRepository { +export class UserRepository extends DwengoEntityRepository { public findByUsername(username: string): Promise { return this.findOne({username: username}); } diff --git a/backend/tests/data/users.test.ts b/backend/tests/data/users.test.ts index c806f13c..1a538ba7 100644 --- a/backend/tests/data/users.test.ts +++ b/backend/tests/data/users.test.ts @@ -11,7 +11,7 @@ describe("StudentRepository", () => { let studentRepository: StudentRepository; beforeAll(async () => { - setupTestApp(); + await setupTestApp(); studentRepository = getStudentRepository(); });