Select Git revision
ExerciceRoutes.ts
ExerciceRoutes.ts 7.13 KiB
import { Express } from 'express-serve-static-core';
import express from 'express';
import * as ExpressValidator from 'express-validator';
import { StatusCodes } from 'http-status-codes';
import RoutesManager from '../express/RoutesManager';
import ParamsValidatorMiddleware from '../middlewares/ParamsValidatorMiddleware';
import ApiRequest from '../models/ApiRequest';
import SecurityMiddleware from '../middlewares/SecurityMiddleware';
import GitlabUser from '../shared/types/Gitlab/GitlabUser';
import GitlabManager from '../managers/GitlabManager';
import Config from '../config/Config';
import GitlabRepository from '../shared/types/Gitlab/GitlabRepository';
import Enonce from '../models/Enonce';
import { AxiosError } from 'axios';
import logger from '../shared/logging/WinstonLogger';
import DojoValidators from '../helpers/DojoValidators';
import { v4 as uuidv4 } from 'uuid';
import GitlabMember from '../shared/types/Gitlab/GitlabMember';
import GitlabAccessLevel from '../shared/types/Gitlab/GitlabAccessLevel';
import User from '../models/User';
import UserManager from '../managers/UserManager';
import Exercice from '../models/Exercice';
import ExerciceMember from '../models/ExerciceMember';
import ExerciceManager from '../managers/ExerciceManager';
class ExerciceRoutes implements RoutesManager {
private static _instance: ExerciceRoutes;
private constructor() { }
public static get instance(): ExerciceRoutes {
if ( !ExerciceRoutes._instance ) {
ExerciceRoutes._instance = new ExerciceRoutes();
}
return ExerciceRoutes._instance;
}
private readonly exerciceValidator: ExpressValidator.Schema = {
members: {
trim : true,
notEmpty : true,
customSanitizer: DojoValidators.jsonSanitizer
}
};
registerOnBackend(backend: Express) {
backend.post('/enonces/:enonceNameOrUrl/exercices', SecurityMiddleware.check(true), ParamsValidatorMiddleware.validate(this.exerciceValidator), this.createExercice.bind(this));
}
private getExerciceName(enonce: Enonce, members: Array<GitlabUser>, suffix: number): string {
return `DojoEx - ${ enonce.enonceName } - ${ members.map(member => member.username).join(' + ') }${ suffix > 0 ? ` - ${ suffix }` : '' }`;
}
private getExercicePath(enonce: Enonce, exerciceId: string): string {
return `dojo-ex_${ enonce.enonceGitlabLastInfo.path }_${ exerciceId }`;
}
private async createExercice(req: ApiRequest, res: express.Response) {
const params: { members: Array<GitlabUser> } = req.body;
params.members = [ await req.session.profile.gitlabProfile.value, ...params.members ];
const exerciceId: string = uuidv4();
let repository: GitlabRepository;
let suffix: number = 0;
do {
try {
repository = await GitlabManager.forkRepository(req.boundParams.enonce.enonceGitlabCreationInfo.id, this.getExerciceName(req.boundParams.enonce, params.members, suffix), this.getExercicePath(req.boundParams.enonce, exerciceId), Config.exercice.default.description.replace('{{ENONCE_NAME}}', req.boundParams.enonce.enonceName), Config.exercice.default.visibility, Config.gitlab.group.exercices);