Browse Source

SONARCLOUD-176 Return subscription in api/organizations/search

tags/7.5
Julien Lancelot 5 years ago
parent
commit
d195a425db

+ 19
- 12
server/sonar-server/src/main/java/org/sonar/server/organization/ws/SearchAction.java View File

@@ -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;
}


+ 40
- 0
server/sonar-server/src/test/java/org/sonar/server/organization/ws/SearchActionTest.java View File

@@ -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;

@@ -274,6 +275,45 @@ public class SearchActionTest {
assertThat(orgByKey.get(organizationNotBoundToAlm.getKey()).hasAlm()).isEqualTo(false);
}

@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();

+ 13
- 0
sonar-ws/src/main/protobuf/ws-organizations.proto View File

@@ -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;
}

Loading…
Cancel
Save