From 6adcc7d7537f996308d6a0f436e1752e8fb283e6 Mon Sep 17 00:00:00 2001 From: Joel von der Weid <joel.von-der-weid@hesge.ch> Date: Tue, 12 Mar 2024 14:23:17 +0100 Subject: [PATCH] Add language to assignment creation --- .../subcommands/AssignmentCreateCommand.ts | 17 +++++++++++++++-- NodeApp/src/managers/DojoBackendManager.ts | 8 +++++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts b/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts index f40babe..ee88f71 100644 --- a/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts +++ b/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts @@ -17,6 +17,7 @@ class AssignmentCreateCommand extends CommanderCommand { this.command .description('create a new repository for an assignment') .requiredOption('-n, --name <name>', 'name of the assignment') + .requiredOption('-l, --language <string>', 'main programming language of the assignment') .option('-i, --members_id <ids...>', 'list of gitlab members ids (teaching staff) to add to the repository') .option('-u, --members_username <usernames...>', 'list of gitlab members username (teaching staff) to add to the repository') .option('-t, --template <string>', 'id or url of the template (http/s and ssh urls are possible)') @@ -28,7 +29,7 @@ class AssignmentCreateCommand extends CommanderCommand { } } - protected async commandAction(options: { name: string, template?: string, members_id?: Array<number>, members_username?: Array<string>, clone?: string | boolean, sonar?: boolean}): Promise<void> { + protected async commandAction(options: { name: string, language: string, template?: string, members_id?: Array<number>, members_username?: Array<string>, clone?: string | boolean, sonar?: boolean}): Promise<void> { let members!: Array<GitlabUser> | false; let templateIdOrNamespace: string | null = null; let assignment!: Assignment; @@ -62,6 +63,18 @@ class AssignmentCreateCommand extends CommanderCommand { } assignmentGetSpinner.succeed(`Assignment name "${ options.name }" is available`); + const languagesSpinner: ora.Ora = ora('Checking language support').start(); + const languages = await DojoBackendManager.getLanguages(); + if ( !languages.includes(options.language) ) { + languagesSpinner.fail(`Language "${ options.language }" is not supported. Choose a supported language or "other"`); + console.log("List of supported languages:") + for (const l of languages) { + console.log(` - ${l}`); + } + return; + } + languagesSpinner.succeed(`Language "${ options.language }" is supported`); + if ( options.template ) { templateIdOrNamespace = options.template; @@ -80,7 +93,7 @@ class AssignmentCreateCommand extends CommanderCommand { console.log(chalk.cyan('Please wait while we are creating the assignment (approximately 10 seconds)...')); try { - assignment = await DojoBackendManager.createAssignment(options.name, members, templateIdOrNamespace, sonar); + assignment = await DojoBackendManager.createAssignment(options.name, options.language, members, templateIdOrNamespace, sonar); const oraInfo = (message: string) => { ora({ diff --git a/NodeApp/src/managers/DojoBackendManager.ts b/NodeApp/src/managers/DojoBackendManager.ts index cf26bd7..061a306 100644 --- a/NodeApp/src/managers/DojoBackendManager.ts +++ b/NodeApp/src/managers/DojoBackendManager.ts @@ -82,7 +82,7 @@ class DojoBackendManager { } } - public async createAssignment(name: string, members: Array<GitlabUser>, templateIdOrNamespace: string | null, sonar: boolean = false, verbose: boolean = true): Promise<Assignment> { + public async createAssignment(name: string, language: string, members: Array<GitlabUser>, templateIdOrNamespace: string | null, sonar: boolean = false, verbose: boolean = true): Promise<Assignment> { const spinner: ora.Ora = ora('Creating assignment...'); if ( verbose ) { @@ -92,6 +92,7 @@ class DojoBackendManager { try { const response = await axios.post<DojoBackendResponse<Assignment>>(this.getApiUrl(ApiRoute.ASSIGNMENT_CREATE), Object.assign({ name : name, + language : language, members : JSON.stringify(members), useSonar : String(sonar) }, templateIdOrNamespace ? { template: templateIdOrNamespace } : {})); @@ -241,6 +242,11 @@ class DojoBackendManager { const sonar = await axios.get<DojoBackendResponse<{ sonarEnabled: boolean }>>(this.getApiUrl(ApiRoute.SONAR)); return sonar.data.data.sonarEnabled; } + + public async getLanguages() { + const resp = await axios.get<DojoBackendResponse<string[]>>(this.getApiUrl(ApiRoute.LANGUAGES)); + return resp.data.data; + } } -- GitLab