From d1d2008fa84092b68acd3b272a06263fa176b16d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C3=ABl=20Minelli?= <michael@minelli.me>
Date: Tue, 23 Jan 2024 18:19:06 +0100
Subject: [PATCH] ExerciseRoutes => Create: test if the max exercise per
 assignment is reached for at least one member

---
 ExpressAPI/src/routes/ExerciseRoutes.ts | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/ExpressAPI/src/routes/ExerciseRoutes.ts b/ExpressAPI/src/routes/ExerciseRoutes.ts
index b337158..0642d3a 100644
--- a/ExpressAPI/src/routes/ExerciseRoutes.ts
+++ b/ExpressAPI/src/routes/ExerciseRoutes.ts
@@ -30,6 +30,7 @@ import ExerciseResultsFile       from '../shared/types/Dojo/ExerciseResultsFile'
 import DojoStatusCode            from '../shared/types/Dojo/DojoStatusCode';
 import GlobalHelper              from '../helpers/GlobalHelper';
 import { IFileDirStat }          from '../shared/helpers/recursiveFilesStats/RecursiveFilesStats';
+import ExerciseManager           from '../managers/ExerciseManager';
 
 
 class ExerciseRoutes implements RoutesManager {
@@ -90,6 +91,21 @@ class ExerciseRoutes implements RoutesManager {
         const assignment: Assignment = req.boundParams.assignment!;
 
 
+        const exercises: Array<Exercise> | undefined = await ExerciseManager.getFromAssignment(assignment.name, { members: true });
+        const reachedLimitUsers: Array<GitlabUser> = [];
+        if ( exercises ) {
+            for ( const member of params.members ) {
+                const exerciseCount: number = exercises.filter(exercise => exercise.members.findIndex(exerciseMember => exerciseMember.id === member.id) !== -1).length;
+                if ( exerciseCount >= Config.exercise.maxPerAssignment ) {
+                    reachedLimitUsers.push(member);
+                }
+            }
+        }
+        if ( reachedLimitUsers.length > 0 ) {
+            return req.session.sendResponse(res, StatusCodes.INSUFFICIENT_SPACE_ON_RESOURCE, reachedLimitUsers, 'Max exercise per assignment reached', DojoStatusCode.MAX_EXERCISE_PER_ASSIGNMENT_REACHED);
+        }
+
+
         const exerciseId: string = uuidv4();
         const secret: string = uuidv4();
         let repository!: GitlabRepository;
-- 
GitLab