diff options
author | Julien Lancelot <julien.lancelot@sonarsource.com> | 2018-11-27 12:14:43 +0100 |
---|---|---|
committer | SonarTech <sonartech@sonarsource.com> | 2018-12-07 20:21:05 +0100 |
commit | d195a425dbd02415f1b90ab9a813c8aa8ec87cde (patch) | |
tree | 51c7449a620cf1e4ae5725a303b1d6f53b12337f | |
parent | dd75a693f2c7160957eeed54be9151a04a75d0c4 (diff) | |
download | sonarqube-d195a425dbd02415f1b90ab9a813c8aa8ec87cde.tar.gz sonarqube-d195a425dbd02415f1b90ab9a813c8aa8ec87cde.zip |
SONARCLOUD-176 Return subscription in api/organizations/search
3 files changed, 72 insertions, 12 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/organization/ws/SearchAction.java b/server/sonar-server/src/main/java/org/sonar/server/organization/ws/SearchAction.java index 2efee16b3a5..4ce33233fae 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/organization/ws/SearchAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/organization/ws/SearchAction.java @@ -39,6 +39,7 @@ import org.sonar.server.user.UserSession; import org.sonarqube.ws.Organizations; import org.sonarqube.ws.Organizations.Organization; +import static java.lang.String.format; import static java.util.Collections.emptySet; import static org.sonar.core.util.Protobuf.setNullable; import static org.sonar.core.util.stream.MoreCollectors.toSet; @@ -72,8 +73,9 @@ public class SearchAction implements OrganizationsWsAction { .setResponseExample(getClass().getResource("search-example.json")) .setInternal(true) .setSince("6.2") - .setChangelog(new Change("6.4", "Paging fields have been added to the response")) + .setChangelog(new Change("7.5", format("Return 'subscription' field when parameter '%s' is set to 'true'", PARAM_MEMBER))) .setChangelog(new Change("7.5", "Removed 'isAdmin' and return 'actions' for each organization")) + .setChangelog(new Change("6.4", "Paging fields have been added to the response")) .setHandler(this); action.createParam(PARAM_ORGANIZATIONS) @@ -86,7 +88,7 @@ public class SearchAction implements OrganizationsWsAction { action.createParam(PARAM_MEMBER) .setDescription("Filter organizations based on whether the authenticated user is a member. If false, no filter applies.") .setSince("7.0") - .setDefaultValue(String.valueOf(false)) + .setDefaultValue("false") .setBooleanPossibleValues(); action.addPagingParams(100, MAX_SIZE); @@ -94,8 +96,8 @@ public class SearchAction implements OrganizationsWsAction { @Override public void handle(Request request, Response response) throws Exception { - boolean isMember = request.mandatoryParamAsBoolean(PARAM_MEMBER); - if (isMember) { + boolean onlyMembershipOrganizations = request.mandatoryParamAsBoolean(PARAM_MEMBER); + if (onlyMembershipOrganizations) { userSession.checkLoggedIn(); } @@ -108,7 +110,10 @@ public class SearchAction implements OrganizationsWsAction { Set<String> provisionOrganizationUuids = searchOrganizationWithProvisionPermission(dbSession); Map<String, OrganizationAlmBindingDto> organizationAlmBindingByOrgUuid = dbClient.organizationAlmBindingDao().selectByOrganizations(dbSession, organizations) .stream().collect(MoreCollectors.uniqueIndex(OrganizationAlmBindingDto::getOrganizationUuid)); - writeResponse(request, response, organizations, adminOrganizationUuids, provisionOrganizationUuids, organizationAlmBindingByOrgUuid, paging); + + Organizations.SearchWsResponse wsResponse = buildOrganizations(organizations, adminOrganizationUuids, provisionOrganizationUuids, organizationAlmBindingByOrgUuid, + onlyMembershipOrganizations, paging); + writeProtobuf(wsResponse, request, response); } } @@ -131,10 +136,8 @@ public class SearchAction implements OrganizationsWsAction { : dbClient.organizationDao().selectByPermission(dbSession, userId, PROVISION_PROJECTS.getKey()).stream().map(OrganizationDto::getUuid).collect(toSet()); } - private void writeResponse(Request httpRequest, Response httpResponse, List<OrganizationDto> organizations, - Set<String> adminOrganizationUuids, Set<String> provisionOrganizationUuids, - Map<String, OrganizationAlmBindingDto> organizationAlmBindingByOrgUuid, - Paging paging) { + private Organizations.SearchWsResponse buildOrganizations(List<OrganizationDto> organizations, Set<String> adminOrganizationUuids, Set<String> provisionOrganizationUuids, + Map<String, OrganizationAlmBindingDto> organizationAlmBindingByOrgUuid, boolean onlyMembershipOrganizations, Paging paging) { Organizations.SearchWsResponse.Builder response = Organizations.SearchWsResponse.newBuilder(); response.setPaging(paging); Organization.Builder wsOrganization = Organization.newBuilder(); @@ -147,12 +150,13 @@ public class SearchAction implements OrganizationsWsAction { .setAdmin(isAdmin) .setProvision(canProvision) .setDelete(o.isGuarded() ? userSession.isRoot() : isAdmin)); - response.addOrganizations(toOrganization(wsOrganization, o, organizationAlmBindingByOrgUuid.get(o.getUuid()))); + response.addOrganizations(toOrganization(wsOrganization, o, organizationAlmBindingByOrgUuid.get(o.getUuid()), onlyMembershipOrganizations)); }); - writeProtobuf(response.build(), httpRequest, httpResponse); + return response.build(); } - private static Organization.Builder toOrganization(Organization.Builder builder, OrganizationDto organization, @Nullable OrganizationAlmBindingDto organizationAlmBinding) { + private static Organization.Builder toOrganization(Organization.Builder builder, OrganizationDto organization, @Nullable OrganizationAlmBindingDto organizationAlmBinding, + boolean onlyMembershipOrganizations) { builder .setName(organization.getName()) .setKey(organization.getKey()) @@ -165,6 +169,9 @@ public class SearchAction implements OrganizationsWsAction { .setKey(organizationAlmBinding.getAlm().getId()) .setUrl(organizationAlmBinding.getUrl())); } + if (onlyMembershipOrganizations) { + builder.setSubscription(Organizations.Subscription.valueOf(organization.getSubscription().name())); + } return builder; } diff --git a/server/sonar-server/src/test/java/org/sonar/server/organization/ws/SearchActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/organization/ws/SearchActionTest.java index 94cfe88ccb4..f3ad38c2e87 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/organization/ws/SearchActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/organization/ws/SearchActionTest.java @@ -43,6 +43,7 @@ import org.sonar.server.ws.TestRequest; import org.sonar.server.ws.WsActionTester; import org.sonarqube.ws.Common.Paging; import org.sonarqube.ws.MediaTypes; +import org.sonarqube.ws.Organizations; import org.sonarqube.ws.Organizations.Organization; import org.sonarqube.ws.Organizations.SearchWsResponse; @@ -275,6 +276,45 @@ public class SearchActionTest { } @Test + public void return_subscription_info_when_member_parameter_is_set_to_true() { + UserDto user = db.users().insertUser(); + OrganizationDto organization1 = db.organizations().insert(o -> o.setSubscription(FREE)); + OrganizationDto organization2 = db.organizations().insert(o -> o.setSubscription(PAID)); + OrganizationDto organization3 = db.organizations().insert(o -> o.setSubscription(PAID)); + db.organizations().addMember(organization1, user); + db.organizations().addMember(organization2, user); + userSession.logIn(user); + + SearchWsResponse result = call(ws.newRequest().setParam("member", "true")); + + assertThat(result.getOrganizationsList()) + .extracting(Organization::getKey, Organization::getSubscription) + .containsExactlyInAnyOrder( + tuple(organization1.getKey(), Organizations.Subscription.FREE), + tuple(organization2.getKey(), Organizations.Subscription.PAID)); + } + + @Test + public void subscription_info_is_not_returned_when_no_member_parameter() { + UserDto user = db.users().insertUser(); + OrganizationDto organization1 = db.organizations().insert(o -> o.setSubscription(FREE)); + OrganizationDto organization2 = db.organizations().insert(o -> o.setSubscription(PAID)); + OrganizationDto organization3 = db.organizations().insert(o -> o.setSubscription(PAID)); + db.organizations().addMember(organization1, user); + db.organizations().addMember(organization2, user); + userSession.logIn(user); + + SearchWsResponse result = call(ws.newRequest()); + + assertThat(result.getOrganizationsList()) + .extracting(Organization::getKey, Organization::hasSubscription) + .containsExactlyInAnyOrder( + tuple(organization1.getKey(), false), + tuple(organization2.getKey(), false), + tuple(organization3.getKey(), false)); + } + + @Test public void request_on_empty_db_returns_an_empty_organization_list() { assertThat(executeRequestAndReturnList(null, null)).isEmpty(); assertThat(executeRequestAndReturnList(null, 1)).isEmpty(); diff --git a/sonar-ws/src/main/protobuf/ws-organizations.proto b/sonar-ws/src/main/protobuf/ws-organizations.proto index 2480af54904..cf51e3c9b90 100644 --- a/sonar-ws/src/main/protobuf/ws-organizations.proto +++ b/sonar-ws/src/main/protobuf/ws-organizations.proto @@ -62,6 +62,7 @@ message Organization { optional bool guarded = 6; optional Alm alm = 8; optional Actions actions = 9; + optional Subscription subscription = 10; message Alm { optional string key = 1; @@ -81,3 +82,15 @@ message User { optional string avatar = 3; optional int32 groupCount = 4; } + + +// See org.sonar.db.organization.OrganizationDto.Subscription +enum Subscription { + // Zero is required in order to not get LONG as default value + // See http://androiddevblog.com/protocol-buffers-pitfall-adding-enum-values/ + UNKNOWN = 0; + + SONARQUBE = 1; + FREE = 2; + PAID = 3; +} |