From 54e8260344cbf394262f68ec2e2fbe62f6887f7b 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    | 22 +++++++++++++------
 2 files changed, 30 insertions(+), 9 deletions(-)

diff --git a/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts b/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts
index 7eb8f4c..90b588e 100644
--- a/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts
+++ b/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts
@@ -10,7 +10,7 @@ import TextStyle          from '../../../types/TextStyle.js';
 import Config             from '../../../config/Config';
 
 
-type CommandOptions = { name: string, template?: string, members_id?: Array<number>, members_username?: Array<string>, clone?: string | boolean, sonar?: boolean }
+type CommandOptions = { name: string, language: string, template?: string, members_id?: Array<number>, members_username?: Array<string>, clone?: string | boolean, sonar?: boolean }
 
 
 class AssignmentCreateCommand extends CommanderCommand {
@@ -25,6 +25,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)')
@@ -61,6 +62,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 ) {
             this.templateIdOrNamespace = options.template;
 
@@ -77,7 +90,7 @@ class AssignmentCreateCommand extends CommanderCommand {
     private async createAssignment(options: CommandOptions) {
         console.log(TextStyle.BLOCK('Please wait while we are creating the assignment (approximately 10 seconds)...'));
 
-        this.assignment = await DojoBackendManager.createAssignment(options.name, this.members!, this.templateIdOrNamespace, this.sonar);
+        this.assignment = await DojoBackendManager.createAssignment(options.name, options.language, this.members!, this.templateIdOrNamespace, this.sonar);
 
         const oraInfo = (message: string) => {
             ora({
diff --git a/NodeApp/src/managers/DojoBackendManager.ts b/NodeApp/src/managers/DojoBackendManager.ts
index 7e5c958..7fa3f0d 100644
--- a/NodeApp/src/managers/DojoBackendManager.ts
+++ b/NodeApp/src/managers/DojoBackendManager.ts
@@ -247,7 +247,7 @@ class DojoBackendManager {
         }
     }
 
-    public async createAssignment(name: string, members: Array<Gitlab.UserSchema>, templateIdOrNamespace: string | null, sonar: boolean = false, verbose: boolean = true): Promise<Assignment> {
+    public async createAssignment(name: string, language: string, members: Array<Gitlab.UserSchema>, templateIdOrNamespace: string | null, sonar: boolean = false, verbose: boolean = true): Promise<Assignment> {
         const spinner: ora.Ora = ora('Creating assignment...');
 
         if ( verbose ) {
@@ -256,9 +256,10 @@ class DojoBackendManager {
 
         try {
             const response = await axios.post<DojoBackendResponse<Assignment>>(DojoBackendHelper.getApiUrl(ApiRoute.ASSIGNMENT_CREATE), Object.assign({
-                                                                                                                                                          name      : name,
-                                                                                                                                                          members   : JSON.stringify(members),
-                                                                                                                                                          useSonar  : String(sonar)
+                                                                                                                                                          name    : name,
+                                                                                                                                                          language: language,
+                                                                                                                                                          members : JSON.stringify(members),
+                                                                                                                                                          useSonar: String(sonar)
                                                                                                                                                       }, templateIdOrNamespace ? { template: templateIdOrNamespace } : {}));
 
             if ( verbose ) {
@@ -374,9 +375,16 @@ class DojoBackendManager {
         }
     }
 
-    public async isSonarEnabled() {
-        const sonar = await axios.get<DojoBackendResponse<{ sonarEnabled: boolean }>>(this.getApiUrl(ApiRoute.SONAR));
-        return sonar.data.data.sonarEnabled;
+    public async isSonarEnabled(): Promise<boolean> {
+        const response = await axios.get<DojoBackendResponse<{ sonarEnabled: boolean }>>(DojoBackendHelper.getApiUrl(ApiRoute.SONAR));
+
+        return response.data.data.sonarEnabled;
+    }
+
+    public async getLanguages(): Promise<Array<string>> {
+        const response = await axios.get<DojoBackendResponse<Array<string>>>(DojoBackendHelper.getApiUrl(ApiRoute.LANGUAGES));
+
+        return response.data.data;
     }
 
     public async createTag(name: string, type: string, verbose: boolean = true): Promise<Tag | undefined> {
-- 
GitLab