.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)));
.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();
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)) {
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 {
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;
.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
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());
}
@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)
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;
.setExternalIdentity("obiwan")
.setExternalIdentityProvider("sonarqube")
.setScmAccounts(newArrayList("obiwan:github", "obiwan:bitbucket"))
- .setOnboarded(false)
- .setHomepageType("MY_PROJECTS"));
+ .setOnboarded(false));
userSessionRule.logIn("obiwan.kenobi");
CurrentWsResponse response = call();
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
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"));
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();
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;
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 {
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();
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'");
@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);
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();
optional HomepageType type = 1;
optional string component = 2;
optional string organization = 3;
+ optional string branch = 4;
}
}