Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision

Target

Select target project
  • Dojo_Project_Nguyen/backend/dojobackendapi
  • dojo_project/projects/backend/dojobackendapi
2 results
Select Git revision
Show changes
Commits on Source (8)
......@@ -18,7 +18,13 @@
-->
## 3.3.0 (???)
## 3.4.0 (???)
### ✨ Feature
- Limit of 2 exercises by user
## 3.3.0 (2023-01-18)
### ✨ Feature
- **CLI**: Show an information message when a new version of the CLI is available (and not required)
......
This diff is collapsed.
openapi: 3.1.0
info:
title: Dojo API
version: 3.3.0
version: 3.4.0
description: |
**Backend API of the Dojo project.**
......
{
"name": "dojo_backend_api",
"version": "3.3.0",
"version": "3.4.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "dojo_backend_api",
"version": "3.3.0",
"version": "3.4.0",
"license": "AGPLv3",
"dependencies": {
"@prisma/client": "^5.8.1",
......@@ -8877,7 +8877,8 @@
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
"integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
"dev": true
"dev": true,
"peer": true
},
"node_modules/through": {
"version": "2.3.8",
......
{
"name" : "dojo_backend_api",
"description" : "Backend API of the Dojo project",
"version" : "3.3.0",
"version" : "3.4.0",
"license" : "AGPLv3",
"author" : "Michaël Minelli <dojo@minelli.me>",
"main" : "dist/src/app.js",
......
......@@ -57,7 +57,7 @@ class Config {
};
public readonly exercise: {
maxSameName: number; resultsFolder: string, pipelineResultsFolder: string; default: {
maxSameName: number; maxPerAssignment: number; resultsFolder: string, pipelineResultsFolder: string; default: {
description: string; visibility: string;
};
};
......@@ -126,6 +126,7 @@ class Config {
this.exercise = {
maxSameName : Number(process.env.EXERCISE_MAX_SAME_NAME || 0),
maxPerAssignment : Number(process.env.EXERCISE_MAX_PER_ASSIGNMENT || 2),
resultsFolder : process.env.EXERCISE_RESULTS_FOLDER?.convertWithEnvVars() ?? '',
pipelineResultsFolder: process.env.EXERCISE_PIPELINE_RESULTS_FOLDER ?? '', //Do not use convertWithEnvVars() because it is used in the exercise creation and muste be interpreted at exercise runtime
default : {
......
......@@ -12,6 +12,15 @@ class ExerciseManager {
include: include
}) as unknown as Exercise ?? undefined;
}
async getFromAssignment(assignmentName: string, include: Prisma.ExerciseInclude | undefined = undefined): Promise<Array<Exercise> | undefined> {
return await db.exercise.findMany({
where : {
assignmentName: assignmentName
},
include: include
}) as Array<Exercise> ?? undefined;
}
}
......
......@@ -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;
......
Subproject commit 89f3579ca9009f793742170928d808ab4c35d931
Subproject commit 75f67b647da34337f3b220cacf78b2115d6022bc