Skip to content
Snippets Groups Projects
Select Git revision
  • 566c734ac5fec7e80a96c5fe532b090c43670235
  • main default protected
  • jw_sonar
  • v6.0.0 protected
  • interactive-mode-preference
  • bedran_exercise-list
  • add_route_user
  • Jw_sonar_backup
  • exercise_list_filter
  • assignment_filter
  • add_route_assignments
  • move-to-esm-only
  • 6.0.0-dev
  • Pre-alpha
  • 5.0.0
  • Latest
  • 4.2.0
  • 4.1.1
  • 4.1.0
  • 4.0.1
  • 4.0.0
  • 3.5.0
  • 3.4.2
  • 3.4.1
  • 3.3.0
  • 3.2.3
  • 3.2.2
  • 3.2.0
  • 3.1.2
  • 3.1.1
  • 3.1.0
  • 3.0.1
32 results

ExerciseCreateCommand.ts

Blame
  • ExerciseCreateCommand.ts 4.92 KiB
    import CommanderCommand   from '../../CommanderCommand.js';
    import ora                from 'ora';
    import DojoBackendManager from '../../../managers/DojoBackendManager.js';
    import AccessesHelper     from '../../../helpers/AccessesHelper.js';
    import Assignment         from '../../../sharedByClients/models/Assignment.js';
    import Exercise           from '../../../sharedByClients/models/Exercise.js';
    import * as Gitlab        from '@gitbeaker/rest';
    import TextStyle          from '../../../types/TextStyle.js';
    import GitlabManager      from '../../../managers/GitlabManager.js';
    
    
    type CommandOptions = { assignment: string, members_id?: Array<number>, members_username?: Array<string>, clone?: string | boolean }
    
    
    class ExerciseCreateCommand extends CommanderCommand {
        protected commandName: string = 'create';
    
        private members!: Array<Gitlab.UserSchema> | undefined;
        private assignment!: Assignment | undefined;
        private exercise!: Exercise;
    
        protected defineCommand() {
            this.command
                .description('create a new exercise from an assignment')
                .requiredOption('-a, --assignment <value>', 'assignment source (Dojo assignment ID, Dojo assignment name or Gitlab assignment URL)')
                .option('-i, --members_id <ids...>', 'list of gitlab members ids (group\'s student) to add to the repository')
                .option('-u, --members_username <usernames...>', 'list of gitlab members username (group\'s student) to add to the repository')
                .option('-c, --clone [string]', 'automatically clone the repository (SSH required) in the specified directory (this will create a subdirectory with the assignment name)')
                .action(this.commandAction.bind(this));
        }
    
        private async dataRetrieval(options: CommandOptions) {
            console.log(TextStyle.BLOCK('Please wait while we verify and retrieve data...'));
    
            if ( !await AccessesHelper.checkStudent() ) {
                throw new Error();
            }
    
            this.members = await GitlabManager.fetchMembers(options);
            if ( !this.members ) {
                throw new Error();
            }
    
            ora('Checking assignment:').start().info();
            const assignmentGetSpinner: ora.Ora = ora({
                                                          text  : 'Checking if assignment exists',
                                                          indent: 4
                                                      }).start();
            this.assignment = await DojoBackendManager.getAssignment(options.assignment);
            if ( !this.assignment ) {
                assignmentGetSpinner.fail(`Assignment "${ options.assignment }" doesn't exists`);
                throw new Error();
            }
            assignmentGetSpinner.succeed(`Assignment "${ options.assignment }" exists`);
    
            const assignmentPublishedSpinner: ora.Ora = ora({
                                                                text  : 'Checking if assignment is published',
                                                                indent: 4
                                                            }).start();
            if ( !this.assignment.published ) {
                assignmentPublishedSpinner.fail(`Assignment "${ this.assignment.name }" isn't published`);
                throw new Error();
            }
            assignmentPublishedSpinner.succeed(`Assignment "${ this.assignment.name }" is published`);
        }
    
        private async createExercise() {
            console.log(TextStyle.BLOCK('Please wait while we are creating the exercise (approximately 10 seconds)...'));
    
            this.exercise = await DojoBackendManager.createExercise(this.assignment!.name, this.members!);