aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-webserver-webapi-v2/src/main
diff options
context:
space:
mode:
authorJulien Camus <julien.camus@sonarsource.com>2025-07-08 18:29:14 +0200
committersonartech <sonartech@sonarsource.com>2025-07-08 20:03:57 +0000
commit051dd8000d1156e2d25fb949e427a0de2f8475d2 (patch)
tree9b1b81fd7a9b7dbc5400b16a00d1db33dc21f01e /server/sonar-webserver-webapi-v2/src/main
parent75b9fb6dd9edee86d61511256437f062beefe3e5 (diff)
downloadsonarqube-master.tar.gz
sonarqube-master.zip
SONAR-25454 Implement repository URL-based project bindings fuzzy searchHEADmaster
Diffstat (limited to 'server/sonar-webserver-webapi-v2/src/main')
-rw-r--r--server/sonar-webserver-webapi-v2/src/main/java/org/sonar/server/v2/api/projectbindings/controller/DefaultProjectBindingsController.java38
-rw-r--r--server/sonar-webserver-webapi-v2/src/main/java/org/sonar/server/v2/api/projectbindings/request/ProjectBindingsSearchRestRequest.java18
2 files changed, 36 insertions, 20 deletions
diff --git a/server/sonar-webserver-webapi-v2/src/main/java/org/sonar/server/v2/api/projectbindings/controller/DefaultProjectBindingsController.java b/server/sonar-webserver-webapi-v2/src/main/java/org/sonar/server/v2/api/projectbindings/controller/DefaultProjectBindingsController.java
index 3ea79cb5467..19677708455 100644
--- a/server/sonar-webserver-webapi-v2/src/main/java/org/sonar/server/v2/api/projectbindings/controller/DefaultProjectBindingsController.java
+++ b/server/sonar-webserver-webapi-v2/src/main/java/org/sonar/server/v2/api/projectbindings/controller/DefaultProjectBindingsController.java
@@ -21,6 +21,7 @@ package org.sonar.server.v2.api.projectbindings.controller;
import java.util.List;
import java.util.Optional;
+import org.apache.commons.lang3.StringUtils;
import org.sonar.db.alm.setting.ProjectAlmSettingDto;
import org.sonar.db.project.ProjectDto;
import org.sonar.server.common.SearchResults;
@@ -35,8 +36,9 @@ import org.sonar.server.v2.api.projectbindings.request.ProjectBindingsSearchRest
import org.sonar.server.v2.api.projectbindings.response.ProjectBindingsSearchRestResponse;
import org.sonar.server.v2.api.response.PageRestResponse;
-import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.permission.GlobalPermission.PROVISION_PROJECTS;
+import static org.sonar.db.permission.ProjectPermission.USER;
+import static org.sonar.server.exceptions.BadRequestException.throwBadRequestException;
public class DefaultProjectBindingsController implements ProjectBindingsController {
@@ -61,25 +63,26 @@ public class DefaultProjectBindingsController implements ProjectBindingsControll
}
}
- private static ProjectBinding toProjectBinding(ProjectDto projectDto, ProjectAlmSettingDto projectAlmSettingDto) {
- return new ProjectBinding(
- projectAlmSettingDto.getUuid(),
- projectAlmSettingDto.getAlmSettingUuid(),
- projectAlmSettingDto.getProjectUuid(),
- projectDto.getKey(),
- projectAlmSettingDto.getAlmRepo(),
- projectAlmSettingDto.getAlmSlug());
- }
-
@Override
public ProjectBindingsSearchRestResponse searchProjectBindings(ProjectBindingsSearchRestRequest restRequest, RestPage restPage) {
userSession.checkLoggedIn().checkPermission(PROVISION_PROJECTS);
- ProjectBindingsSearchRequest serviceRequest = new ProjectBindingsSearchRequest(restRequest.repository(), restRequest.dopSettingId(), restPage.pageIndex(), restPage.pageSize());
+ validateSearchParameters(restRequest);
+ ProjectBindingsSearchRequest serviceRequest = new ProjectBindingsSearchRequest(
+ restRequest.repository(), restRequest.dopSettingId(), restRequest.repositoryUrl(), restPage.pageIndex(), restPage.pageSize());
SearchResults<ProjectBindingInformation> searchResults = projectBindingsService.findProjectBindingsByRequest(serviceRequest);
List<ProjectBinding> projectBindings = toProjectBindings(searchResults);
return new ProjectBindingsSearchRestResponse(projectBindings, new PageRestResponse(restPage.pageIndex(), restPage.pageSize(), searchResults.total()));
}
+ private static void validateSearchParameters(ProjectBindingsSearchRestRequest request) {
+ boolean hasRepositoryUrl = StringUtils.isNotBlank(request.repositoryUrl());
+ boolean hasOtherParams = StringUtils.isNotBlank(request.repository()) || StringUtils.isNotBlank(request.dopSettingId());
+
+ if (hasRepositoryUrl && hasOtherParams) {
+ throwBadRequestException("'repositoryUrl' parameter cannot be used together with 'repository' or 'dopSettingId' parameters");
+ }
+ }
+
private static List<ProjectBinding> toProjectBindings(SearchResults<ProjectBindingInformation> searchResults) {
return searchResults.searchResults().stream()
.map(DefaultProjectBindingsController::toProjectBinding)
@@ -95,4 +98,15 @@ public class DefaultProjectBindingsController implements ProjectBindingsControll
projectBindingInformation.repository(),
projectBindingInformation.slug());
}
+
+ private static ProjectBinding toProjectBinding(ProjectDto projectDto, ProjectAlmSettingDto projectAlmSettingDto) {
+ return new ProjectBinding(
+ projectAlmSettingDto.getUuid(),
+ projectAlmSettingDto.getAlmSettingUuid(),
+ projectAlmSettingDto.getProjectUuid(),
+ projectDto.getKey(),
+ projectAlmSettingDto.getAlmRepo(),
+ projectAlmSettingDto.getAlmSlug());
+ }
+
}
diff --git a/server/sonar-webserver-webapi-v2/src/main/java/org/sonar/server/v2/api/projectbindings/request/ProjectBindingsSearchRestRequest.java b/server/sonar-webserver-webapi-v2/src/main/java/org/sonar/server/v2/api/projectbindings/request/ProjectBindingsSearchRestRequest.java
index 6df2d7980f7..c3020fd06cc 100644
--- a/server/sonar-webserver-webapi-v2/src/main/java/org/sonar/server/v2/api/projectbindings/request/ProjectBindingsSearchRestRequest.java
+++ b/server/sonar-webserver-webapi-v2/src/main/java/org/sonar/server/v2/api/projectbindings/request/ProjectBindingsSearchRestRequest.java
@@ -22,19 +22,21 @@ package org.sonar.server.v2.api.projectbindings.request;
import io.swagger.v3.oas.annotations.media.Schema;
import javax.annotation.Nullable;
-public record ProjectBindingsSearchRestRequest (
+public record ProjectBindingsSearchRestRequest(
- @Nullable
- @Schema(
+ @Nullable @Schema(
description = """
Filter on the repository name.
This parameter performs an exact, case insensitive, match.
- """)
- String repository,
+ """) String repository,
- @Nullable
- @Schema(description = "Filter on the DevOps Platform setting id.")
- String dopSettingId
+ @Nullable @Schema(description = "Filter on the DevOps Platform setting id.") String dopSettingId,
+
+ @Nullable @Schema(
+ description = """
+ Filter on the repository URL.
+ This parameter can be in different formats, the traditional URL or the git remote URL (https or ssh).
+ """) String repositoryUrl
) {