From db01ec7493d6cc900da1f8bdc6b494df1bf09509 Mon Sep 17 00:00:00 2001
From: Joel von der Weid <joel.von-der-weid@hesge.ch>
Date: Tue, 2 Apr 2024 15:17:05 +0200
Subject: [PATCH] Add sonar project creation for exercises

---
 ExpressAPI/src/helpers/GlobalHelper.ts    |  5 +----
 ExpressAPI/src/routes/AssignmentRoutes.ts |  1 -
 ExpressAPI/src/routes/ExerciseRoutes.ts   | 16 ++++++++++++++++
 3 files changed, 17 insertions(+), 5 deletions(-)

diff --git a/ExpressAPI/src/helpers/GlobalHelper.ts b/ExpressAPI/src/helpers/GlobalHelper.ts
index 65fea1a..76c85b0 100644
--- a/ExpressAPI/src/helpers/GlobalHelper.ts
+++ b/ExpressAPI/src/helpers/GlobalHelper.ts
@@ -2,12 +2,9 @@ import express          from 'express';
 import GitlabRepository from '../shared/types/Gitlab/GitlabRepository';
 import logger           from '../shared/logging/WinstonLogger';
 import GitlabManager         from '../managers/GitlabManager';
-import axios, { AxiosError } from 'axios';
 import { StatusCodes }       from 'http-status-codes';
 import DojoStatusCode   from '../shared/types/Dojo/DojoStatusCode';
-import SharedConfig     from '../shared/config/SharedConfig';
-import * as https from 'https';
-
+import { AxiosError } from 'axios';
 
 class GlobalHelper {
     async repositoryCreationError(message: string, error: unknown, req: express.Request, res: express.Response, gitlabError: DojoStatusCode, internalError: DojoStatusCode, repositoryToRemove?: GitlabRepository): Promise<void> {
diff --git a/ExpressAPI/src/routes/AssignmentRoutes.ts b/ExpressAPI/src/routes/AssignmentRoutes.ts
index 8f217b0..91c618f 100644
--- a/ExpressAPI/src/routes/AssignmentRoutes.ts
+++ b/ExpressAPI/src/routes/AssignmentRoutes.ts
@@ -169,7 +169,6 @@ class AssignmentRoutes implements RoutesManager {
             try {
                 sonarProject = await SonarManager.createProjectFromGitlab(repository.id);
             } catch ( error ) {
-                console.log(JSON.stringify(error));
                 logger.error("Sonar project creation error");
                 logger.error(error);
                 return GlobalHelper.repositoryCreationError('Sonar error', error, req, res, DojoStatusCode.ASSIGNMENT_CREATION_SONAR_ERROR, DojoStatusCode.ASSIGNMENT_CREATION_INTERNAL_ERROR, repository);
diff --git a/ExpressAPI/src/routes/ExerciseRoutes.ts b/ExpressAPI/src/routes/ExerciseRoutes.ts
index 1317f5b..fe22cab 100644
--- a/ExpressAPI/src/routes/ExerciseRoutes.ts
+++ b/ExpressAPI/src/routes/ExerciseRoutes.ts
@@ -31,6 +31,8 @@ import DojoStatusCode            from '../shared/types/Dojo/DojoStatusCode';
 import GlobalHelper              from '../helpers/GlobalHelper';
 import { IFileDirStat }          from '../shared/helpers/recursiveFilesStats/RecursiveFilesStats';
 import ExerciseManager           from '../managers/ExerciseManager';
+import SonarProjectCreation      from '../shared/types/Sonar/SonarProjectCreation';
+import SonarManager              from '../managers/SonarManager';
 
 
 class ExerciseRoutes implements RoutesManager {
@@ -167,6 +169,18 @@ class ExerciseRoutes implements RoutesManager {
                 }
             }));
 
+            // Create Sonar project
+            let sonarProject: SonarProjectCreation | undefined = undefined;
+            if (assignment.useSonar) {
+                try {
+                    sonarProject = await SonarManager.createProjectFromGitlab(repository.id);
+                } catch ( error ) {
+                    logger.error("Sonar project creation error");
+                    logger.error(error);
+                    return GlobalHelper.repositoryCreationError('Sonar error', error, req, res, DojoStatusCode.EXERCISE_CREATION_SONAR_ERROR, DojoStatusCode.ASSIGNMENT_CREATION_INTERNAL_ERROR, repository);
+                }
+            }
+
             const exercise: Exercise = await db.exercise.create({
                                                                     data: {
                                                                         id                : exerciseId,
@@ -178,6 +192,8 @@ class ExerciseRoutes implements RoutesManager {
                                                                         gitlabCreationInfo: repository as unknown as Prisma.JsonObject,
                                                                         gitlabLastInfo    : repository as unknown as Prisma.JsonObject,
                                                                         gitlabLastInfoDate: new Date(),
+                                                                        sonarKey          : sonarProject?.project.key,
+                                                                        sonarCreationInfo : sonarProject?.project,
                                                                         members           : {
                                                                             connectOrCreate: [ ...params.members.map(gitlabUser => {
                                                                                 return {
-- 
GitLab