From 634fb811fddbb272d6ebd919d92e0589204d2e9c Mon Sep 17 00:00:00 2001
From: Jan-Niclas Struewer <j.n.struewer@gmail.com>
Date: Wed, 26 Apr 2023 14:13:49 +0200
Subject: [PATCH] added possibility to use repo path for queries to ease manual
 usage

---
 .../dataprovider/WebSecurityConfiguration.kt  |  1 +
 .../dataprovider/gitlab/GitlabController.kt   | 14 +++++++++++
 .../iem/dataprovider/gitlab/GitlabService.kt  |  9 +++++--
 .../taskManager/tasks/GitlabTask.kt           | 24 ++++++++++++++-----
 4 files changed, 40 insertions(+), 8 deletions(-)

diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/WebSecurityConfiguration.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/WebSecurityConfiguration.kt
index 202fbbb8..921cb19f 100644
--- a/src/main/kotlin/de/fraunhofer/iem/dataprovider/WebSecurityConfiguration.kt
+++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/WebSecurityConfiguration.kt
@@ -17,6 +17,7 @@ class SecurityConfiguration {
         return http {
             authorizeExchange {
                 authorize("/gitlab/repoChanged", permitAll)
+                authorize("/gitlab/repoChangedPath", permitAll)
             }
             csrf {
                 disable()
diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/gitlab/GitlabController.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/gitlab/GitlabController.kt
index 829194f0..324a4dfd 100644
--- a/src/main/kotlin/de/fraunhofer/iem/dataprovider/gitlab/GitlabController.kt
+++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/gitlab/GitlabController.kt
@@ -11,6 +11,7 @@ enum class Platform {
     GITHUB,
 }
 data class RepositoryChangedDto(val repoId: Long, val platform: Platform)
+data class RepositoryChangedPathDto(val path: String, val platform: Platform)
 @RestController
 @RequestMapping("/gitlab")
 class GitlabController(private val gitlabService: GitlabService) {
@@ -30,4 +31,17 @@ class GitlabController(private val gitlabService: GitlabService) {
             }
         }
     }
+
+    // TODO: improve duplicate code from repoChanged
+    @PostMapping("/repoChangedPath")
+    suspend fun repoChangedPath(@RequestBody repositoryChangedDto: RepositoryChangedPathDto) {
+        logger.info("Repo changed POST request for path ${repositoryChangedDto.path} on platform ${repositoryChangedDto.platform} received.")
+        when (repositoryChangedDto.platform) {
+            Platform.OPEN_CODE -> gitlabService.queryOpenCodeProject(repositoryChangedDto.path)
+            else -> {
+                logger.info("Platform currently not supported.")
+                // TODO: send fitting http response
+            }
+        }
+    }
 }
\ No newline at end of file
diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/gitlab/GitlabService.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/gitlab/GitlabService.kt
index ec09be77..b2e44df2 100644
--- a/src/main/kotlin/de/fraunhofer/iem/dataprovider/gitlab/GitlabService.kt
+++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/gitlab/GitlabService.kt
@@ -2,7 +2,8 @@ package de.fraunhofer.iem.dataprovider.gitlab
 
 import de.fraunhofer.iem.dataprovider.logger.getLogger
 import de.fraunhofer.iem.dataprovider.taskManager.TaskManager
-import de.fraunhofer.iem.dataprovider.taskManager.tasks.GetGitlabProjectTask
+import de.fraunhofer.iem.dataprovider.taskManager.tasks.GetGitlabProjectIdTask
+import de.fraunhofer.iem.dataprovider.taskManager.tasks.GetGitlabProjectPathTask
 import org.springframework.stereotype.Service
 
 
@@ -13,7 +14,11 @@ class GitlabService(private val openCodeGitlabConfiguration: OpenCodeGitlabConfi
     private val logger = getLogger(javaClass)
 
     suspend fun queryOpenCodeProject(repoId: Long) {
-        taskManager.addTask(GetGitlabProjectTask(repoId = repoId, gitlabConfiguration = openCodeGitlabConfiguration, responseChannel = taskManager::addTask))
+        taskManager.addTask(GetGitlabProjectIdTask(repoId = repoId, gitlabConfiguration = openCodeGitlabConfiguration, responseChannel = taskManager::addTask))
+    }
+
+    suspend fun queryOpenCodeProject(repoId: String) {
+        taskManager.addTask(GetGitlabProjectPathTask(repoId = repoId, gitlabConfiguration = openCodeGitlabConfiguration, responseChannel = taskManager::addTask))
     }
 
 }
\ No newline at end of file
diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/GitlabTask.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/GitlabTask.kt
index 96ac3b99..67e1ff8b 100644
--- a/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/GitlabTask.kt
+++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/GitlabTask.kt
@@ -3,20 +3,32 @@ package de.fraunhofer.iem.dataprovider.taskManager.tasks
 import de.fraunhofer.iem.dataprovider.gitlab.GitlabConfiguration
 import org.gitlab4j.api.GitLabApi
 
-class GetGitlabProjectTask(
+sealed class GetGitlabProjectTask(
     override val type: TaskType = TaskType.REPO_CHANGED,
-    private val repoId: Long,
+    protected open val repoId: Any,
     private val gitlabConfiguration: GitlabConfiguration,
-    private val responseChannel: suspend (task: ITask) -> Unit): Task() {
+    private val responseChannel: suspend (task: ITask) -> Unit
+): Task() {
 
     private val gitlabApi: GitLabApi = GitLabApi(gitlabConfiguration.host, gitlabConfiguration.accessToken)
     override suspend fun execute() {
         logger.info("Gitlab config ${gitlabConfiguration.host} ${gitlabConfiguration.accessToken}")
         val project = gitlabApi.projectApi.getProject(repoId)
         logger.info(project.toString())
-        val projectUri = project.sshUrlToRepo
+        val projectUri = project.httpUrlToRepo
         val gitProject = GitProject(project.name, projectUri)
-        logger.info("Retrieved project ${project.path} and URI $projectUri")
+        logger.info("Retrieved project ${project.path} and url $projectUri")
         responseChannel(GitTask(this.type, gitProject, responseChannel))
     }
-}
\ No newline at end of file
+}
+
+class GetGitlabProjectPathTask(
+    override val repoId: String,
+    private val gitlabConfiguration: GitlabConfiguration,
+    private val responseChannel: suspend (task: ITask) -> Unit
+): GetGitlabProjectTask(repoId = repoId, gitlabConfiguration = gitlabConfiguration, responseChannel = responseChannel )
+class GetGitlabProjectIdTask(
+    override val repoId: Long,
+    private val gitlabConfiguration: GitlabConfiguration,
+    private val responseChannel: suspend (task: ITask) -> Unit
+): GetGitlabProjectTask(repoId = repoId, gitlabConfiguration = gitlabConfiguration, responseChannel = responseChannel )
-- 
GitLab