]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-10182 Clean homepage when deleting an organization
authorGuillaume Jambet <guillaume.jambet@sonarsource.com>
Tue, 19 Dec 2017 15:16:28 +0000 (16:16 +0100)
committerStas Vilchik <stas.vilchik@sonarsource.com>
Tue, 2 Jan 2018 09:38:10 +0000 (10:38 +0100)
server/sonar-db-dao/src/main/java/org/sonar/db/user/UserDao.java
server/sonar-db-dao/src/main/java/org/sonar/db/user/UserMapper.java
server/sonar-db-dao/src/main/resources/org/sonar/db/user/UserMapper.xml
server/sonar-db-dao/src/test/java/org/sonar/db/user/UserDaoTest.java
server/sonar-server/src/main/java/org/sonar/server/organization/ws/DeleteAction.java
server/sonar-server/src/test/java/org/sonar/server/organization/ws/DeleteActionTest.java

index 49a6bd9eff634e7f8a3021a1a6912fd8f2438cf5..dcd27b2b809468a05973e510d93f7bde51490824 100644 (file)
@@ -35,6 +35,7 @@ import org.sonar.api.utils.System2;
 import org.sonar.db.Dao;
 import org.sonar.db.DbSession;
 import org.sonar.db.RowNotFoundException;
+import org.sonar.db.organization.OrganizationDto;
 
 import static org.sonar.db.DatabaseUtils.executeLargeInputs;
 import static org.sonar.db.DatabaseUtils.executeLargeInputsWithoutOutput;
@@ -121,6 +122,10 @@ public class UserDao implements Dao {
     mapper(dbSession).deactivateUser(user.getLogin(), system2.now());
   }
 
+  public void cleanHomepage(DbSession dbSession, OrganizationDto organization) {
+    mapper(dbSession).clearHomepage("ORGANIZATION", organization.getUuid(), system2.now());
+  }
+
   @CheckForNull
   public UserDto selectByLogin(DbSession session, String login) {
     return mapper(session).selectByLogin(login);
index a894164aa042180fe3d223ab00186f8d796fd34a..f9fddb00f991d3ff5963be072b6f2b2094776ab1 100644 (file)
@@ -69,4 +69,5 @@ public interface UserMapper {
 
   void deactivateUser(@Param("login") String login, @Param("now") long now);
 
+  void clearHomepage(@Param("homepageType") String type, @Param("homepageValue") String value, @Param("now") long now);
 }
index 7e16d4ef582a68103fbb66a90387b1732bf9afb6..db7e23a5b5776e9777fa4619261e95e87c9d9204 100644 (file)
       login = #{login, jdbcType=VARCHAR}
   </update>
 
+  <update id="clearHomepage" parameterType="map">
+    update users set
+      homepage_type = null,
+      homepage_value = null,
+      updated_at = #{now, jdbcType=BIGINT}
+    where
+      homepage_type = #{homepageType, jdbcType=VARCHAR}
+      and homepage_value = #{homepageValue, jdbcType=VARCHAR}
+  </update>
+
   <update id="setRoot">
     update users set
       is_root = #{root, jdbcType=BOOLEAN},
index 448b17a408669f78e65ebbe6faee819e10bbc01e..779a3bfdab227efe384c1503c48c9db9ee63f836 100644 (file)
@@ -34,6 +34,7 @@ import org.sonar.db.DbClient;
 import org.sonar.db.DbSession;
 import org.sonar.db.DbTester;
 import org.sonar.db.RowNotFoundException;
+import org.sonar.db.organization.OrganizationDto;
 
 import static java.util.Arrays.asList;
 import static java.util.Collections.emptyList;
@@ -416,6 +417,30 @@ public class UserDaoTest {
     assertThat(underTest.selectUserById(session, otherUser.getId())).isNotNull();
   }
 
+  @Test
+  public void clean_users_homepage() {
+
+    UserDto userUnderTest = newUserDto().setHomepageType("ORGANIZATION").setHomepageValue("dummy-organization-UUID");
+    underTest.insert(session, userUnderTest);
+
+    UserDto untouchedUser = newUserDto().setHomepageType("ORGANIZATION").setHomepageValue("not-so-dummy-organization-UUID");
+    underTest.insert(session, untouchedUser);
+
+    session.commit();
+
+    underTest.cleanHomepage(session, new OrganizationDto().setUuid("dummy-organization-UUID"));
+
+    UserDto userWithAHomepageReloaded = underTest.selectUserById(session, userUnderTest.getId());
+    assertThat(userWithAHomepageReloaded.getUpdatedAt()).isEqualTo(NOW);
+    assertThat(userWithAHomepageReloaded.getHomepageType()).isNull();
+    assertThat(userWithAHomepageReloaded.getHomepageValue()).isNull();
+
+    UserDto untouchedUserReloaded = underTest.selectUserById(session, untouchedUser.getId());
+    assertThat(untouchedUserReloaded.getUpdatedAt()).isEqualTo(untouchedUser.getUpdatedAt());
+    assertThat(untouchedUserReloaded.getHomepageType()).isEqualTo(untouchedUser.getHomepageType());
+    assertThat(untouchedUserReloaded.getHomepageValue()).isEqualTo(untouchedUser.getHomepageValue());
+  }
+
   @Test
   public void does_not_fail_to_deactivate_missing_user() {
     underTest.deactivateUser(session, UserTesting.newUserDto());
index 9a3bd8b79d8506f2f892c5a820739c44c5bc1cdc..e9eb145eda7e9b645b01954359c3b2b3e531dec9 100644 (file)
@@ -150,6 +150,7 @@ public class DeleteAction implements OrganizationsWsAction {
     Collection<String> logins = dbClient.organizationMemberDao().selectLoginsByOrganizationUuid(dbSession, organization.getUuid());
     dbClient.organizationMemberDao().deleteByOrganizationUuid(dbSession, organization.getUuid());
     dbClient.organizationDao().deleteByUuid(dbSession, organization.getUuid());
+    dbClient.userDao().cleanHomepage(dbSession, organization);
     userIndexer.commitAndIndexByLogins(dbSession, logins);
   }
 
index 31c33ec135d616de389f1ff33adbee6afb36f4cf..bdb27b8e588293c3cca120ff51049ba379f09752 100644 (file)
@@ -68,6 +68,7 @@ import static org.sonar.api.resources.Qualifiers.APP;
 import static org.sonar.api.resources.Qualifiers.PROJECT;
 import static org.sonar.api.resources.Qualifiers.VIEW;
 import static org.sonar.db.permission.OrganizationPermission.ADMINISTER;
+import static org.sonar.db.user.UserTesting.newUserDto;
 import static org.sonar.server.organization.ws.OrganizationsWsSupport.PARAM_ORGANIZATION;
 
 public class DeleteActionTest {
@@ -91,7 +92,8 @@ public class DeleteActionTest {
   private UserIndex userIndex = new UserIndex(es.client(), System2.INSTANCE);
   private UserIndexer userIndexer = new UserIndexer(dbClient, es.client());
   private QualityGateFinder qualityGateFinder = new QualityGateFinder(dbClient);
-  private WsActionTester wsTester = new WsActionTester(new DeleteAction(userSession, dbClient, defaultOrganizationProvider, componentCleanerService, organizationFlags, userIndexer, qProfileFactory));
+  private WsActionTester wsTester = new WsActionTester(
+    new DeleteAction(userSession, dbClient, defaultOrganizationProvider, componentCleanerService, organizationFlags, userIndexer, qProfileFactory));
 
   @Test
   public void test_definition() {
@@ -112,6 +114,42 @@ public class DeleteActionTest {
       .matches(param -> "Organization key".equals(param.description()));
   }
 
+  @Test
+  public void organization_deletion_also_ensure_that_homepage_on_this_organization_if_it_exists_is_cleared() throws Exception {
+    OrganizationDto organization = db.organizations().insert();
+    UserDto user = dbClient.userDao().insert(session, newUserDto().setHomepageType("ORGANIZATION").setHomepageValue(organization.getUuid()));
+    session.commit();
+
+    userSession.logIn().addPermission(ADMINISTER, organization);
+
+    wsTester.newRequest()
+      .setParam(PARAM_ORGANIZATION, organization.getKey())
+      .execute();
+
+    UserDto userReloaded = dbClient.userDao().selectUserById(session, user.getId());
+    assertThat(userReloaded.getHomepageType()).isNull();
+    assertThat(userReloaded.getHomepageValue()).isNull();
+  }
+
+  @Test
+  public void organization_deletion_also_ensure_that_homepage_on_project_belonging_to_this_organization_if_it_exists_is_cleared() {
+    OrganizationDto organization = db.organizations().insert();
+    ComponentDto project = db.components().insertPrivateProject(organization);
+    UserDto user = dbClient.userDao().insert(session,
+      newUserDto().setHomepageType("PROJECT").setHomepageValue(project.uuid()));
+    session.commit();
+
+    userSession.logIn().addPermission(ADMINISTER, organization);
+
+    wsTester.newRequest()
+      .setParam(PARAM_ORGANIZATION, organization.getKey())
+      .execute();
+
+    UserDto userReloaded = dbClient.userDao().selectUserById(session, user.getId());
+    assertThat(userReloaded.getHomepageType()).isNull();
+    assertThat(userReloaded.getHomepageValue()).isNull();
+  }
+
   @Test
   public void fail_with_IllegalStateException_if_organization_support_is_disabled() {
     organizationFlags.setEnabled(false);