From 1192955b36bb1bab9fa1325749f58c1a862d6bcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Minelli?= <michael@minelli.me> Date: Mon, 31 Jul 2023 23:50:21 +0200 Subject: [PATCH] ExerciceRoutes => Add route to get exerciceEnonce with immutable files --- ExpressAPI/src/routes/ExerciceRoutes.ts | 43 +++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/ExpressAPI/src/routes/ExerciceRoutes.ts b/ExpressAPI/src/routes/ExerciceRoutes.ts index 967e720..07239d0 100644 --- a/ExpressAPI/src/routes/ExerciceRoutes.ts +++ b/ExpressAPI/src/routes/ExerciceRoutes.ts @@ -20,6 +20,11 @@ import { Prisma } from '@prisma/client'; import { Enonce, Exercice } from '../types/DatabaseTypes'; import db from '../helpers/DatabaseHelper'; 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 { @@ -33,6 +38,8 @@ class ExerciceRoutes implements RoutesManager { registerOnBackend(backend: Express) { 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 { @@ -127,6 +134,42 @@ class ExerciceRoutes implements RoutesManager { 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 + }); + } } -- GitLab