Select Git revision
ExerciseCreateCommand.ts
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!);