Skip to content
Snippets Groups Projects
Commit b3d81614 authored by michael.minelli's avatar michael.minelli
Browse files

Add Gitlab routes

parent 0dc8e76d
Branches
Tags
No related merge requests found
...@@ -3,6 +3,7 @@ import RoutesManager from '../express/RoutesManager'; ...@@ -3,6 +3,7 @@ import RoutesManager from '../express/RoutesManager';
import BaseRoutes from './BaseRoutes'; import BaseRoutes from './BaseRoutes';
import SessionRoutes from './SessionRoutes'; import SessionRoutes from './SessionRoutes';
import EnonceRoutes from './EnonceRoutes'; import EnonceRoutes from './EnonceRoutes';
import GitlabRoutes from './GitlabRoutes';
class AdminRoutesManager implements RoutesManager { class AdminRoutesManager implements RoutesManager {
...@@ -22,6 +23,7 @@ class AdminRoutesManager implements RoutesManager { ...@@ -22,6 +23,7 @@ class AdminRoutesManager implements RoutesManager {
BaseRoutes.registerOnBackend(backend); BaseRoutes.registerOnBackend(backend);
SessionRoutes.registerOnBackend(backend); SessionRoutes.registerOnBackend(backend);
EnonceRoutes.registerOnBackend(backend); EnonceRoutes.registerOnBackend(backend);
GitlabRoutes.registerOnBackend(backend);
} }
} }
......
import { Express } from 'express-serve-static-core';
import express from 'express';
import { StatusCodes } from 'http-status-codes';
import RoutesManager from '../express/RoutesManager';
import ApiRequest from '../models/ApiRequest';
import SecurityMiddleware from '../middlewares/SecurityMiddleware';
import SecurityCheckType from '../types/SecurityCheckType';
import GitlabHelper from '../helpers/GitlabHelper';
import GitlabRepository from '../shared/types/Gitlab/GitlabRepository';
import GitlabVisibility from '../shared/types/Gitlab/GitlabVisibility';
import Config from '../config/Config';
import GitlabAccessLevel from '../shared/types/Gitlab/GitlabAccessLevel';
class EnonceRoutes implements RoutesManager {
private static _instance: EnonceRoutes;
private constructor() { }
public static get instance(): EnonceRoutes {
if ( !EnonceRoutes._instance ) {
EnonceRoutes._instance = new EnonceRoutes();
}
return EnonceRoutes._instance;
}
registerOnBackend(backend: Express) {
backend.get('/gitlab/project/:idOrNamespace/checkTemplateAccess', SecurityMiddleware.check(true, SecurityCheckType.TEACHING_STAFF), this.checkTemplateAccess);
}
private async checkTemplateAccess(req: ApiRequest, res: express.Response) {
const idOrNamespace: string = req.params.idOrNamespace;
// Get the Gitlab project and check if it have public or internal visibility
try {
const project: GitlabRepository = await GitlabHelper.getRepository(idOrNamespace);
if ( [ GitlabVisibility.Public.valueOf(), GitlabVisibility.Internal.valueOf() ].includes(project.visibility) ) {
return res.status(StatusCodes.OK).send();
}
} catch ( e ) {
return res.status(StatusCodes.NOT_FOUND).send();
}
// Check if the user and dojo are members (with at least reporter access) of the project
const members = await GitlabHelper.getRepositoryMembers(idOrNamespace);
const isUsersAtLeastReporter = {
user: false,
dojo: false
};
members.forEach(member => {
if ( member.access_level >= GitlabAccessLevel.Reporter ) {
if ( member.id === req.session.profile.userGitlabId ) {
isUsersAtLeastReporter.user = true;
} else if ( member.id === Config.gitlab.account.id ) {
isUsersAtLeastReporter.dojo = true;
}
}
});
req.session.sendResponse(res, isUsersAtLeastReporter.user && isUsersAtLeastReporter.dojo ? StatusCodes.OK : StatusCodes.UNAUTHORIZED);
}
}
export default EnonceRoutes.instance;
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment