From 7ca82fad500f86c2774c64f905c44872d3eecd23 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C3=ABl=20Minelli?= <michael@minelli.me>
Date: Thu, 6 Jul 2023 14:17:11 +0200
Subject: [PATCH] EnonceRoutes => Add routes for publish / unpublish

---
 ExpressAPI/src/routes/EnonceRoutes.ts | 32 +++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/ExpressAPI/src/routes/EnonceRoutes.ts b/ExpressAPI/src/routes/EnonceRoutes.ts
index 3881412..d81f836 100644
--- a/ExpressAPI/src/routes/EnonceRoutes.ts
+++ b/ExpressAPI/src/routes/EnonceRoutes.ts
@@ -20,6 +20,7 @@ import { Prisma }                from '@prisma/client';
 import db                        from '../helpers/DatabaseHelper';
 import { Enonce }                from '../types/DatabaseTypes';
 import EnonceManager             from '../managers/EnonceManager';
+import GitlabVisibility          from '../shared/types/Gitlab/GitlabVisibility';
 
 
 class EnonceRoutes implements RoutesManager {
@@ -43,6 +44,9 @@ class EnonceRoutes implements RoutesManager {
     registerOnBackend(backend: Express) {
         backend.get('/enonces/:enonceNameOrUrl', SecurityMiddleware.check(true), this.getEnonce);
         backend.post('/enonces', SecurityMiddleware.check(true, SecurityCheckType.TEACHING_STAFF), ParamsValidatorMiddleware.validate(this.enonceValidator), this.createEnonce);
+
+        backend.patch('/enonces/:enonceNameOrUrl/publish', SecurityMiddleware.check(true, SecurityCheckType.ENONCE_STAFF), this.changeEnoncePublishedStatus(true));
+        backend.patch('/enonces/:enonceNameOrUrl/unpublish', SecurityMiddleware.check(true, SecurityCheckType.ENONCE_STAFF), this.changeEnoncePublishedStatus(false));
     }
 
     // Get an enonce by its name or gitlab url
@@ -127,6 +131,34 @@ class EnonceRoutes implements RoutesManager {
             return res.status(StatusCodes.INTERNAL_SERVER_ERROR).send();
         }
     }
+
+    private changeEnoncePublishedStatus(publish: boolean): (req: ApiRequest, res: express.Response) => Promise<void> {
+        return async (req: ApiRequest, res: express.Response): Promise<void> => {
+            try {
+                await GitlabManager.changeRepositoryVisibility(req.boundParams.enonce.gitlabId, publish ? GitlabVisibility.INTERNAL : GitlabVisibility.PRIVATE);
+
+                await db.enonce.update({
+                                           where: {
+                                               name: req.boundParams.enonce.name
+                                           },
+                                           data : {
+                                               published: publish
+                                           }
+                                       });
+
+                req.session.sendResponse(res, StatusCodes.OK);
+            } catch ( error ) {
+                if ( error instanceof AxiosError ) {
+                    res.status(error.response.status).send();
+                    return;
+                }
+
+                logger.error(error);
+                res.status(StatusCodes.INTERNAL_SERVER_ERROR).send();
+            }
+        };
+    }
+
 }
 
 
-- 
GitLab