Skip to content
Snippets Groups Projects
Commit 1192955b authored by michael.minelli's avatar michael.minelli
Browse files

ExerciceRoutes => Add route to get exerciceEnonce with immutable files

parent c123ad9e
No related branches found
No related tags found
No related merge requests found
...@@ -20,6 +20,11 @@ import { Prisma } from '@prisma/client'; ...@@ -20,6 +20,11 @@ import { Prisma } from '@prisma/client';
import { Enonce, Exercice } from '../types/DatabaseTypes'; import { Enonce, Exercice } from '../types/DatabaseTypes';
import db from '../helpers/DatabaseHelper'; import db from '../helpers/DatabaseHelper';
import SecurityCheckType from '../types/SecurityCheckType'; import SecurityCheckType from '../types/SecurityCheckType';
import GitlabTreeFile from '../shared/types/Gitlab/GitlabTreeFile';
import GitlabFile from '../shared/types/Gitlab/GitlabFile';
import YAML from 'yaml';
import EnonceFile from '../shared/types/Dojo/EnonceFile';
import GitlabTreeFileType from '../shared/types/Gitlab/GitlabTreeFileType';
class ExerciceRoutes implements RoutesManager { class ExerciceRoutes implements RoutesManager {
...@@ -33,6 +38,8 @@ class ExerciceRoutes implements RoutesManager { ...@@ -33,6 +38,8 @@ class ExerciceRoutes implements RoutesManager {
registerOnBackend(backend: Express) { registerOnBackend(backend: Express) {
backend.post('/enonces/:enonceNameOrUrl/exercices', SecurityMiddleware.check(true, SecurityCheckType.ENONCE_IS_PUBLISHED), ParamsValidatorMiddleware.validate(this.exerciceValidator), this.createExercice.bind(this)); backend.post('/enonces/:enonceNameOrUrl/exercices', SecurityMiddleware.check(true, SecurityCheckType.ENONCE_IS_PUBLISHED), ParamsValidatorMiddleware.validate(this.exerciceValidator), this.createExercice.bind(this));
backend.get('/exercices/:exerciceId/enonce', SecurityMiddleware.check(false, SecurityCheckType.EXERCICE_SECRET), this.getEnonce.bind(this));
} }
private getExerciceName(enonce: Enonce, members: Array<GitlabUser>, suffix: number): string { private getExerciceName(enonce: Enonce, members: Array<GitlabUser>, suffix: number): string {
...@@ -127,6 +134,42 @@ class ExerciceRoutes implements RoutesManager { ...@@ -127,6 +134,42 @@ class ExerciceRoutes implements RoutesManager {
return res.status(StatusCodes.INTERNAL_SERVER_ERROR).send(); return res.status(StatusCodes.INTERNAL_SERVER_ERROR).send();
} }
} }
private async getEnonce(req: ApiRequest, res: express.Response) {
const repoTree: Array<GitlabTreeFile> = await GitlabManager.getRepositoryTree(req.boundParams.exercice.gitlabId);
let enonceYamlFile: GitlabFile;
let immutableFiles: Array<GitlabFile> = await Promise.all(Config.enonce.baseFiles.map(async (baseFile: string) => {
let file = await GitlabManager.getFile(req.boundParams.exercice.gitlabId, baseFile);
if ( baseFile === Config.enonce.filename ) {
enonceYamlFile = file;
}
return file;
}));
const dojoEnonceFile: EnonceFile = YAML.parse(atob(enonceYamlFile.content));
const immutablePaths = dojoEnonceFile.immutable.map(fileDescriptor => fileDescriptor.path);
await Promise.all(repoTree.map(async gitlabTreeFile => {
if ( gitlabTreeFile.type == GitlabTreeFileType.BLOB ) {
for ( const immutablePath of immutablePaths ) {
if ( gitlabTreeFile.path.startsWith(immutablePath) ) {
immutableFiles.push(await GitlabManager.getFile(req.boundParams.exercice.gitlabId, gitlabTreeFile.path));
break;
}
}
}
}));
return req.session.sendResponse(res, StatusCodes.OK, {
enonce : (req.boundParams.exercice as Exercice).enonce,
enonceFile: dojoEnonceFile,
immutable : immutableFiles
});
}
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment