Skip to content
Snippets Groups Projects
Select Git revision
  • 28bd8ec8a225bdc9e81ad3966329960ccacbb239
  • main default protected
  • jw_sonar
  • v6.0.0 protected
  • bedran_exercise-list
  • ask-user-to-delete-exercises-on-duplicates
  • update-dependencies
  • jw_sonar_backup
  • add_route_assignments
  • 6.0.0-dev
  • 5.0.1
  • 5.0.0
  • 4.1.0
  • 4.0.0
  • 3.5.3
  • 3.5.2
  • 3.5.1
  • 3.5.0
  • 3.4.2
  • 3.4.1
  • 3.4.0
  • 3.3.0
  • 3.2.0
  • 3.1.3
  • 3.1.2
  • 3.1.1
  • 3.1.0
  • 3.0.1
  • 3.0.0
29 results

ExerciceRoutes.ts

Blame
  • 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);