From 5c1d6fef90d5b4e831f72f042fed9f0aa1035438 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          |  7 ++++++-
 2 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts b/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts
index fcf8a53..7eb8f4c 100644
--- a/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts
+++ b/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts
@@ -19,6 +19,7 @@ class AssignmentCreateCommand extends CommanderCommand {
     private members!: Array<Gitlab.UserSchema> | undefined;
     private templateIdOrNamespace: string | null = null;
     private assignment!: Assignment;
+    private sonar: boolean = false;
 
     protected defineCommand() {
         this.command
@@ -45,6 +46,14 @@ class AssignmentCreateCommand extends CommanderCommand {
             throw new Error();
         }
 
+        const assignmentGetSonarSpinner: ora.Ora = ora('Checking server sonar status').start();
+        this.sonar = (SharedConfig.sonar.enabled ? options.sonar ?? false : false);
+        if ( this.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.`);
@@ -68,9 +77,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)...'));
 
-        const sonar = (SharedConfig.sonar.enabled ? options.sonar ?? false : false);
-
-        this.assignment = await DojoBackendManager.createAssignment(options.name, this.members!, this.templateIdOrNamespace, sonar);
+        this.assignment = await DojoBackendManager.createAssignment(options.name, 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 4d1fe1d..64f048e 100644
--- a/NodeApp/src/managers/DojoBackendManager.ts
+++ b/NodeApp/src/managers/DojoBackendManager.ts
@@ -258,7 +258,7 @@ class DojoBackendManager {
             const response = await axios.post<DojoBackendResponse<Assignment>>(DojoBackendHelper.getApiUrl(ApiRoute.ASSIGNMENT_CREATE), Object.assign({
                                                                                                                                                           name   : name,
                                                                                                                                                           members: JSON.stringify(members),
-                                                                                                                                                          sonar  : sonar
+                                                                                                                                                          useSonar  : sonar
                                                                                                                                                       }, templateIdOrNamespace ? { template: templateIdOrNamespace } : {}));
 
             if ( verbose ) {
@@ -374,6 +374,11 @@ class DojoBackendManager {
         }
     }
 
+    public async isSonarEnabled() {
+        const sonar = await axios.get<DojoBackendResponse<{ sonarEnabled: boolean }>>(this.getApiUrl(ApiRoute.SONAR));
+        return sonar.data.data.sonarEnabled;
+    }
+
     public async createTag(name: string, type: string, verbose: boolean = true): Promise<Tag | undefined> {
         const spinner: ora.Ora = ora('Creating tag...');
 
-- 
GitLab