From 518d48c06510667c50a12459296306c9acdeff9c Mon Sep 17 00:00:00 2001
From: "kelly.nguyen" <kelly.nguyen@etu.hesge.ch>
Date: Tue, 18 Jun 2024 18:48:38 +0200
Subject: [PATCH] add branch add_export_route

---
 ExpressAPI/src/managers/GitlabManager.ts  | 13 ++++++++++++-
 ExpressAPI/src/routes/AssignmentRoutes.ts |  7 +++++++
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/ExpressAPI/src/managers/GitlabManager.ts b/ExpressAPI/src/managers/GitlabManager.ts
index bd2746a..56e81f7 100644
--- a/ExpressAPI/src/managers/GitlabManager.ts
+++ b/ExpressAPI/src/managers/GitlabManager.ts
@@ -3,7 +3,7 @@ import { StatusCodes }
 import GitlabVisibility                                                                                                                                                                       from '../shared/types/Gitlab/GitlabVisibility.js';
 import express                                                                                                                                                                                from 'express';
 import SharedConfig                                                                                                                                                                           from '../shared/config/SharedConfig.js';
-import { CommitSchema, ExpandedUserSchema, Gitlab, MemberSchema, ProjectBadgeSchema, ProjectSchema, ReleaseSchema, RepositoryFileExpandedSchema, RepositoryFileSchema, RepositoryTreeSchema } from '@gitbeaker/rest';
+import { ArchiveType, CommitSchema, ExpandedUserSchema, Gitlab, MemberSchema, ProjectBadgeSchema, ProjectSchema, ReleaseSchema, RepositoryFileExpandedSchema, RepositoryFileSchema, RepositoryTreeSchema } from '@gitbeaker/rest';
 import logger                                                                                                                                                                                 from '../shared/logging/WinstonLogger.js';
 import { AccessLevel, EditProjectOptions, ProjectVariableSchema, ProtectedBranchAccessLevel, ProtectedBranchSchema }                                                                          from '@gitbeaker/core';
 import DojoStatusCode                                                                                                                                                                         from '../shared/types/Dojo/DojoStatusCode.js';
@@ -267,6 +267,17 @@ class GitlabManager extends SharedGitlabManager {
             return Promise.reject(e);
         }
     }
+
+    async exportRepository(repoId: number, extension: ArchiveType): Promise<Blob> {
+        try {
+            return await this.api.Repositories.showArchive(repoId, {
+                fileType: extension
+            });
+        } catch ( e ) {
+            logger.error(JSON.stringify(e));
+            return Promise.reject(e);
+        }
+    }
 }
 
 
diff --git a/ExpressAPI/src/routes/AssignmentRoutes.ts b/ExpressAPI/src/routes/AssignmentRoutes.ts
index 5f46129..acac72d 100644
--- a/ExpressAPI/src/routes/AssignmentRoutes.ts
+++ b/ExpressAPI/src/routes/AssignmentRoutes.ts
@@ -80,6 +80,7 @@ class AssignmentRoutes implements RoutesManager {
         backend.post('/assignments/:assignmentNameOrUrl/corrections', SecurityMiddleware.check(true, SecurityCheckType.ASSIGNMENT_STAFF), ParamsValidatorMiddleware.validate(this.assignmentAddCorrigeValidator), this.linkUpdateAssignmentCorrection(false).bind(this) as RequestHandler);
         backend.patch('/assignments/:assignmentNameOrUrl/corrections/:exerciseIdOrUrl', SecurityMiddleware.check(true, SecurityCheckType.ASSIGNMENT_STAFF), ParamsValidatorMiddleware.validate(this.assignmentUpdateCorrigeValidator), this.linkUpdateAssignmentCorrection(true).bind(this) as RequestHandler);
         backend.delete('/assignments/:assignmentNameOrUrl/corrections/:exerciseIdOrUrl', SecurityMiddleware.check(true, SecurityCheckType.ASSIGNMENT_STAFF), this.unlinkAssignmentCorrection.bind(this) as RequestHandler);
+        backend.get('/assignments/:assignmentNameOrUrl/export', SecurityMiddleware.check(true, SecurityCheckType.ASSIGNMENT_STAFF), this.exportAssignment.bind(this) as RequestHandler);
     }
 
     // Get an assignment by its name or gitlab url
@@ -299,6 +300,12 @@ class AssignmentRoutes implements RoutesManager {
 
         return req.session.sendResponse(res, StatusCodes.OK);
     }
+
+    private async exportAssignment(req: express.Request, res: express.Response) {
+        let ext : Gitlab.ArchiveType = 'zip';
+        await GitlabManager.exportRepository(req.boundParams.assignment!.gitlabId, ext);
+        return req.session.sendResponse(res, StatusCodes.OK);
+    }
 }
 
 
-- 
GitLab