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

import org.sonarqube.ws.Organizations; import org.sonarqube.ws.Organizations;
import org.sonarqube.ws.Organizations.Organization; import org.sonarqube.ws.Organizations.Organization;


import static java.lang.String.format;
import static java.util.Collections.emptySet; import static java.util.Collections.emptySet;
import static org.sonar.core.util.Protobuf.setNullable; import static org.sonar.core.util.Protobuf.setNullable;
import static org.sonar.core.util.stream.MoreCollectors.toSet; import static org.sonar.core.util.stream.MoreCollectors.toSet;
.setResponseExample(getClass().getResource("search-example.json")) .setResponseExample(getClass().getResource("search-example.json"))
.setInternal(true) .setInternal(true)
.setSince("6.2") .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("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); .setHandler(this);


action.createParam(PARAM_ORGANIZATIONS) action.createParam(PARAM_ORGANIZATIONS)
action.createParam(PARAM_MEMBER) action.createParam(PARAM_MEMBER)
.setDescription("Filter organizations based on whether the authenticated user is a member. If false, no filter applies.") .setDescription("Filter organizations based on whether the authenticated user is a member. If false, no filter applies.")
.setSince("7.0") .setSince("7.0")
.setDefaultValue(String.valueOf(false))
.setDefaultValue("false")
.setBooleanPossibleValues(); .setBooleanPossibleValues();


action.addPagingParams(100, MAX_SIZE); action.addPagingParams(100, MAX_SIZE);


@Override @Override
public void handle(Request request, Response response) throws Exception { 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(); userSession.checkLoggedIn();
} }


Set<String> provisionOrganizationUuids = searchOrganizationWithProvisionPermission(dbSession); Set<String> provisionOrganizationUuids = searchOrganizationWithProvisionPermission(dbSession);
Map<String, OrganizationAlmBindingDto> organizationAlmBindingByOrgUuid = dbClient.organizationAlmBindingDao().selectByOrganizations(dbSession, organizations) Map<String, OrganizationAlmBindingDto> organizationAlmBindingByOrgUuid = dbClient.organizationAlmBindingDao().selectByOrganizations(dbSession, organizations)
.stream().collect(MoreCollectors.uniqueIndex(OrganizationAlmBindingDto::getOrganizationUuid)); .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);
} }
} }


: dbClient.organizationDao().selectByPermission(dbSession, userId, PROVISION_PROJECTS.getKey()).stream().map(OrganizationDto::getUuid).collect(toSet()); : 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(); Organizations.SearchWsResponse.Builder response = Organizations.SearchWsResponse.newBuilder();
response.setPaging(paging); response.setPaging(paging);
Organization.Builder wsOrganization = Organization.newBuilder(); Organization.Builder wsOrganization = Organization.newBuilder();
.setAdmin(isAdmin) .setAdmin(isAdmin)
.setProvision(canProvision) .setProvision(canProvision)
.setDelete(o.isGuarded() ? userSession.isRoot() : isAdmin)); .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 builder
.setName(organization.getName()) .setName(organization.getName())
.setKey(organization.getKey()) .setKey(organization.getKey())
.setKey(organizationAlmBinding.getAlm().getId()) .setKey(organizationAlmBinding.getAlm().getId())
.setUrl(organizationAlmBinding.getUrl())); .setUrl(organizationAlmBinding.getUrl()));
} }
if (onlyMembershipOrganizations) {
builder.setSubscription(Organizations.Subscription.valueOf(organization.getSubscription().name()));
}
return builder; return builder;
} }



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

import org.sonar.server.ws.WsActionTester; import org.sonar.server.ws.WsActionTester;
import org.sonarqube.ws.Common.Paging; import org.sonarqube.ws.Common.Paging;
import org.sonarqube.ws.MediaTypes; import org.sonarqube.ws.MediaTypes;
import org.sonarqube.ws.Organizations;
import org.sonarqube.ws.Organizations.Organization; import org.sonarqube.ws.Organizations.Organization;
import org.sonarqube.ws.Organizations.SearchWsResponse; import org.sonarqube.ws.Organizations.SearchWsResponse;


assertThat(orgByKey.get(organizationNotBoundToAlm.getKey()).hasAlm()).isEqualTo(false); 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 @Test
public void request_on_empty_db_returns_an_empty_organization_list() { public void request_on_empty_db_returns_an_empty_organization_list() {
assertThat(executeRequestAndReturnList(null, null)).isEmpty(); assertThat(executeRequestAndReturnList(null, null)).isEmpty();

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

optional bool guarded = 6; optional bool guarded = 6;
optional Alm alm = 8; optional Alm alm = 8;
optional Actions actions = 9; optional Actions actions = 9;
optional Subscription subscription = 10;


message Alm { message Alm {
optional string key = 1; optional string key = 1;
optional string avatar = 3; optional string avatar = 3;
optional int32 groupCount = 4; 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