diff --git a/ExpressAPI/src/managers/SonarManager.ts b/ExpressAPI/src/managers/SonarManager.ts index ed082834c805dc2077645f9d5c8793361aa63b8f..38bc133b1bfd81344deec02105cac4120872bceb 100644 --- a/ExpressAPI/src/managers/SonarManager.ts +++ b/ExpressAPI/src/managers/SonarManager.ts @@ -155,6 +155,48 @@ class SonarManager { return false; } } + + /** + * Return the sonar user login name associated with the gitlab username + * @param gitlabUsername Username to look up + */ + async findUserFromGitlabUser(gitlabUsername: string) { + const formData = new FormData(); + formData.append('q', gitlabUsername); + + const resp = await this.executeGetRequest<{ users: { login: string, name: string }[] }>(this.getApiUrl(SonarRoute.SEARCH_USER), formData); + for (const u of resp.users) { + if ( u.name == gitlabUsername ) { + return u.login; + } + } + return undefined; + } + + async addUserToProject(username: string, projectKey: string, privileged: boolean) { + const permissions = ['user', 'codeviewer']; + if (privileged) { + permissions.push('issueadmin'); + } + + for (const perm of permissions) { + const formData = new FormData(); + formData.append('projectKey', projectKey); + formData.append('permission', perm); + formData.append('login', username); + + await this.executePostRequest(this.getApiUrl(SonarRoute.PROJECT_ADD_USER), formData) + } + } + + async addGitlabUserToProject(gitlabUsername: string, projectKey: string, privileged: boolean) { + const username = await this.findUserFromGitlabUser(gitlabUsername); + if (username == undefined) { + return false; + } + await this.addUserToProject(username, projectKey, privileged); + return true; + } } export default new SonarManager(); \ No newline at end of file diff --git a/ExpressAPI/src/routes/AssignmentRoutes.ts b/ExpressAPI/src/routes/AssignmentRoutes.ts index ed9be070d6d566de745701bb51289c3380500e59..640cdcc72395039249d8a8162025027251a941aa 100644 --- a/ExpressAPI/src/routes/AssignmentRoutes.ts +++ b/ExpressAPI/src/routes/AssignmentRoutes.ts @@ -180,6 +180,19 @@ class AssignmentRoutes implements RoutesManager { } else { sonarProject = resp; } + + try { + for ( const u of params.members ) { + const success = await SonarManager.addGitlabUserToProject(u.username, sonarProject.project.key, true); + if (!success) { + return GlobalHelper.repositoryCreationError('Sonar add member error', undefined, req, res, DojoStatusCode.ASSIGNMENT_CREATION_SONAR_MEMBER, DojoStatusCode.ASSIGNMENT_CREATION_SONAR_MEMBER, repository, sonarProject); + } + } + } catch ( error ) { + logger.error('Sonar add member error'); + logger.error(error); + return GlobalHelper.repositoryCreationError('Sonar add member error', error, req, res, DojoStatusCode.ASSIGNMENT_CREATION_SONAR_ERROR, DojoStatusCode.ASSIGNMENT_CREATION_SONAR_ERROR, repository, sonarProject); + } } try { diff --git a/ExpressAPI/src/routes/ExerciseRoutes.ts b/ExpressAPI/src/routes/ExerciseRoutes.ts index 69db635bae7237b6663dfd39ec6fe084402e6fb1..cf3a4ddfdb1a2265c663a251529e9d2a124ce7a7 100644 --- a/ExpressAPI/src/routes/ExerciseRoutes.ts +++ b/ExpressAPI/src/routes/ExerciseRoutes.ts @@ -173,7 +173,6 @@ class ExerciseRoutes implements RoutesManager { })); // Create Sonar project - console.log(assignment, repository); if (assignment.useSonar && assignment.sonarProfiles != null) { const profiles: string[] = JSON.parse(assignment.sonarProfiles as string); const resp = await SonarManager.createProjectWithQualities(repository, assignment.sonarGate, profiles, req, res); @@ -182,6 +181,25 @@ class ExerciseRoutes implements RoutesManager { } else { sonarProject = resp; } + + try { + for ( const u of assignment.staff ) { + const success = await SonarManager.addGitlabUserToProject(u.gitlabUsername, sonarProject.project.key, true); + if (!success) { + return GlobalHelper.repositoryCreationError('Sonar add member error', undefined, req, res, DojoStatusCode.ASSIGNMENT_CREATION_SONAR_MEMBER, DojoStatusCode.ASSIGNMENT_CREATION_SONAR_MEMBER, repository, sonarProject); + } + } + for ( const u of params.members ) { + const success = await SonarManager.addGitlabUserToProject(u.username, sonarProject.project.key, false); + if (!success) { + return GlobalHelper.repositoryCreationError('Sonar add member error', undefined, req, res, DojoStatusCode.ASSIGNMENT_CREATION_SONAR_MEMBER, DojoStatusCode.ASSIGNMENT_CREATION_SONAR_MEMBER, repository, sonarProject); + } + } + } catch ( error ) { + logger.error('Sonar add member error'); + logger.error(error); + return GlobalHelper.repositoryCreationError('Sonar add member error', error, req, res, DojoStatusCode.ASSIGNMENT_CREATION_SONAR_ERROR, DojoStatusCode.ASSIGNMENT_CREATION_SONAR_ERROR, repository, sonarProject); + } } const exercise: Exercise = await db.exercise.create({ diff --git a/ExpressAPI/src/shared b/ExpressAPI/src/shared index bd29fe76fdb1b124e3fe2f23e995a2b3b70694a7..8efab438a60569011f2757c803a89c81bc46a174 160000 --- a/ExpressAPI/src/shared +++ b/ExpressAPI/src/shared @@ -1 +1 @@ -Subproject commit bd29fe76fdb1b124e3fe2f23e995a2b3b70694a7 +Subproject commit 8efab438a60569011f2757c803a89c81bc46a174