From e62dd71edd7b8d5ad723dd49efa5a10b67f719f1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C3=ABl=20Minelli?= <michael@minelli.me>
Date: Thu, 29 Jun 2023 21:50:43 +0200
Subject: [PATCH] EnonceRoutes => Creation error handling

---
 ExpressAPI/src/routes/EnonceRoutes.ts | 79 +++++++++++++++++----------
 1 file changed, 51 insertions(+), 28 deletions(-)

diff --git a/ExpressAPI/src/routes/EnonceRoutes.ts b/ExpressAPI/src/routes/EnonceRoutes.ts
index 0abb9dc..bbc33a1 100644
--- a/ExpressAPI/src/routes/EnonceRoutes.ts
+++ b/ExpressAPI/src/routes/EnonceRoutes.ts
@@ -17,6 +17,7 @@ import UserManager               from '../managers/UserManager';
 import User                      from '../models/User';
 import Enonce                    from '../models/Enonce';
 import EnonceStaff               from '../models/EnonceStaff';
+import { AxiosError }            from 'axios';
 
 
 class EnonceRoutes implements RoutesManager {
@@ -68,35 +69,57 @@ class EnonceRoutes implements RoutesManager {
             }
         }
 
-        const repository: GitlabRepository = await GitlabHelper.createRepository(params.name, Config.enonce.default.description.replace('{{ENONCE_NAME}}', params.name), Config.enonce.default.visibility, Config.enonce.default.initReadme, Config.gitlab.group.enonces, Config.enonce.default.sharedRunnersEnabled, Config.enonce.default.wikiEnabled, template);
-        const members: Array<GitlabMember | false> = await Promise.all([ req.session.profile.userGitlabId, ...gitlabMembers.map(member => member.id) ].map(async (memberId: number): Promise<GitlabMember | false> => {
-            try {
-                return await GitlabHelper.addRepositoryMember(repository.id, memberId, GitlabAccessLevel.Maintainer);
-            } catch ( e ) {
-                return false;
+        let repository: GitlabRepository;
+        try {
+            repository = await GitlabHelper.createRepository(params.name, Config.enonce.default.description.replace('{{ENONCE_NAME}}', params.name), Config.enonce.default.visibility, Config.enonce.default.initReadme, Config.gitlab.group.enonces, Config.enonce.default.sharedRunnersEnabled, Config.enonce.default.wikiEnabled, template);
+        } catch ( error ) {
+            if ( error instanceof AxiosError ) {
+                if ( error.response.data.message.name && error.response.data.message.name == 'has already been taken' ) {
+                    return res.status(StatusCodes.CONFLICT).send();
+                }
+
+                return res.status(error.response.status).send();
             }
-        }));
-
-        const enonce: Enonce = Enonce.createFromSql({
-                                                        enonceName              : repository.name,
-                                                        enonceGitlabId          : repository.id,
-                                                        enonceGitlabLink        : repository.web_url,
-                                                        enonceGitlabCreationInfo: JSON.stringify(repository),
-                                                        enonceGitlabLastInfo    : JSON.stringify(repository),
-                                                        enonceGitlabLastInfoTs  : new Date().getTime()
-                                                    });
-        await enonce.create();
-
-        let dojoUsers: Array<User> = [ req.session.profile, ...(await UserManager.getByGitlabIds(gitlabMembers.map(member => member.id))).filter(user => user) ]; // TODO: Remplacer le filter par une map qui créer l'utilisateur inconnu. 
-        dojoUsers = dojoUsers.reduce((unique, user) => (unique.findIndex(uniqueUser => uniqueUser.userID === user.userID) !== -1 ? unique : [ ...unique, user ]), Array<User>());
-        await Promise.all(dojoUsers.map(async (dojoUser: User) => {
-            return EnonceStaff.createFromSql({
-                                                 enonceID: enonce.enonceID,
-                                                 userID  : dojoUser.userID
-                                             });
-        }));
-
-        req.session.sendResponse(res, StatusCodes.OK, enonce.toJsonObject());
+
+            return res.status(StatusCodes.INTERNAL_SERVER_ERROR).send();
+        }
+
+        try {
+            const members: Array<GitlabMember | false> = await Promise.all([ req.session.profile.userGitlabId, ...gitlabMembers.map(member => member.id) ].map(async (memberId: number): Promise<GitlabMember | false> => {
+                try {
+                    return await GitlabHelper.addRepositoryMember(repository.id, memberId, GitlabAccessLevel.Maintainer);
+                } catch ( e ) {
+                    return false;
+                }
+            }));
+
+            const enonce: Enonce = Enonce.createFromSql({
+                                                            enonceName              : repository.name,
+                                                            enonceGitlabId          : repository.id,
+                                                            enonceGitlabLink        : repository.web_url,
+                                                            enonceGitlabCreationInfo: JSON.stringify(repository),
+                                                            enonceGitlabLastInfo    : JSON.stringify(repository),
+                                                            enonceGitlabLastInfoTs  : new Date().getTime()
+                                                        });
+            await enonce.create();
+
+            let dojoUsers: Array<User> = [ req.session.profile, ...(await UserManager.getByGitlabIds(gitlabMembers.map(member => member.id))).filter(user => user) ]; // TODO: Remplacer le filter par une map qui créer l'utilisateur inconnu.
+            dojoUsers = dojoUsers.reduce((unique, user) => (unique.findIndex(uniqueUser => uniqueUser.userID === user.userID) !== -1 ? unique : [ ...unique, user ]), Array<User>());
+            await Promise.all(dojoUsers.map(async (dojoUser: User) => {
+                return EnonceStaff.createFromSql({
+                                                     enonceID: enonce.enonceID,
+                                                     userID  : dojoUser.userID
+                                                 });
+            }));
+
+            return req.session.sendResponse(res, StatusCodes.OK, enonce.toJsonObject());
+        } catch ( error ) {
+            if ( error instanceof AxiosError ) {
+                return res.status(error.response.status).send();
+            }
+
+            return res.status(StatusCodes.INTERNAL_SERVER_ERROR).send();
+        }
     }
 }
 
-- 
GitLab