diff --git a/ExpressAPI/src/routes/EnonceRoutes.ts b/ExpressAPI/src/routes/EnonceRoutes.ts index 0abb9dc5c30e8a034c31f5c6bf1f32fee5f50a9f..bbc33a10a0fb2fb49086ba8044ee06788aed8151 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(); + } } }