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