From 3d8c8302d6b1844802d0562c8174f42f90c908bc Mon Sep 17 00:00:00 2001 From: Adriaan Jacquet Date: Sat, 17 May 2025 12:13:37 +0200 Subject: [PATCH] fix: bug in put assignment waarbij groepen niet werden aangepast gefixt --- .../src/data/assignments/group-repository.ts | 5 ++++ backend/src/data/dwengo-entity-repository.ts | 10 +++++++ backend/src/services/assignments.ts | 27 +++++++++++++++++-- 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/backend/src/data/assignments/group-repository.ts b/backend/src/data/assignments/group-repository.ts index f06080f7..2e8ec067 100644 --- a/backend/src/data/assignments/group-repository.ts +++ b/backend/src/data/assignments/group-repository.ts @@ -28,4 +28,9 @@ export class GroupRepository extends DwengoEntityRepository { groupNumber: groupNumber, }); } + public async deleteAllByAssignment(assignment: Assignment): Promise { + return this.deleteAllWhere({ + assignment: assignment, + }); + } } diff --git a/backend/src/data/dwengo-entity-repository.ts b/backend/src/data/dwengo-entity-repository.ts index 1267c726..407dd452 100644 --- a/backend/src/data/dwengo-entity-repository.ts +++ b/backend/src/data/dwengo-entity-repository.ts @@ -1,5 +1,6 @@ import { EntityRepository, FilterQuery } from '@mikro-orm/core'; import { EntityAlreadyExistsException } from '../exceptions/entity-already-exists-exception.js'; +import { getLogger } from '../logging/initalize.js'; export abstract class DwengoEntityRepository extends EntityRepository { public async save(entity: T, options?: { preventOverwrite?: boolean }): Promise { @@ -16,4 +17,13 @@ export abstract class DwengoEntityRepository extends EntityRep await em.flush(); } } + public async deleteAllWhere(query: FilterQuery): Promise { + const toDelete = await this.find(query); + const em = this.getEntityManager(); + + if (toDelete) { + em.remove(toDelete); + await em.flush(); + } + } } diff --git a/backend/src/services/assignments.ts b/backend/src/services/assignments.ts index 728904d3..3be1709c 100644 --- a/backend/src/services/assignments.ts +++ b/backend/src/services/assignments.ts @@ -18,6 +18,8 @@ import { EntityDTO } from '@mikro-orm/core'; import { putObject } from './service-helper.js'; import { fetchStudents } from './students.js'; import { ServerErrorException } from '../exceptions/server-error-exception.js'; +import { createGroup, deleteGroup, fetchAllGroups } from './groups.js'; +import { BadRequestException } from '../exceptions/bad-request-exception.js'; export async function fetchAssignment(classid: string, assignmentNumber: number): Promise { const classRepository = getClassRepository(); @@ -95,10 +97,31 @@ export async function getAssignment(classid: string, id: number): Promise>): Promise { +export async function putAssignment(classid: string, id: number, assignmentData: Partial): Promise { const assignment = await fetchAssignment(classid, id); - await putObject(assignment, assignmentData, getAssignmentRepository()); + if (assignmentData.groups) { + const hasDuplicates = (arr: string[]) => new Set(arr).size !== arr.length; + if (hasDuplicates(assignmentData.groups.flat() as string[])) { + throw new BadRequestException("Student can only be in one group"); + } + + const studentLists = await Promise.all((assignmentData.groups! as string[][]).map(async group => await fetchStudents(group))); + + const groupRepository = getGroupRepository(); + await groupRepository.deleteAllByAssignment(assignment); + await Promise.all(studentLists.map(async students => { + const newGroup = groupRepository.create({ + assignment: assignment, + members: students, + }); + await groupRepository.save(newGroup); + })); + + delete assignmentData.groups; + } + + await putObject(assignment, assignmentData as Partial>, getAssignmentRepository()); return mapToAssignmentDTO(assignment); }