From e5a95e80bf344b594b0d291bae63b41a54dad16c Mon Sep 17 00:00:00 2001
From: Joel von der Weid <joel.von-der-weid@hesge.ch>
Date: Wed, 22 May 2024 10:31:32 +0200
Subject: [PATCH] Test sonar qualities before creating assignment

---
 .../subcommands/AssignmentCreateCommand.ts         | 14 ++++++++++++++
 NodeApp/src/managers/DojoBackendManager.ts         |  9 +++++++++
 2 files changed, 23 insertions(+)

diff --git a/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts b/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts
index b755b37..3d664d0 100644
--- a/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts
+++ b/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts
@@ -86,6 +86,20 @@ class AssignmentCreateCommand extends CommanderCommand {
         }
         languagesSpinner.succeed(`Language "${ options.language }" is supported`);
 
+        if ( (this.sonarGate ?? '') !== '' || this.sonarProfiles.length > 0 ) {
+            const qualitiesSpinner: ora.Ora = ora('Checking sonar qualities').start();
+
+            // SonarQube quality gate and profiles
+            const result = await DojoBackendManager.testSonarQualities(this.sonarGate ?? '', this.sonarProfiles);
+            if ( !result.valid ) {
+                const invalid = (result.badGate == undefined ? result.badProfiles : [ result.badGate, ...result.badProfiles ]);
+                qualitiesSpinner.fail(`Invalid quality gate or profiles : ${ invalid }`);
+                throw new Error();
+            }
+
+            qualitiesSpinner.succeed(`Quality gate and profiles are valid`);
+        }
+
         // SonarQube languages
         if ( this.sonar ) {
             const sonarLang = await DojoBackendManager.getSonarLanguages();
diff --git a/NodeApp/src/managers/DojoBackendManager.ts b/NodeApp/src/managers/DojoBackendManager.ts
index e82c903..939e684 100644
--- a/NodeApp/src/managers/DojoBackendManager.ts
+++ b/NodeApp/src/managers/DojoBackendManager.ts
@@ -393,6 +393,15 @@ class DojoBackendManager {
         return resp.data.data;
     }
 
+    public async testSonarQualities(gate: string, profiles: string[]) {
+        const resp = await axios.post<DojoBackendResponse<{ valid: boolean, badProfiles: string[], badGate: string | undefined }>>(
+            this.getApiUrl(ApiRoute.SONAR_QUALITIES), {
+                gate: gate,
+                profiles: profiles,
+            });
+        return resp.data.data;
+    }
+
     public async createTag(name: string, type: string, verbose: boolean = true): Promise<Tag | undefined> {
         const spinner: ora.Ora = ora('Creating tag...');
 
-- 
GitLab