From dfe11ad2c7489d7578b9cc1910ff850c911f1c3d 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 ++++--
 2 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts b/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts
index 5e89eed..b755b37 100644
--- a/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts
+++ b/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts
@@ -9,9 +9,10 @@ import * as Gitlab        from '@gitbeaker/rest';
 import TextStyle          from '../../../types/TextStyle.js';
 import Config             from '../../../config/Config';
 import SharedSonarManager from '../../../shared/managers/SharedSonarManager';
+import { Option }         from 'commander';
 
 
-type CommandOptions = { name: string, language: string, template?: string, members_id?: Array<number>, members_username?: Array<string>, clone?: string | boolean, sonar?: boolean }
+type CommandOptions = { name: string, language: string, template?: string, members_id?: Array<number>, members_username?: Array<string>, clone?: string | boolean, sonar?: boolean, gate?: string, profile?: string[] }
 
 
 class AssignmentCreateCommand extends CommanderCommand {
@@ -21,6 +22,8 @@ class AssignmentCreateCommand extends CommanderCommand {
     private templateIdOrNamespace: string | null = null;
     private assignment!: Assignment;
     private sonar: boolean = false;
+    private sonarGate: string | undefined = undefined;
+    private sonarProfiles: string[] = [];
 
     protected defineCommand() {
         this.command
@@ -34,7 +37,9 @@ 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 }));
         }
     }
 
@@ -56,6 +61,9 @@ class AssignmentCreateCommand extends CommanderCommand {
                 throw new Error();
             }
             assignmentGetSonarSpinner.succeed(`Sonar is supported by the server`);
+
+            this.sonarGate = options.gate;
+            this.sonarProfiles = options.profile ?? [];
         }
 
         const assignmentGetSpinner: ora.Ora = ora('Checking assignment name availability').start();
@@ -103,7 +111,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)...'));
 
-        this.assignment = await DojoBackendManager.createAssignment(options.name, options.language, this.members!, this.templateIdOrNamespace, this.sonar);
+        this.assignment = await DojoBackendManager.createAssignment(options.name, options.language, this.members!, this.templateIdOrNamespace, this.sonar, this.sonarGate, this.sonarProfiles);
 
         const oraInfo = (message: string) => {
             ora({
diff --git a/NodeApp/src/managers/DojoBackendManager.ts b/NodeApp/src/managers/DojoBackendManager.ts
index c2c4b66..e82c903 100644
--- a/NodeApp/src/managers/DojoBackendManager.ts
+++ b/NodeApp/src/managers/DojoBackendManager.ts
@@ -247,7 +247,7 @@ class DojoBackendManager {
         }
     }
 
-    public async createAssignment(name: string, language: string, members: Array<Gitlab.UserSchema>, templateIdOrNamespace: string | null, sonar: boolean = false, verbose: boolean = true): Promise<Assignment> {
+    public async createAssignment(name: string, language: string, members: Array<Gitlab.UserSchema>, 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 ) {
@@ -259,7 +259,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 ) {
-- 
GitLab