From bc94b25a6a9df269eecad6b2abb94aae0a9d91d6 Mon Sep 17 00:00:00 2001 From: Gerald Schmittinger Date: Sun, 30 Mar 2025 11:27:25 +0200 Subject: [PATCH] fix(backend): Probleem opgelost dat meerdere studenten en leerkrachten met dezelfde PK opgeslagen konden worden. create() en insert() i.p.v. entity constructoren en persist() gebruikt. --- backend/src/data/dwengo-entity-repository.ts | 4 +--- backend/src/entities/users/student.entity.ts | 8 -------- backend/src/entities/users/teacher.entity.ts | 8 -------- backend/src/interfaces/student.ts | 9 ++++++--- backend/src/interfaces/teacher.ts | 11 +++++++---- backend/src/services/students.ts | 8 ++------ backend/tests/data/users/students.test.ts | 3 +-- backend/tests/data/users/teachers.test.ts | 3 +-- 8 files changed, 18 insertions(+), 36 deletions(-) diff --git a/backend/src/data/dwengo-entity-repository.ts b/backend/src/data/dwengo-entity-repository.ts index 6538d6f5..dc112b06 100644 --- a/backend/src/data/dwengo-entity-repository.ts +++ b/backend/src/data/dwengo-entity-repository.ts @@ -2,9 +2,7 @@ import { EntityRepository, FilterQuery } from '@mikro-orm/core'; export abstract class DwengoEntityRepository extends EntityRepository { public async save(entity: T) { - const em = this.getEntityManager(); - em.persist(entity); - await em.flush(); + await this.getEntityManager().insert(entity); } public async deleteWhere(query: FilterQuery) { const toDelete = await this.findOne(query); diff --git a/backend/src/entities/users/student.entity.ts b/backend/src/entities/users/student.entity.ts index da5b4367..58e82765 100644 --- a/backend/src/entities/users/student.entity.ts +++ b/backend/src/entities/users/student.entity.ts @@ -13,12 +13,4 @@ export class Student extends User { @ManyToMany(() => Group) groups!: Collection; - - constructor( - public username: string, - public firstName: string, - public lastName: string - ) { - super(); - } } diff --git a/backend/src/entities/users/teacher.entity.ts b/backend/src/entities/users/teacher.entity.ts index 8e22d1de..d53ca603 100644 --- a/backend/src/entities/users/teacher.entity.ts +++ b/backend/src/entities/users/teacher.entity.ts @@ -7,12 +7,4 @@ import { TeacherRepository } from '../../data/users/teacher-repository.js'; export class Teacher extends User { @ManyToMany(() => Class) classes!: Collection; - - constructor( - public username: string, - public firstName: string, - public lastName: string - ) { - super(); - } } diff --git a/backend/src/interfaces/student.ts b/backend/src/interfaces/student.ts index 079b355b..85ade31e 100644 --- a/backend/src/interfaces/student.ts +++ b/backend/src/interfaces/student.ts @@ -1,4 +1,5 @@ import { Student } from '../entities/users/student.entity.js'; +import {getStudentRepository} from "../data/repositories"; export interface StudentDTO { id: string; @@ -23,7 +24,9 @@ export function mapToStudentDTO(student: Student): StudentDTO { } export function mapToStudent(studentData: StudentDTO): Student { - const student = new Student(studentData.username, studentData.firstName, studentData.lastName); - - return student; + return getStudentRepository().create({ + username: studentData.username, + firstName: studentData.firstName, + lastName: studentData.lastName + }); } diff --git a/backend/src/interfaces/teacher.ts b/backend/src/interfaces/teacher.ts index 4dd6adb4..b4cda2d4 100644 --- a/backend/src/interfaces/teacher.ts +++ b/backend/src/interfaces/teacher.ts @@ -1,4 +1,5 @@ import { Teacher } from '../entities/users/teacher.entity.js'; +import {getTeacherRepository} from "../data/repositories"; export interface TeacherDTO { id: string; @@ -22,8 +23,10 @@ export function mapToTeacherDTO(teacher: Teacher): TeacherDTO { }; } -export function mapToTeacher(TeacherData: TeacherDTO): Teacher { - const teacher = new Teacher(TeacherData.username, TeacherData.firstName, TeacherData.lastName); - - return teacher; +export function mapToTeacher(teacherData: TeacherDTO): Teacher { + return getTeacherRepository().create({ + username: teacherData.username, + firstName: teacherData.firstName, + lastName: teacherData.lastName + }); } diff --git a/backend/src/services/students.ts b/backend/src/services/students.ts index 4775c8a4..97e41427 100644 --- a/backend/src/services/students.ts +++ b/backend/src/services/students.ts @@ -1,6 +1,4 @@ import { getClassRepository, getGroupRepository, getStudentRepository, getSubmissionRepository } from '../data/repositories.js'; -import { Class } from '../entities/classes/class.entity.js'; -import { Student } from '../entities/users/student.entity.js'; import { AssignmentDTO } from '../interfaces/assignment.js'; import { ClassDTO, mapToClassDTO } from '../interfaces/class.js'; import { GroupDTO, mapToGroupDTO, mapToGroupDTOId } from '../interfaces/group.js'; @@ -29,7 +27,7 @@ export async function createStudent(userData: StudentDTO): Promise await getAllAssignments(cls.classId!, full)))).flat(); - - return assignments; + return (await Promise.all(classes.map(async (cls) => await getAllAssignments(cls.classId!, full)))).flat(); } export async function getStudentGroups(username: string, full: boolean): Promise { diff --git a/backend/tests/data/users/students.test.ts b/backend/tests/data/users/students.test.ts index 78800e1f..04a037b6 100644 --- a/backend/tests/data/users/students.test.ts +++ b/backend/tests/data/users/students.test.ts @@ -1,5 +1,4 @@ import { setupTestApp } from '../../setup-tests.js'; -import { Student } from '../../../src/entities/users/student.entity.js'; import { describe, it, expect, beforeAll } from 'vitest'; import { StudentRepository } from '../../../src/data/users/student-repository.js'; import { getStudentRepository } from '../../../src/data/repositories.js'; @@ -30,7 +29,7 @@ describe('StudentRepository', () => { }); it('should return the queried student after he was added', async () => { - await studentRepository.insert(new Student(username, firstName, lastName)); + await studentRepository.insert(studentRepository.create({username, firstName, lastName})); const retrievedStudent = await studentRepository.findByUsername(username); expect(retrievedStudent).toBeTruthy(); diff --git a/backend/tests/data/users/teachers.test.ts b/backend/tests/data/users/teachers.test.ts index 0bd014a6..3ff828a7 100644 --- a/backend/tests/data/users/teachers.test.ts +++ b/backend/tests/data/users/teachers.test.ts @@ -2,7 +2,6 @@ import { describe, it, expect, beforeAll } from 'vitest'; import { TeacherRepository } from '../../../src/data/users/teacher-repository'; import { setupTestApp } from '../../setup-tests'; import { getTeacherRepository } from '../../../src/data/repositories'; -import { Teacher } from '../../../src/entities/users/teacher.entity'; const username = 'testteacher'; const firstName = 'John'; @@ -30,7 +29,7 @@ describe('TeacherRepository', () => { }); it('should return the queried teacher after he was added', async () => { - await teacherRepository.insert(new Teacher(username, firstName, lastName)); + await teacherRepository.insert(teacherRepository.create({username, firstName, lastName})); const retrievedTeacher = await teacherRepository.findByUsername(username); expect(retrievedTeacher).toBeTruthy();