From 1d9a5e9252915db2598ed75135a2178e5ab30191 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C3=ABl=20Minelli?= <git@minelli.me>
Date: Tue, 30 Apr 2024 13:22:07 +0200
Subject: [PATCH] AssignmentCreation => Add secret in CI/CD env vars

---
 ExpressAPI/src/routes/AssignmentRoutes.ts | 24 ++++++++++++++---------
 1 file changed, 15 insertions(+), 9 deletions(-)

diff --git a/ExpressAPI/src/routes/AssignmentRoutes.ts b/ExpressAPI/src/routes/AssignmentRoutes.ts
index 91c618f..3423f5b 100644
--- a/ExpressAPI/src/routes/AssignmentRoutes.ts
+++ b/ExpressAPI/src/routes/AssignmentRoutes.ts
@@ -29,30 +29,31 @@ import DojoModelsHelper               from '../helpers/DojoModelsHelper';
 import SonarManager                   from '../managers/SonarManager';
 import SonarProjectCreation           from '../shared/types/Sonar/SonarProjectCreation';
 import SharedSonarManager             from '../shared/managers/SharedSonarManager';
+import { v4 as uuidv4 }               from 'uuid';
 
 
 class AssignmentRoutes implements RoutesManager {
     private readonly assignmentValidator: ExpressValidator.Schema = {
-        name     : {
+        name    : {
             trim    : true,
             notEmpty: true
         },
-        members  : {
+        members : {
             trim           : true,
             notEmpty       : true,
             customSanitizer: DojoValidators.jsonSanitizer
         },
-        template : {
+        template: {
             trim           : true,
             custom         : DojoValidators.templateUrlValidator,
             customSanitizer: DojoValidators.templateUrlSanitizer
         },
-        useSonar : {
+        useSonar: {
             trim     : true,
             notEmpty : true,
-            isBoolean: true,
+            isBoolean: true
         },
-        language : {
+        language: {
             trim    : true,
             notEmpty: true,
             custom  : DojoValidators.supportedLanguageValidator
@@ -107,11 +108,13 @@ class AssignmentRoutes implements RoutesManager {
         params.members = [ await req.session.profile.gitlabProfile.value, ...params.members ];
         params.members = params.members.removeObjectDuplicates(gitlabUser => gitlabUser.id);
 
-        if (useSonar && !(await SharedSonarManager.isSonarSupported())) {
+        if ( useSonar && !(await SharedSonarManager.isSonarSupported()) ) {
             return req.session.sendResponse(res, StatusCodes.UNPROCESSABLE_ENTITY, {}, `Sonar integration is not supported`, DojoStatusCode.ASSIGNMENT_CREATION_SONAR_ERROR);
         }
 
         let repository: GitlabRepository;
+        const secret: string = uuidv4();
+
         try {
             repository = await GitlabManager.createRepository(params.name, Config.assignment.default.description.replace('{{ASSIGNMENT_NAME}}', params.name), Config.assignment.default.visibility, Config.assignment.default.initReadme, Config.gitlab.group.assignments, Config.assignment.default.sharedRunnersEnabled, Config.assignment.default.wikiEnabled, params.template);
         } catch ( error ) {
@@ -134,6 +137,9 @@ class AssignmentRoutes implements RoutesManager {
         try {
             await GitlabManager.protectBranch(repository.id, '*', true, GitlabAccessLevel.DEVELOPER, GitlabAccessLevel.DEVELOPER, GitlabAccessLevel.OWNER);
 
+            await GitlabManager.addRepositoryVariable(repository.id, 'DOJO_ASSIGNMENT_NAME', repository.name, false, true);
+            await GitlabManager.addRepositoryVariable(repository.id, 'DOJO_ASSIGNMENT_SECRET', secret, false, true);
+
             await GitlabManager.addRepositoryBadge(repository.id, Config.gitlab.badges.pipeline.link, Config.gitlab.badges.pipeline.imageUrl, 'Pipeline Status');
         } catch ( error ) {
             return GlobalHelper.repositoryCreationError('Repo params error', error, req, res, DojoStatusCode.ASSIGNMENT_CREATION_GITLAB_ERROR, DojoStatusCode.ASSIGNMENT_CREATION_INTERNAL_ERROR, repository);
@@ -165,11 +171,11 @@ class AssignmentRoutes implements RoutesManager {
 
         // Create Sonar project
         let sonarProject: SonarProjectCreation | undefined = undefined;
-        if (useSonar) {
+        if ( useSonar ) {
             try {
                 sonarProject = await SonarManager.createProjectFromGitlab(repository.id);
             } catch ( error ) {
-                logger.error("Sonar project creation 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);
             }
-- 
GitLab