@@ -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)) { |
@@ -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) |
@@ -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(); | |||
@@ -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(); |
@@ -125,5 +125,6 @@ message CurrentWsResponse { | |||
optional HomepageType type = 1; | |||
optional string component = 2; | |||
optional string organization = 3; | |||
optional string branch = 4; | |||
} | |||
} |