Skip to content

Commit

Permalink
SONAR-10948 Move UpdateProjectVisibility
Browse files Browse the repository at this point in the history
from api/organizations to api/projects
  • Loading branch information
ehartmann authored and SonarTech committed Jul 11, 2018
1 parent 884cd78 commit 4dacc25
Show file tree
Hide file tree
Showing 10 changed files with 183 additions and 240 deletions.
Expand Up @@ -40,9 +40,8 @@ protected void configureModule() {
OrganizationsWsSupport.class,
// actions
SearchAction.class,
SearchMembersAction.class,
// Update of project visibility is used on on-premise instances, not only on SonarCloud / Organizations
UpdateProjectVisibilityAction.class);
SearchMembersAction.class);

if (config.getBoolean(SONARCLOUD_ENABLED.getKey()).orElse(false)) {
add(
OrganisationSupport.class,
Expand Down
Expand Up @@ -19,11 +19,19 @@
*/
package org.sonar.server.project.ws;

import org.sonar.api.config.Configuration;
import org.sonar.core.platform.Module;
import org.sonar.process.ProcessProperties;
import org.sonar.server.project.ProjectLifeCycleListenersImpl;

public class ProjectsWsModule extends Module {

private final Configuration configuration;

public ProjectsWsModule(Configuration configuration) {
this.configuration = configuration;
}

@Override
protected void configureModule() {
add(
Expand All @@ -41,5 +49,10 @@ protected void configureModule() {
SearchMyProjectsAction.class,
SearchAction.class,
UpdateVisibilityAction.class);

if (!configuration.getBoolean(ProcessProperties.Property.SONARCLOUD_ENABLED.getKey()).orElse(false)) {
// Updating default visibility is not available in SonarCloud
add(UpdateDefaultVisibilityAction.class);
}
}
}
Expand Up @@ -17,52 +17,48 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.sonar.server.organization.ws;
package org.sonar.server.project.ws;

import java.util.Optional;
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;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.organization.OrganizationDto;
import org.sonar.db.permission.OrganizationPermission;
import org.sonar.server.organization.BillingValidations;
import org.sonar.server.organization.BillingValidationsProxy;
import org.sonar.server.organization.DefaultOrganizationProvider;
import org.sonar.server.project.Visibility;
import org.sonar.server.user.UserSession;

import static org.sonar.server.organization.ws.OrganizationsWsSupport.PARAM_ORGANIZATION;
import static org.sonar.server.user.AbstractUserSession.insufficientPrivilegesException;
import static org.sonar.server.ws.WsUtils.checkFoundWithOptional;

public class UpdateProjectVisibilityAction implements OrganizationsWsAction {
static final String ACTION = "update_project_visibility";
public class UpdateDefaultVisibilityAction implements ProjectsWsAction {
static final String ACTION = "update_default_visibility";
static final String PARAM_PROJECT_VISIBILITY = "projectVisibility";

private final UserSession userSession;
private final DbClient dbClient;
private final BillingValidationsProxy billingValidations;
private final DefaultOrganizationProvider defaultOrganizationProvider;

public UpdateProjectVisibilityAction(UserSession userSession, DbClient dbClient, BillingValidationsProxy billingValidations) {
public UpdateDefaultVisibilityAction(UserSession userSession, DbClient dbClient, DefaultOrganizationProvider defaultOrganizationProvider) {
this.userSession = userSession;
this.dbClient = dbClient;
this.billingValidations = billingValidations;
this.defaultOrganizationProvider = defaultOrganizationProvider;
}

@Override
public void define(WebService.NewController context) {
WebService.NewAction action = context.createAction(ACTION)
.setPost(true)
.setDescription("Update the default visibility for new projects of the specified organization.")
.setDescription("Update the default visibility for new projects.<br/>Requires System Administrator privileges")
.setChangelog(
new Change("7.3", "This WS used to be located at /api/organizations/update_project_visibility"))
.setInternal(true)
.setSince("6.4")
.setHandler(this);

action.createParam(PARAM_ORGANIZATION)
.setRequired(true)
.setDescription("Organization key")
.setExampleValue("foo-company");

action.createParam(PARAM_PROJECT_VISIBILITY)
.setRequired(true)
.setDescription("Default visibility for projects")
Expand All @@ -71,24 +67,17 @@ public void define(WebService.NewController context) {

@Override
public void handle(Request request, Response response) throws Exception {
String organizationKey = request.mandatoryParam(PARAM_ORGANIZATION);
boolean newProjectsPrivate = Visibility.isPrivate(request.mandatoryParam(PARAM_PROJECT_VISIBILITY));

try (DbSession dbSession = dbClient.openSession(false)) {
Optional<OrganizationDto> optionalOrganization = dbClient.organizationDao().selectByKey(dbSession, organizationKey);
OrganizationDto organization = checkFoundWithOptional(optionalOrganization, "No organization with key '" + organizationKey + "' can be found.");
userSession.checkPermission(OrganizationPermission.ADMINISTER, organization.getUuid());
checkCanUpdateProjectsVisibility(organization, newProjectsPrivate);
Optional<OrganizationDto> optionalOrganization = dbClient.organizationDao().selectByKey(dbSession, defaultOrganizationProvider.get().getKey());
OrganizationDto organization = checkFoundWithOptional(optionalOrganization, "No default organization.");
if (!userSession.isSystemAdministrator()) {
throw insufficientPrivilegesException();
}
dbClient.organizationDao().setNewProjectPrivate(dbSession, organization, newProjectsPrivate);
dbSession.commit();
}
response.noContent();
}

private void checkCanUpdateProjectsVisibility(OrganizationDto organization, boolean newProjectsPrivate) {
try {
billingValidations.checkCanUpdateProjectVisibility(new BillingValidations.Organization(organization.getKey(), organization.getUuid()), newProjectsPrivate);
} catch (BillingValidations.BillingValidationsException e) {
throw new IllegalArgumentException(e.getMessage());
}
}
}
Expand Up @@ -33,23 +33,23 @@ public class OrganizationsWsModuleTest {
private OrganizationsWsModule underTest = new OrganizationsWsModule(mapSettings.asConfig());

@Test
public void verify_component_count_when_not_on_sonar_cloud() {
public void verify_component_count_when_on_SonarQube() {
mapSettings.setProperty("sonar.sonarcloud.enabled", false);

underTest.configure(container);

assertThat(container.getPicoContainer().getComponentAdapters())
.hasSize(COMPONENTS_IN_EMPTY_COMPONENT_CONTAINER + 5);
.hasSize(COMPONENTS_IN_EMPTY_COMPONENT_CONTAINER + 4);
}

@Test
public void verify_component_count_when_on_sonar_cloud() {
public void verify_component_count_when_on_SonarCloud() {
mapSettings.setProperty("sonar.sonarcloud.enabled", true);

underTest.configure(container);

assertThat(container.getPicoContainer().getComponentAdapters())
.hasSize(COMPONENTS_IN_EMPTY_COMPONENT_CONTAINER + 12);
.hasSize(COMPONENTS_IN_EMPTY_COMPONENT_CONTAINER + 11);
}

}

This file was deleted.

Expand Up @@ -20,16 +20,32 @@
package org.sonar.server.project.ws;

import org.junit.Test;
import org.sonar.api.config.internal.ConfigurationBridge;
import org.sonar.api.config.internal.MapSettings;
import org.sonar.core.platform.ComponentContainer;
import org.sonar.process.ProcessProperties;

import static org.assertj.core.api.Assertions.assertThat;
import static org.sonar.core.platform.ComponentContainer.COMPONENTS_IN_EMPTY_COMPONENT_CONTAINER;

public class ProjectsWsModuleTest {

private MapSettings settings = new MapSettings();

@Test
public void verify_count_of_added_components_on_SonarQube() {
ComponentContainer container = new ComponentContainer();
new ProjectsWsModule(new ConfigurationBridge(settings)).configure(container);
assertThat(container.size()).isEqualTo(COMPONENTS_IN_EMPTY_COMPONENT_CONTAINER + 15);
}

@Test
public void verify_count_of_added_components() {
public void verify_count_of_added_components_on_SonarCloud() {
ComponentContainer container = new ComponentContainer();
new ProjectsWsModule().configure(container);
settings.setProperty(ProcessProperties.Property.SONARCLOUD_ENABLED.getKey(), true);

new ProjectsWsModule(new ConfigurationBridge(settings)).configure(container);
assertThat(container.size()).isEqualTo(COMPONENTS_IN_EMPTY_COMPONENT_CONTAINER + 14);
}

}

0 comments on commit 4dacc25

Please sign in to comment.