From 9f589825a91760cf492fd13535b18d066fcaa98f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C3=ABl=20Minelli?= <git@minelli.me>
Date: Mon, 4 Mar 2024 15:15:27 +0100
Subject: [PATCH] GitlabManager => Add custom error status code

---
 ExpressAPI/src/managers/GitlabManager.ts | 15 +++++++++++----
 ExpressAPI/src/routes/GitlabRoutes.ts    |  2 +-
 ExpressAPI/src/shared                    |  2 +-
 3 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/ExpressAPI/src/managers/GitlabManager.ts b/ExpressAPI/src/managers/GitlabManager.ts
index ceadae5..c03c34b 100644
--- a/ExpressAPI/src/managers/GitlabManager.ts
+++ b/ExpressAPI/src/managers/GitlabManager.ts
@@ -16,6 +16,7 @@ import GitlabProfile            from '../shared/types/Gitlab/GitlabProfile';
 import GitlabRelease            from '../shared/types/Gitlab/GitlabRelease';
 import { CommitSchema, Gitlab } from '@gitbeaker/rest';
 import logger                   from '../shared/logging/WinstonLogger';
+import DojoStatusCode           from '../shared/types/Dojo/DojoStatusCode';
 
 
 class GitlabManager {
@@ -169,16 +170,18 @@ class GitlabManager {
         return response.data;
     }
 
-    async checkTemplateAccess(projectIdOrNamespace: string, req: express.Request): Promise<StatusCodes> {
+    async checkTemplateAccess(projectIdOrNamespace: string, req: express.Request, res: express.Response) {
         // Get the Gitlab project and check if it have public or internal visibility
         try {
             const project: GitlabRepository = await this.getRepository(projectIdOrNamespace);
 
             if ( [ GitlabVisibility.PUBLIC.valueOf(), GitlabVisibility.INTERNAL.valueOf() ].includes(project.visibility) ) {
-                return StatusCodes.OK;
+                req.session.sendResponse(res, StatusCodes.OK);
+                return;
             }
         } catch ( e ) {
-            return StatusCodes.NOT_FOUND;
+            req.session.sendResponse(res, StatusCodes.NOT_FOUND, undefined, 'Template not found', DojoStatusCode.GITLAB_TEMPLATE_NOT_FOUND);
+            return;
         }
 
         // Check if the user and dojo are members (with at least reporter access) of the project
@@ -197,7 +200,11 @@ class GitlabManager {
             }
         });
 
-        return isUsersAtLeastReporter.user && isUsersAtLeastReporter.dojo ? StatusCodes.OK : StatusCodes.UNAUTHORIZED;
+        if ( isUsersAtLeastReporter.user && isUsersAtLeastReporter.dojo ) {
+            req.session.sendResponse(res, StatusCodes.OK);
+        } else {
+            req.session.sendResponse(res, StatusCodes.UNAUTHORIZED, undefined, 'Template access unauthorized', DojoStatusCode.GITLAB_TEMPLATE_ACCESS_UNAUTHORIZED);
+        }
     }
 
     async protectBranch(repoId: number, branchName: string, allowForcePush: boolean, allowedToMerge: GitlabAccessLevel, allowedToPush: GitlabAccessLevel, allowedToUnprotect: GitlabAccessLevel): Promise<GitlabMember> {
diff --git a/ExpressAPI/src/routes/GitlabRoutes.ts b/ExpressAPI/src/routes/GitlabRoutes.ts
index 2f4affb..2d8ced0 100644
--- a/ExpressAPI/src/routes/GitlabRoutes.ts
+++ b/ExpressAPI/src/routes/GitlabRoutes.ts
@@ -14,7 +14,7 @@ class GitlabRoutes implements RoutesManager {
     private async checkTemplateAccess(req: express.Request, res: express.Response) {
         const gitlabProjectIdOrNamespace: string = req.params.gitlabProjectIdOrNamespace;
 
-        return res.status(await GitlabManager.checkTemplateAccess(gitlabProjectIdOrNamespace, req)).send();
+        await GitlabManager.checkTemplateAccess(gitlabProjectIdOrNamespace, req, res);
     }
 }
 
diff --git a/ExpressAPI/src/shared b/ExpressAPI/src/shared
index 1346565..6e8f458 160000
--- a/ExpressAPI/src/shared
+++ b/ExpressAPI/src/shared
@@ -1 +1 @@
-Subproject commit 1346565c5759be045a1347f82eea230d393e38cb
+Subproject commit 6e8f45841ca086956d34370cb3639262e69aa3c3
-- 
GitLab