From e467c56ba7ec146835877a8c6925c2923226d61d Mon Sep 17 00:00:00 2001
From: Joel von der Weid <joel.von-der-weid@hesge.ch>
Date: Tue, 5 Mar 2024 15:07:32 +0100
Subject: [PATCH] Check sonar on assignment creation

---
 .../subcommands/AssignmentCreateCommand.ts          | 13 ++++++++++---
 NodeApp/src/managers/DojoBackendManager.ts          | 11 ++++++++---
 2 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts b/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts
index d84b7e4..f40babe 100644
--- a/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts
+++ b/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts
@@ -23,7 +23,7 @@ class AssignmentCreateCommand extends CommanderCommand {
         .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));
 
-        if (SharedConfig.useSonar) {
+        if (SharedConfig.sonar.enabled) {
             this.command.requiredOption('-s, --sonar', 'add sonar to the code checking process for exercises derived from the assignment');
         }
     }
@@ -32,6 +32,7 @@ class AssignmentCreateCommand extends CommanderCommand {
         let members!: Array<GitlabUser> | false;
         let templateIdOrNamespace: string | null = null;
         let assignment!: Assignment;
+        let sonar = false;
 
         // Check access and retrieve data
         {
@@ -46,6 +47,14 @@ class AssignmentCreateCommand extends CommanderCommand {
                 return;
             }
 
+            const assignmentGetSonarSpinner: ora.Ora = ora('Checking server sonar status').start();
+            sonar = (SharedConfig.sonar.enabled ? options.sonar ?? false : false);
+            if (sonar && !(await DojoBackendManager.isSonarEnabled())) {
+                assignmentGetSonarSpinner.fail(`Sonar is currently not supported by the server. Disable sonar integration or try again later.`);
+                return;
+            }
+            assignmentGetSonarSpinner.succeed(`Sonar is supported by the server`);
+
             const assignmentGetSpinner: ora.Ora = ora('Checking assignment name availability').start();
             if ( await DojoBackendManager.getAssignment(options.name) ) {
                 assignmentGetSpinner.fail(`Assignment name "${ options.name }" is already taken. Please choose another one.`);
@@ -71,8 +80,6 @@ class AssignmentCreateCommand extends CommanderCommand {
             console.log(chalk.cyan('Please wait while we are creating the assignment (approximately 10 seconds)...'));
 
             try {
-                const sonar = (SharedConfig.useSonar ? options.sonar ?? false : false);
-
                 assignment = await DojoBackendManager.createAssignment(options.name, members, templateIdOrNamespace, sonar);
 
                 const oraInfo = (message: string) => {
diff --git a/NodeApp/src/managers/DojoBackendManager.ts b/NodeApp/src/managers/DojoBackendManager.ts
index b4dae90..b19436b 100644
--- a/NodeApp/src/managers/DojoBackendManager.ts
+++ b/NodeApp/src/managers/DojoBackendManager.ts
@@ -91,9 +91,9 @@ class DojoBackendManager {
 
         try {
             const response = await axios.post<DojoBackendResponse<Assignment>>(this.getApiUrl(ApiRoute.ASSIGNMENT_CREATE), Object.assign({
-                                                                                                                                             name   : name,
-                                                                                                                                             members: JSON.stringify(members),
-                                                                                                                                             sonar  : sonar
+                                                                                                                                             name     : name,
+                                                                                                                                             members  : JSON.stringify(members),
+                                                                                                                                             useSonar : sonar
                                                                                                                                          }, templateIdOrNamespace ? { template: templateIdOrNamespace } : {}));
 
             if ( verbose ) {
@@ -236,6 +236,11 @@ class DojoBackendManager {
             return false;
         }
     }
+
+    public async isSonarEnabled() {
+        const sonar = await axios.get<DojoBackendResponse<{ sonarEnabled: boolean }>>(this.getApiUrl(ApiRoute.SONAR));
+        return sonar.data.data.sonarEnabled;
+    }
 }
 
 
-- 
GitLab