diff --git a/ExpressAPI/src/routes/ExerciseRoutes.ts b/ExpressAPI/src/routes/ExerciseRoutes.ts index b337158b4563d6e6eeb8cda9e3f5f5b61810223b..0642d3a99433e7d75432d573e8fda1f515f0b936 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;