From 0c6a97c1ed07db396062b3cadaff94db5bfcb419 Mon Sep 17 00:00:00 2001 From: Daniel Schwarz Date: Tue, 25 Apr 2017 11:27:11 +0200 Subject: [PATCH] =?utf8?q?SONAR-9107=20add=20=E2=80=9CprojectVisibility?= =?utf8?q?=E2=80=9D=20to=20api/navigation/organization?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../server/ui/ws/OrganizationAction.java | 12 ++++--- .../server/ui/ws/OrganizationActionTest.java | 34 ++++++++++++++----- 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/server/sonar-server/src/main/java/org/sonar/server/ui/ws/OrganizationAction.java b/server/sonar-server/src/main/java/org/sonar/server/ui/ws/OrganizationAction.java index a834d1c8372..61025dccae3 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/ui/ws/OrganizationAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/ui/ws/OrganizationAction.java @@ -22,6 +22,7 @@ package org.sonar.server.ui.ws; import java.util.List; import java.util.function.Consumer; import java.util.function.Predicate; +import org.sonar.api.server.ws.Change; import org.sonar.api.server.ws.Request; import org.sonar.api.server.ws.Response; import org.sonar.api.server.ws.WebService; @@ -63,7 +64,8 @@ public class OrganizationAction implements NavigationWsAction { .setHandler(this) .setInternal(true) .setResponseExample(getClass().getResource("organization-example.json")) - .setSince("6.3"); + .setSince("6.3") + .setChangelog(new Change("6.4", "The field 'projectVisibility' is added")); projectNavigation.createParam(PARAM_ORGANIZATION) .setRequired(true) @@ -78,22 +80,24 @@ public class OrganizationAction implements NavigationWsAction { OrganizationDto organization = checkFoundWithOptional( dbClient.organizationDao().selectByKey(dbSession, organizationKey), "No organization with key '%s'", organizationKey); + boolean newProjectPrivate = dbClient.organizationDao().getNewProjectPrivate(dbSession, organization); JsonWriter json = response.newJsonWriter(); json.beginObject(); - writeOrganization(json, organization); + writeOrganization(json, organization, newProjectPrivate); json.endObject() .close(); } } - private void writeOrganization(JsonWriter json, OrganizationDto organization) { + private void writeOrganization(JsonWriter json, OrganizationDto organization, boolean newProjectPrivate) { json.name("organization") .beginObject() .prop("canAdmin", userSession.hasPermission(OrganizationPermission.ADMINISTER, organization)) .prop("canProvisionProjects", userSession.hasPermission(OrganizationPermission.PROVISION_PROJECTS, organization)) .prop("canDelete", organization.isGuarded() ? userSession.isSystemAdministrator() : userSession.hasPermission(OrganizationPermission.ADMINISTER, organization)) - .prop("isDefault", organization.getKey().equals(defaultOrganizationProvider.get().getKey())); + .prop("isDefault", organization.getKey().equals(defaultOrganizationProvider.get().getKey())) + .prop("projectVisibility", newProjectPrivate ? "private" : "public"); Predicate personalOrgForBilling = page -> organization.getUserId() == null || !page.getKey().startsWith("billing/"); List pages = pageRepository.getOrganizationPages(false).stream().filter(personalOrgForBilling).collect(toList()); json.name("pages"); diff --git a/server/sonar-server/src/test/java/org/sonar/server/ui/ws/OrganizationActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/ui/ws/OrganizationActionTest.java index 813f070d5ab..19279a939bb 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/ui/ws/OrganizationActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/ui/ws/OrganizationActionTest.java @@ -23,6 +23,7 @@ import javax.annotation.Nullable; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; +import org.sonar.api.server.ws.Change; import org.sonar.api.server.ws.WebService; import org.sonar.api.utils.System2; import org.sonar.api.web.page.Page; @@ -40,6 +41,7 @@ import org.sonar.server.ws.TestResponse; import org.sonar.server.ws.WsActionTester; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.tuple; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -69,6 +71,8 @@ public class OrganizationActionTest { assertThat(def.isInternal()).isTrue(); assertThat(def.description()).isEqualTo("Get information concerning organization navigation for the current user"); assertThat(def.since()).isEqualTo("6.3"); + assertThat(def.changelog()).extracting(Change::getVersion, Change::getDescription).containsExactlyInAnyOrder( + tuple("6.4", "The field 'projectVisibility' is added")); assertThat(def.params()).hasSize(1); WebService.Param organization = def.param("organization"); @@ -89,8 +93,7 @@ public class OrganizationActionTest { public void json_example() { initWithPages( Page.builder("my-plugin/org-page").setName("Organization page").setScope(ORGANIZATION).build(), - Page.builder("my-plugin/org-admin-page").setName("Organization admin page").setScope(ORGANIZATION).setAdmin(true).build() - ); + Page.builder("my-plugin/org-admin-page").setName("Organization admin page").setScope(ORGANIZATION).setAdmin(true).build()); OrganizationDto organization = dbTester.organizations().insert(dto -> dto.setGuarded(true)); userSession.logIn() .addPermission(ADMINISTER, organization) @@ -106,8 +109,7 @@ public class OrganizationActionTest { public void filter_out_admin_pages_when_user_is_not_admin() { initWithPages( Page.builder("my-plugin/org-page").setName("Organization page").setScope(ORGANIZATION).build(), - Page.builder("my-plugin/org-admin-page").setName("Organization admin page").setScope(ORGANIZATION).setAdmin(true).build() - ); + Page.builder("my-plugin/org-admin-page").setName("Organization admin page").setScope(ORGANIZATION).setAdmin(true).build()); OrganizationDto organization = dbTester.organizations().insert(dto -> dto.setGuarded(true)); userSession.logIn() .addPermission(PROVISION_PROJECTS, organization); @@ -125,8 +127,7 @@ public class OrganizationActionTest { Page.builder("my-plugin/org-page").setName("Organization page").setScope(ORGANIZATION).build(), Page.builder("my-plugin/org-admin-page").setName("Organization admin page").setScope(ORGANIZATION).setAdmin(true).build(), Page.builder("billing/org-page").setName("Organization page").setScope(ORGANIZATION).build(), - Page.builder("billing/org-admin-page").setName("Organization admin page").setScope(ORGANIZATION).setAdmin(true).build() - ); + Page.builder("billing/org-admin-page").setName("Organization admin page").setScope(ORGANIZATION).setAdmin(true).build()); OrganizationDto organization = dbTester.organizations().insert(dto -> dto.setUserId(101)); userSession.logIn().addPermission(ADMINISTER, organization); @@ -142,8 +143,7 @@ public class OrganizationActionTest { public void include_billing_pages_for_non_personal_organizations() { initWithPages( Page.builder("billing/org-page").setName("Organization page").setScope(ORGANIZATION).build(), - Page.builder("billing/org-admin-page").setName("Organization admin page").setScope(ORGANIZATION).setAdmin(true).build() - ); + Page.builder("billing/org-admin-page").setName("Organization admin page").setScope(ORGANIZATION).setAdmin(true).build()); OrganizationDto organization = dbTester.organizations().insert(dto -> dto.setUserId(null)); userSession.logIn().addPermission(ADMINISTER, organization); @@ -238,6 +238,24 @@ public class OrganizationActionTest { verifyResponse(executeRequest(org2), false, true, false); } + @Test + public void returns_project_visibility_private() { + OrganizationDto organization = dbTester.organizations().insert(); + dbClient.organizationDao().setNewProjectPrivate(dbTester.getSession(), organization, true); + dbTester.commit(); + userSession.logIn().addPermission(PROVISION_PROJECTS, organization); + assertJson(executeRequest(organization).getInput()).isSimilarTo("{\"organization\": {\"projectVisibility\": \"private\"}}"); + } + + @Test + public void returns_project_visibility_public() { + OrganizationDto organization = dbTester.organizations().insert(); + dbClient.organizationDao().setNewProjectPrivate(dbTester.getSession(), organization, false); + dbTester.commit(); + userSession.logIn().addPermission(PROVISION_PROJECTS, organization); + assertJson(executeRequest(organization).getInput()).isSimilarTo("{\"organization\": {\"projectVisibility\": \"public\"}}"); + } + private void initWithPages(Page... pages) { PluginRepository pluginRepository = mock(PluginRepository.class); when(pluginRepository.hasPlugin(anyString())).thenReturn(true); -- 2.39.5