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