From c126a1d12659d402619fc86be329a4ae0d3d0400 Mon Sep 17 00:00:00 2001
From: Joel von der Weid <joel.von-der-weid@hesge.ch>
Date: Tue, 7 May 2024 16:21:59 +0200
Subject: [PATCH] Add profiles/gate options for sonar

---
 .../subcommands/AssignmentCreateCommand.ts         | 14 +++++++++++---
 NodeApp/src/managers/DojoBackendManager.ts         |  6 ++++--
 NodeApp/src/shared                                 |  2 +-
 3 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts b/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts
index 49299cd..af5395e 100644
--- a/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts
+++ b/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts
@@ -9,6 +9,7 @@ import DojoBackendManager from '../../../managers/DojoBackendManager';
 import Toolbox            from '../../../shared/helpers/Toolbox';
 import SharedConfig       from '../../../shared/config/SharedConfig';
 import SharedSonarManager from '../../../shared/managers/SharedSonarManager';
+import { Option }         from 'commander';
 
 
 class AssignmentCreateCommand extends CommanderCommand {
@@ -26,15 +27,19 @@ class AssignmentCreateCommand extends CommanderCommand {
         .action(this.commandAction.bind(this));
 
         if (SharedConfig.sonar.enabled) {
-            this.command.requiredOption('-s, --sonar', 'add sonar to the code checking process for exercises derived from the assignment');
+            this.command.requiredOption('-s, --sonar', 'add sonar to the code checking process for exercises derived from the assignment')
+                .addOption(new Option('-g, --gate <gate>', 'quality gate for sonar').implies({sonar: true}))
+                .addOption(new Option('-p, --profile <profile...>', 'quality profiles for sonar').default([]).implies({sonar: true}));
         }
     }
 
-    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> {
+    protected async commandAction(options: { name: string, language: string, template?: string, members_id?: Array<number>, members_username?: Array<string>, clone?: string | boolean, sonar?: boolean, gate?: string, profile?: string[]}): Promise<void> {
         let members!: Array<GitlabUser> | false;
         let templateIdOrNamespace: string | null = null;
         let assignment!: Assignment;
         let sonar = false;
+        let sonarGate: string | undefined = undefined;
+        let sonarProfiles: string[] = [];
 
         // Check access and retrieve data
         {
@@ -57,6 +62,9 @@ class AssignmentCreateCommand extends CommanderCommand {
                     return;
                 }
                 assignmentGetSonarSpinner.succeed(`Sonar is supported by the server`);
+
+                sonarGate = options.gate;
+                sonarProfiles = options.profile ?? [];
             }
 
             const assignmentGetSpinner: ora.Ora = ora('Checking assignment name availability').start();
@@ -106,7 +114,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, options.language, members, templateIdOrNamespace, sonar);
+                assignment = await DojoBackendManager.createAssignment(options.name, options.language, members, templateIdOrNamespace, sonar, sonarGate, sonarProfiles);
 
                 const oraInfo = (message: string) => {
                     ora({
diff --git a/NodeApp/src/managers/DojoBackendManager.ts b/NodeApp/src/managers/DojoBackendManager.ts
index a1d0343..a346758 100644
--- a/NodeApp/src/managers/DojoBackendManager.ts
+++ b/NodeApp/src/managers/DojoBackendManager.ts
@@ -82,7 +82,7 @@ class DojoBackendManager {
         }
     }
 
-    public async createAssignment(name: string, language: 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, sonarGate: string | undefined = undefined, sonarProfiles: string[] = [], verbose: boolean = true): Promise<Assignment> {
         const spinner: ora.Ora = ora('Creating assignment...');
 
         if ( verbose ) {
@@ -94,7 +94,9 @@ class DojoBackendManager {
                                                                                                                                              name     : name,
                                                                                                                                              language : language,
                                                                                                                                              members  : JSON.stringify(members),
-                                                                                                                                             useSonar : String(sonar)
+                                                                                                                                             useSonar : String(sonar),
+                                                                                                                                             sonarGate: sonarGate ?? '',
+                                                                                                                                             sonarProfiles : JSON.stringify(sonarProfiles),
                                                                                                                                          }, templateIdOrNamespace ? { template: templateIdOrNamespace } : {}));
 
             if ( verbose ) {
diff --git a/NodeApp/src/shared b/NodeApp/src/shared
index 7f67e15..102e79d 160000
--- a/NodeApp/src/shared
+++ b/NodeApp/src/shared
@@ -1 +1 @@
-Subproject commit 7f67e15c6434e78040528a647bf41c40957528c1
+Subproject commit 102e79d9b78d79e495f7b82e5e767eb7898248db
-- 
GitLab