From fe30326e0b5bbb35e67cac491abe1ce0c73de4c8 Mon Sep 17 00:00:00 2001
From: Joel von der Weid <joel.von-der-weid@hesge.ch>
Date: Wed, 3 Jul 2024 13:30:00 +0200
Subject: [PATCH] Add allowSonarFailure feature

---
 .../migration.sql                             |  2 ++
 .../migration.sql                             |  2 ++
 ExpressAPI/prisma/schema.prisma               | 22 ++++++++++---------
 ExpressAPI/src/routes/AssignmentRoutes.ts     | 10 ++++++++-
 ExpressAPI/src/routes/ExerciseRoutes.ts       | 21 ++++++++++++------
 5 files changed, 39 insertions(+), 18 deletions(-)
 create mode 100644 ExpressAPI/prisma/migrations/20240703072757_add_sonar_in_result/migration.sql
 create mode 100644 ExpressAPI/prisma/migrations/20240703073048_add_allowsonarfailure/migration.sql

diff --git a/ExpressAPI/prisma/migrations/20240703072757_add_sonar_in_result/migration.sql b/ExpressAPI/prisma/migrations/20240703072757_add_sonar_in_result/migration.sql
new file mode 100644
index 0000000..4d88744
--- /dev/null
+++ b/ExpressAPI/prisma/migrations/20240703072757_add_sonar_in_result/migration.sql
@@ -0,0 +1,2 @@
+-- AlterTable
+ALTER TABLE `Result` ADD COLUMN `sonarGatePass` BOOLEAN NULL;
diff --git a/ExpressAPI/prisma/migrations/20240703073048_add_allowsonarfailure/migration.sql b/ExpressAPI/prisma/migrations/20240703073048_add_allowsonarfailure/migration.sql
new file mode 100644
index 0000000..ecaab69
--- /dev/null
+++ b/ExpressAPI/prisma/migrations/20240703073048_add_allowsonarfailure/migration.sql
@@ -0,0 +1,2 @@
+-- AlterTable
+ALTER TABLE `Assignment` ADD COLUMN `allowSonarFailure` BOOLEAN NOT NULL DEFAULT true;
diff --git a/ExpressAPI/prisma/schema.prisma b/ExpressAPI/prisma/schema.prisma
index 764785b..29ac243 100644
--- a/ExpressAPI/prisma/schema.prisma
+++ b/ExpressAPI/prisma/schema.prisma
@@ -45,11 +45,12 @@ model Assignment {
     published          Boolean  @default(false)
     language           Language @default(other)
 
-    useSonar          Boolean @default(false)
+    useSonar          Boolean  @default(false)
+    allowSonarFailure Boolean  @default(true)
     sonarKey          String?
-    sonarCreationInfo Json?   @db.Json
+    sonarCreationInfo Json?    @db.Json
     sonarGate         String?
-    sonarProfiles     Json?   @db.Json
+    sonarProfiles     Json?    @db.Json
 
     exercises Exercise[]
     staff     User[]
@@ -83,13 +84,14 @@ model Exercise {
 }
 
 model Result {
-    exerciseId String   @db.Char(36)
-    dateTime   DateTime @default(now())
-    success    Boolean
-    exitCode   Int
-    commit     Json     @db.Json
-    results    Json     @db.Json
-    files      Json     @db.Json
+    exerciseId     String   @db.Char(36)
+    dateTime       DateTime @default(now())
+    success        Boolean
+    sonarGatePass  Boolean?
+    exitCode       Int
+    commit         Json     @db.Json
+    results        Json     @db.Json
+    files          Json     @db.Json
 
     exercise Exercise @relation(fields: [exerciseId], references: [id], onDelete: Cascade, onUpdate: Cascade)
 
diff --git a/ExpressAPI/src/routes/AssignmentRoutes.ts b/ExpressAPI/src/routes/AssignmentRoutes.ts
index a5cce0e..f5f7d22 100644
--- a/ExpressAPI/src/routes/AssignmentRoutes.ts
+++ b/ExpressAPI/src/routes/AssignmentRoutes.ts
@@ -50,6 +50,11 @@ class AssignmentRoutes implements RoutesManager {
             notEmpty : true,
             isBoolean: true
         },
+        allowSonarFailure: {
+            trim     : true,
+            notEmpty : false,
+            isBoolean: true
+        },
         language: {
             trim    : true,
             notEmpty: true,
@@ -143,9 +148,10 @@ class AssignmentRoutes implements RoutesManager {
 
     private async createAssignment(req: express.Request, res: express.Response) {
         const params: {
-            name: string, members: Array<Gitlab.UserSchema>, template: string, useSonar: string, sonarGate: string, sonarProfiles: string, language: string
+            name: string, members: Array<Gitlab.UserSchema>, template: string, useSonar: string, sonarGate: string, sonarProfiles: string, language: string, allowSonarFailure: string | undefined
         } = req.body;
         const useSonar = params.useSonar === 'true';
+        const allowSonarFailure = params.allowSonarFailure === 'true';
 
         params.members = [ await req.session.profile.gitlabProfile.value, ...params.members ];
         params.members = params.members.removeObjectDuplicates(gitlabUser => gitlabUser.id);
@@ -221,6 +227,7 @@ class AssignmentRoutes implements RoutesManager {
                                                                                                        gitlabLastInfo    : repository as unknown as Prisma.JsonObject,
                                                                                                        gitlabLastInfoDate: new Date(),
                                                                                                        useSonar          : useSonar,
+                                                                                                       allowSonarFailure : allowSonarFailure,
                                                                                                        sonarKey          : sonarProject?.project.key,
                                                                                                        sonarCreationInfo : sonarProject?.project,
                                                                                                        sonarGate         : params.sonarGate,
@@ -242,6 +249,7 @@ class AssignmentRoutes implements RoutesManager {
                                                                                                        }
                                                                                                    }
                                                                                                }), 'Database error') as Assignment;
+                                                                             
 
             req.session.sendResponse(res, StatusCodes.OK, assignment);
         } catch ( error ) {
diff --git a/ExpressAPI/src/routes/ExerciseRoutes.ts b/ExpressAPI/src/routes/ExerciseRoutes.ts
index 1762ea7..7792151 100644
--- a/ExpressAPI/src/routes/ExerciseRoutes.ts
+++ b/ExpressAPI/src/routes/ExerciseRoutes.ts
@@ -64,6 +64,11 @@ class ExerciseRoutes implements RoutesManager {
         archiveBase64: {
             isBase64: true,
             notEmpty: true
+        },
+        sonarGatePass: {
+            trim     : true,
+            notEmpty : false,
+            isBoolean: true
         }
     };
 
@@ -382,17 +387,19 @@ class ExerciseRoutes implements RoutesManager {
     }
 
     private async createResult(req: express.Request, res: express.Response) {
-        const params: { exitCode: number, commit: Record<string, string>, results: ExerciseResultsFile, files: Array<IFileDirStat>, archiveBase64: string } = req.body;
+        const params: { exitCode: number, commit: Record<string, string>, results: ExerciseResultsFile, files: Array<IFileDirStat>, archiveBase64: string, sonarGatePass: string | undefined } = req.body;
         const exercise: Exercise = req.boundParams.exercise!;
+        const sonarGate = params.sonarGatePass === "true";
 
         const result = await db.result.create({
                                                   data: {
-                                                      exerciseId: exercise.id,
-                                                      exitCode  : params.exitCode,
-                                                      success   : params.results.success!,
-                                                      commit    : params.commit,
-                                                      results   : params.results as unknown as Prisma.JsonObject,
-                                                      files     : params.files
+                                                      exerciseId   : exercise.id,
+                                                      exitCode     : params.exitCode,
+                                                      success      : params.results.success!,
+                                                      sonarGatePass: sonarGate,
+                                                      commit       : params.commit,
+                                                      results      : params.results as unknown as Prisma.JsonObject,
+                                                      files        : params.files
                                                   }
                                               });
 
-- 
GitLab