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