]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-10345 Ensure that no orphaned webhooks remains when deleting an organization...
authorGuillaume Jambet <guillaume.jambet@sonarsource.com>
Tue, 13 Feb 2018 16:11:00 +0000 (17:11 +0100)
committerGuillaume Jambet <guillaume.jambet@gmail.com>
Thu, 1 Mar 2018 14:21:05 +0000 (15:21 +0100)
server/sonar-db-dao/src/main/java/org/sonar/db/webhook/WebhookDao.java
server/sonar-db-dao/src/main/java/org/sonar/db/webhook/WebhookMapper.java
server/sonar-db-dao/src/main/resources/org/sonar/db/webhook/WebhookMapper.xml
server/sonar-db-dao/src/test/java/org/sonar/db/webhook/WebhookDaoTest.java
server/sonar-server/src/main/java/org/sonar/server/component/ComponentCleanerService.java
server/sonar-server/src/main/java/org/sonar/server/organization/ws/DeleteAction.java

index dd6c9300305aef1e49fce5ad165dcd32e6297ff7..9860570b3e2ba61767caffc5a60595d24f0f9c65 100644 (file)
@@ -72,4 +72,13 @@ public class WebhookDao implements Dao {
   private static WebhookMapper mapper(DbSession dbSession) {
     return dbSession.getMapper(WebhookMapper.class);
   }
+
+  public void cleanWebhooks(DbSession dbSession, OrganizationDto organization) {
+    mapper(dbSession).deleteForOrganizationUuid(organization.getUuid());
+  }
+
+  public void cleanWebhooks(DbSession dbSession, ComponentDto componentDto) {
+    mapper(dbSession).deleteForProjectUuid(componentDto.uuid());
+  }
+
 }
index 354f0d2de5df0b267c6b431bb3e358ec673101a8..870b032c09aeac07fee7aa339025c48b5c8cf804 100644 (file)
@@ -38,4 +38,7 @@ public interface WebhookMapper {
 
   void delete(@Param("uuid") String uuid);
 
+  void deleteForOrganizationUuid(@Param("organizationUuid") String organizationUuid);
+
+  void deleteForProjectUuid(@Param("projectUuid") String organizationUuid);
 }
index bdba2cdec540cf0f9c2713e421af36280e9c045d..c9cd317f8329f26934a5ec5239bca7dbd2ec2cb1 100644 (file)
     uuid = #{uuid,jdbcType=VARCHAR}
   </delete>
 
+  <delete id="deleteForOrganizationUuid" parameterType="String">
+    delete from webhooks
+    where
+    organization_uuid = #{organizationUuid,jdbcType=VARCHAR}
+  </delete>
+
+  <delete id="deleteForProjectUuid" parameterType="String">
+    delete from webhooks
+    where
+    project_uuid = #{projectUuid,jdbcType=VARCHAR}
+  </delete>
+
 </mapper>
index 2b16e6535eb472f914494acdc97277d8a238654d..3f7225700129e74801a1715dd829b5c476d6f01b 100644 (file)
@@ -28,6 +28,8 @@ import org.sonar.api.utils.System2;
 import org.sonar.db.DbClient;
 import org.sonar.db.DbSession;
 import org.sonar.db.DbTester;
+import org.sonar.db.component.ComponentDbTester;
+import org.sonar.db.component.ComponentDto;
 import org.sonar.db.organization.OrganizationDbTester;
 import org.sonar.db.organization.OrganizationDto;
 
@@ -47,8 +49,10 @@ public class WebhookDaoTest {
   private final DbSession dbSession = dbTester.getSession();
   private final WebhookDao underTest = dbClient.webhookDao();
   private final WebhookDbTester webhookDbTester = dbTester.webhooks();
+  private final ComponentDbTester componentDbTester = dbTester.components();
   private final OrganizationDbTester organizationDbTester = dbTester.organizations();
 
+
   @Test
   public void selectByUuid_returns_empty_if_uuid_does_not_exist() {
     assertThat(underTest.selectByUuid(dbSession, "missing")).isEmpty();
@@ -116,10 +120,42 @@ public class WebhookDaoTest {
     assertThat(new Date(reloaded.getUpdatedAt())).isInSameMinuteWindowAs(new Date(system2.now()));
   }
 
+  @Test
+  public void cleanWebhooksOfAProject() {
+
+    OrganizationDto organization = organizationDbTester.insert();
+    ComponentDto componentDto = componentDbTester.insertPrivateProject(organization);
+    webhookDbTester.insertWebhook(componentDto);
+    webhookDbTester.insertWebhook(componentDto);
+    webhookDbTester.insertWebhook(componentDto);
+    webhookDbTester.insertWebhook(componentDto);
+
+    underTest.cleanWebhooks(dbSession, componentDto);
+
+    Optional<WebhookDto> reloaded = underTest.selectByUuid(dbSession, componentDto.uuid());
+    assertThat(reloaded).isEmpty();
+  }
+
+  @Test
+  public void cleanWebhooksOfAnOrganization() {
+
+    OrganizationDto organization = organizationDbTester.insert();
+    webhookDbTester.insertWebhook(organization);
+    webhookDbTester.insertWebhook(organization);
+    webhookDbTester.insertWebhook(organization);
+    webhookDbTester.insertWebhook(organization);
+
+    underTest.cleanWebhooks(dbSession, organization);
+
+    Optional<WebhookDto> reloaded = underTest.selectByUuid(dbSession, organization.getUuid());
+    assertThat(reloaded).isEmpty();
+  }
+
   @Test
   public void delete() {
 
     OrganizationDto organization = organizationDbTester.insert();
+
     WebhookDto dto = webhookDbTester.insertWebhook(organization);
 
     underTest.delete(dbSession, dto.getUuid());
index cf9d93f4ff717da743c78302b05499e64048e882..66f91d1e2763e4e6005ff382f4d1f8d0134c0422 100644 (file)
@@ -62,6 +62,7 @@ public class ComponentCleanerService {
     checkArgument(!hasNotProjectScope(project) && !isNotDeletable(project) && project.getMainBranchProjectUuid() == null, "Only projects can be deleted");
     dbClient.purgeDao().deleteProject(dbSession, project.uuid());
     dbClient.userDao().cleanHomepage(dbSession, project);
+    dbClient.webhookDao().cleanWebhooks(dbSession, project);
     projectIndexers.commitAndIndex(dbSession, singletonList(project), ProjectIndexer.Cause.PROJECT_DELETION);
   }
 
index 2b43241f19e6573bfcd10513df2b2441eec771f9..6405afdd11f9609584a077f6da0b76e4cec119fd 100644 (file)
@@ -115,6 +115,7 @@ public class DeleteAction implements OrganizationsWsAction {
 
   private void deleteProjects(DbSession dbSession, OrganizationDto organization) {
     List<ComponentDto> roots = dbClient.componentDao().selectAllRootsByOrganization(dbSession, organization.getUuid());
+    roots.forEach(project ->  dbClient.webhookDao().cleanWebhooks(dbSession, project));
     componentCleanerService.delete(dbSession, roots);
   }
 
@@ -151,6 +152,7 @@ public class DeleteAction implements OrganizationsWsAction {
     dbClient.organizationMemberDao().deleteByOrganizationUuid(dbSession, organization.getUuid());
     dbClient.organizationDao().deleteByUuid(dbSession, organization.getUuid());
     dbClient.userDao().cleanHomepage(dbSession, organization);
+    dbClient.webhookDao().cleanWebhooks(dbSession, organization);
     userIndexer.commitAndIndexByLogins(dbSession, logins);
   }