Browse Source

SONAR-10423 Add branch parameter in homepage of api/users WS

tags/7.5
Julien Lancelot 6 years ago
parent
commit
dfbb661fe6

+ 3
- 2
server/sonar-server/src/main/java/org/sonar/server/user/ws/CurrentAction.java View File

@@ -107,7 +107,7 @@ public class CurrentAction implements UsersWsAction {
.addAllGroups(groups)
.addAllScmAccounts(user.getScmAccountsAsList())
.setPermissions(Permissions.newBuilder().addAllGlobal(getGlobalPermissions()).build())
.setHomepage(findHomepageFor(dbSession, user))
.setHomepage(buildHomepage(dbSession, user))
.setShowOnboardingTutorial(!user.isOnboarded());
setNullable(emptyToNull(user.getEmail()), builder::setEmail);
setNullable(emptyToNull(user.getEmail()), u -> builder.setAvatar(avatarResolver.create(user)));
@@ -124,7 +124,7 @@ public class CurrentAction implements UsersWsAction {
.collect(toList());
}

private CurrentWsResponse.Homepage findHomepageFor(DbSession dbSession, UserDto user) {
private CurrentWsResponse.Homepage buildHomepage(DbSession dbSession, UserDto user) {
String homepageType = user.getHomepageType();
if (homepageType == null) {
return defaultHomepage();
@@ -143,6 +143,7 @@ public class CurrentAction implements UsersWsAction {
throw new IllegalStateException(format("Unknown component '%s' for homepageParameter", homepageParameter));
});
homepage.setComponent(component.getKey());
setNullable(component.getBranch(), homepage::setBranch);
return;
}
if (ORGANIZATION.toString().equals(homepageType)) {

+ 12
- 3
server/sonar-server/src/main/java/org/sonar/server/user/ws/SetHomepageAction.java View File

@@ -41,6 +41,7 @@ import static org.sonar.server.user.ws.HomepageType.ORGANIZATION;
import static org.sonar.server.user.ws.HomepageType.PROJECT;
import static org.sonar.server.user.ws.HomepageType.keys;
import static org.sonar.server.user.ws.HomepageType.valueOf;
import static org.sonar.server.ws.KeyExamples.KEY_BRANCH_EXAMPLE_001;
import static org.sonar.server.ws.KeyExamples.KEY_PROJECT_EXAMPLE_001;

public class SetHomepageAction implements UsersWsAction {
@@ -50,6 +51,7 @@ public class SetHomepageAction implements UsersWsAction {
private static final String PARAM_TYPE = "type";
private static final String PARAM_ORGANIZATION = "organization";
private static final String PARAM_COMPONENT = "component";
private static final String PARAM_BRANCH = "branch";

private final UserSession userSession;
private final DbClient dbClient;
@@ -87,6 +89,12 @@ public class SetHomepageAction implements UsersWsAction {
.setSince("7.1")
.setDescription("Project key. It should only be used when parameter '%s' is set to '%s'", PARAM_TYPE, PROJECT)
.setExampleValue(KEY_PROJECT_EXAMPLE_001);

action.createParam(PARAM_BRANCH)
.setDescription("Branch key. It can only be used when parameter '%s' is set to '%s'", PARAM_TYPE, PROJECT)
.setExampleValue(KEY_BRANCH_EXAMPLE_001)
.setInternal(true)
.setSince("7.1");
}

@Override
@@ -97,7 +105,7 @@ public class SetHomepageAction implements UsersWsAction {
String organizationParameter = request.param(PARAM_ORGANIZATION);

try (DbSession dbSession = dbClient.openSession(false)) {
String parameter = getHomepageParameter(dbSession, type, componentParameter, organizationParameter);
String parameter = getHomepageParameter(dbSession, type, componentParameter, request.param(PARAM_BRANCH), organizationParameter);

UserDto user = dbClient.userDao().selectActiveUserByLogin(dbSession, userSession.getLogin());
checkState(user != null, "User login '%s' cannot be found", userSession.getLogin());
@@ -112,11 +120,12 @@ public class SetHomepageAction implements UsersWsAction {
}

@CheckForNull
private String getHomepageParameter(DbSession dbSession, HomepageType type, @Nullable String componentParameter, @Nullable String organizationParameter) {
private String getHomepageParameter(DbSession dbSession, HomepageType type, @Nullable String componentParameter, @Nullable String branchParameter,
@Nullable String organizationParameter) {
switch (type) {
case PROJECT:
checkArgument(isNotBlank(componentParameter), "Type %s requires a parameter '%s'", type.name(), PARAM_COMPONENT);
return componentFinder.getByKey(dbSession, componentParameter).uuid();
return componentFinder.getByKeyAndOptionalBranch(dbSession, componentParameter, branchParameter).uuid();
case ORGANIZATION:
checkArgument(isNotBlank(organizationParameter), "Type %s requires a parameter '%s'", type.name(), PARAM_ORGANIZATION);
return dbClient.organizationDao().selectByKey(dbSession, organizationParameter)

+ 42
- 8
server/sonar-server/src/test/java/org/sonar/server/user/ws/CurrentActionTest.java View File

@@ -26,6 +26,7 @@ import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.System2;
import org.sonar.db.DbClient;
import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.user.UserDto;
import org.sonar.server.issue.ws.AvatarResolverImpl;
import org.sonar.server.organization.DefaultOrganizationProvider;
@@ -66,8 +67,7 @@ public class CurrentActionTest {
.setExternalIdentity("obiwan")
.setExternalIdentityProvider("sonarqube")
.setScmAccounts(newArrayList("obiwan:github", "obiwan:bitbucket"))
.setOnboarded(false)
.setHomepageType("MY_PROJECTS"));
.setOnboarded(false));
userSessionRule.logIn("obiwan.kenobi");

CurrentWsResponse response = call();
@@ -78,11 +78,6 @@ public class CurrentActionTest {
CurrentWsResponse::getExternalIdentity, CurrentWsResponse::getExternalProvider, CurrentWsResponse::getScmAccountsList, CurrentWsResponse::getShowOnboardingTutorial)
.containsExactly(true, "obiwan.kenobi", "Obiwan Kenobi", "obiwan.kenobi@starwars.com", "f5aa64437a1821ffe8b563099d506aef", true, "obiwan", "sonarqube",
newArrayList("obiwan:github", "obiwan:bitbucket"), true);

assertThat(response.getHomepage()).isNotNull();
assertThat(response.getHomepage()).extracting(CurrentWsResponse.Homepage::getType)
.containsExactly(MY_PROJECTS);

}

@Test
@@ -149,6 +144,45 @@ public class CurrentActionTest {
assertThat(response.getPermissions().getGlobalList()).containsOnly("profileadmin", "scan");
}

@Test
public void return_homepage_when_set_to_MY_PROJECTS() {
UserDto user = db.users().insertUser(u -> u.setHomepageType("MY_PROJECTS"));
userSessionRule.logIn(user);

CurrentWsResponse response = call();

assertThat(response.getHomepage())
.extracting(CurrentWsResponse.Homepage::getType)
.containsExactly(MY_PROJECTS);
}

@Test
public void return_homepage_when_set_to_a_project() {
ComponentDto project = db.components().insertPrivateProject();
UserDto user = db.users().insertUser(u -> u.setHomepageType("PROJECT").setHomepageParameter(project.uuid()));
userSessionRule.logIn(user);

CurrentWsResponse response = call();

assertThat(response.getHomepage())
.extracting(CurrentWsResponse.Homepage::getType, CurrentWsResponse.Homepage::getComponent)
.containsExactly(CurrentWsResponse.HomepageType.PROJECT, project.getKey());
}

@Test
public void return_homepage_when_set_to_a_branch() {
ComponentDto project = db.components().insertMainBranch();
ComponentDto branch = db.components().insertProjectBranch(project);
UserDto user = db.users().insertUser(u -> u.setHomepageType("PROJECT").setHomepageParameter(branch.uuid()));
userSessionRule.logIn(user);

CurrentWsResponse response = call();

assertThat(response.getHomepage())
.extracting(CurrentWsResponse.Homepage::getType, CurrentWsResponse.Homepage::getComponent, CurrentWsResponse.Homepage::getBranch)
.containsExactly(CurrentWsResponse.HomepageType.PROJECT, branch.getKey(), branch.getBranch());
}

@Test
public void fail_with_ISE_when_user_login_in_db_does_not_exist() {
db.users().insertUser(usert -> usert.setLogin("another"));
@@ -199,7 +233,7 @@ public class CurrentActionTest {
db.users().insertMember(db.users().insertGroup(newGroupDto().setName("Jedi")), obiwan);
db.users().insertMember(db.users().insertGroup(newGroupDto().setName("Rebel")), obiwan);

db.components().insertPublicProject(u->u.setUuid("UUID-of-the-death-star"), u->u.setDbKey("death-star-key"));
db.components().insertPublicProject(u -> u.setUuid("UUID-of-the-death-star"), u -> u.setDbKey("death-star-key"));

String response = ws.newRequest().execute().getInput();


+ 29
- 4
server/sonar-server/src/test/java/org/sonar/server/user/ws/SetHomepageActionTest.java View File

@@ -25,7 +25,6 @@ import org.junit.rules.ExpectedException;
import org.sonar.api.server.ws.WebService;
import org.sonar.db.DbClient;
import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDbTester;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.organization.OrganizationDto;
import org.sonar.db.user.UserDto;
@@ -37,7 +36,6 @@ import org.sonar.server.ws.WsActionTester;

import static org.apache.http.HttpStatus.SC_NO_CONTENT;
import static org.assertj.core.api.Assertions.assertThat;
import static org.sonar.db.component.ComponentTesting.newPrivateProjectDto;

public class SetHomepageActionTest {

@@ -64,7 +62,7 @@ public class SetHomepageActionTest {
assertThat(action.description()).isEqualTo("Set homepage of current user.<br> Requires authentication.");
assertThat(action.responseExample()).isNull();
assertThat(action.handler()).isSameAs(underTest);
assertThat(action.params()).hasSize(3);
assertThat(action.params()).hasSize(4);

WebService.Param typeParam = action.param("type");
assertThat(typeParam.isRequired()).isTrue();
@@ -76,6 +74,12 @@ public class SetHomepageActionTest {
assertThat(componentParam.description()).isEqualTo("Project key. It should only be used when parameter 'type' is set to 'PROJECT'");
assertThat(componentParam.since()).isEqualTo("7.1");

WebService.Param branchParam = action.param("branch");
assertThat(branchParam.isRequired()).isFalse();
assertThat(branchParam.isInternal()).isTrue();
assertThat(branchParam.description()).isEqualTo("Branch key. It can only be used when parameter 'type' is set to 'PROJECT'");
assertThat(branchParam.since()).isEqualTo("7.1");

WebService.Param organizationParam = action.param("organization");
assertThat(organizationParam.isRequired()).isFalse();
assertThat(organizationParam.description()).isEqualTo("Organization key. It should only be used when parameter 'type' is set to 'ORGANIZATION'");
@@ -85,7 +89,7 @@ public class SetHomepageActionTest {
@Test
public void set_project_homepage() {
OrganizationDto organization = db.organizations().insert();
ComponentDto project = new ComponentDbTester(db).insertComponent(newPrivateProjectDto(organization));
ComponentDto project = db.components().insertPrivateProject(organization);

UserDto user = db.users().insertUser();
userSession.logIn(user);
@@ -102,6 +106,27 @@ public class SetHomepageActionTest {
assertThat(actual.getHomepageParameter()).isEqualTo(project.uuid());
}

@Test
public void set_branch_homepage() {
OrganizationDto organization = db.organizations().insert();
ComponentDto project = db.components().insertMainBranch(organization);
ComponentDto branch = db.components().insertProjectBranch(project);
UserDto user = db.users().insertUser();
userSession.logIn(user);

ws.newRequest()
.setMethod("POST")
.setParam("type", "PROJECT")
.setParam("component", branch.getKey())
.setParam("branch", branch.getBranch())
.execute();

UserDto actual = db.getDbClient().userDao().selectByLogin(db.getSession(), user.getLogin());
assertThat(actual).isNotNull();
assertThat(actual.getHomepageType()).isEqualTo("PROJECT");
assertThat(actual.getHomepageParameter()).isEqualTo(branch.uuid());
}

@Test
public void set_organization_homepage() {
OrganizationDto organization = db.organizations().insert();

+ 1
- 0
sonar-ws/src/main/protobuf/ws-users.proto View File

@@ -125,5 +125,6 @@ message CurrentWsResponse {
optional HomepageType type = 1;
optional string component = 2;
optional string organization = 3;
optional string branch = 4;
}
}

Loading…
Cancel
Save