This is an automated email from the ASF dual-hosted git repository.

klesh pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-devlake.git


The following commit(s) were added to refs/heads/main by this push:
     new 5fcd33990 fix: sonarqube: missing api/users/search endpoint (#8813)
5fcd33990 is described below

commit 5fcd33990f81592d903cf4654b8253b0faf26409
Author: Pavel Sturc <[email protected]>
AuthorDate: Wed Apr 1 14:54:49 2026 +0200

    fix: sonarqube: missing api/users/search endpoint (#8813)
---
 backend/plugins/sonarqube/impl/impl.go                |  1 +
 backend/plugins/sonarqube/tasks/accounts_collector.go | 11 ++++++++++-
 backend/plugins/sonarqube/tasks/task_data.go          |  1 +
 3 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/backend/plugins/sonarqube/impl/impl.go 
b/backend/plugins/sonarqube/impl/impl.go
index 5c1a77486..a6d6bd258 100644
--- a/backend/plugins/sonarqube/impl/impl.go
+++ b/backend/plugins/sonarqube/impl/impl.go
@@ -136,6 +136,7 @@ func (p Sonarqube) PrepareTaskData(taskCtx 
plugin.TaskContext, options map[strin
                Options:       op,
                ApiClient:     apiClient,
                TaskStartTime: time.Now(),
+               IsCloud:       connection.IsCloud(),
        }
        // even we have project in _tool_sonaqube_projects, we still need to 
collect project to update LastAnalysisDate
        var apiProject *models.SonarqubeApiProject
diff --git a/backend/plugins/sonarqube/tasks/accounts_collector.go 
b/backend/plugins/sonarqube/tasks/accounts_collector.go
index 6bb02272e..0a30b57f0 100644
--- a/backend/plugins/sonarqube/tasks/accounts_collector.go
+++ b/backend/plugins/sonarqube/tasks/accounts_collector.go
@@ -36,11 +36,20 @@ func CollectAccounts(taskCtx plugin.SubTaskContext) 
errors.Error {
        logger := taskCtx.GetLogger()
        logger.Info("collect accounts")
        rawDataSubTaskArgs, data := CreateRawDataSubTaskArgs(taskCtx, 
RAW_ACCOUNTS_TABLE)
+
+       // SonarCloud removed api/users/search - use 
organizations/search_members instead
+       // The "organization" query param is auto-added by PrepareApiClient
+       urlTemplate := "users/search"
+       if data.IsCloud {
+               urlTemplate = "organizations/search_members"
+               logger.Info("using organizations/search_members for SonarCloud")
+       }
+
        collector, err := helper.NewApiCollector(helper.ApiCollectorArgs{
                RawDataSubTaskArgs: *rawDataSubTaskArgs,
                ApiClient:          data.ApiClient,
                PageSize:           100,
-               UrlTemplate:        "users/search",
+               UrlTemplate:        urlTemplate,
                Query: func(reqData *helper.RequestData) (url.Values, 
errors.Error) {
                        query := url.Values{}
                        query.Set("p", fmt.Sprintf("%v", reqData.Pager.Page))
diff --git a/backend/plugins/sonarqube/tasks/task_data.go 
b/backend/plugins/sonarqube/tasks/task_data.go
index e898befa0..06cb83dd5 100644
--- a/backend/plugins/sonarqube/tasks/task_data.go
+++ b/backend/plugins/sonarqube/tasks/task_data.go
@@ -37,6 +37,7 @@ type SonarqubeTaskData struct {
        ApiClient        *api.ApiAsyncClient
        LastAnalysisDate *time.Time
        TaskStartTime    time.Time
+       IsCloud          bool
 }
 
 func DecodeAndValidateTaskOptions(options map[string]interface{}) 
(*SonarqubeOptions, errors.Error) {

Reply via email to