aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJulien Lancelot <julien.lancelot@sonarsource.com>2018-11-27 12:14:43 +0100
committerSonarTech <sonartech@sonarsource.com>2018-12-07 20:21:05 +0100
commitd195a425dbd02415f1b90ab9a813c8aa8ec87cde (patch)
tree51c7449a620cf1e4ae5725a303b1d6f53b12337f
parentdd75a693f2c7160957eeed54be9151a04a75d0c4 (diff)
downloadsonarqube-d195a425dbd02415f1b90ab9a813c8aa8ec87cde.tar.gz
sonarqube-d195a425dbd02415f1b90ab9a813c8aa8ec87cde.zip
SONARCLOUD-176 Return subscription in api/organizations/search
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/organization/ws/SearchAction.java31
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/organization/ws/SearchActionTest.java40
-rw-r--r--sonar-ws/src/main/protobuf/ws-organizations.proto13
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;
+}