From 34feae9f1fd1a24c50cc1b95a1aafd14d19d25cd Mon Sep 17 00:00:00 2001 From: Rostislav Wolny Date: Thu, 1 Aug 2024 11:09:53 +0200 Subject: [PATCH] Delete also task subscribers when fixing orphaned scheduled tasks [MAILPOET-1587] --- .../DataInconsistencyRepository.php | 18 +++++++++++++++- .../DataInconsistencyRepositoryTest.php | 21 ++++++++++++++++++- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/mailpoet/lib/Util/DataInconsistency/DataInconsistencyRepository.php b/mailpoet/lib/Util/DataInconsistency/DataInconsistencyRepository.php index 60989d8826..21702c372a 100644 --- a/mailpoet/lib/Util/DataInconsistency/DataInconsistencyRepository.php +++ b/mailpoet/lib/Util/DataInconsistency/DataInconsistencyRepository.php @@ -4,6 +4,7 @@ namespace MailPoet\Util\DataInconsistency; use MailPoet\Cron\Workers\SendingQueue\SendingQueue; use MailPoet\Entities\ScheduledTaskEntity; +use MailPoet\Entities\ScheduledTaskSubscriberEntity; use MailPoetVendor\Doctrine\ORM\EntityManager; use MailPoetVendor\Doctrine\ORM\Query; use MailPoetVendor\Doctrine\ORM\QueryBuilder; @@ -29,12 +30,27 @@ class DataInconsistencyRepository { ->select('st.id') )->getResult(); + if (!$ids) { + return 0; + } + + // delete the orphaned tasks $qb = $this->entityManager->createQueryBuilder(); - return $qb->delete(ScheduledTaskEntity::class, 'st') + $countDeletedTasks = $qb->delete(ScheduledTaskEntity::class, 'st') ->where($qb->expr()->in('st.id', ':ids')) ->setParameter('ids', array_column($ids, 'id')) ->getQuery() ->execute(); + + // delete the scheduled tasks subscribers + $qb = $this->entityManager->createQueryBuilder(); + $qb->delete(ScheduledTaskSubscriberEntity::class, 'sts') + ->where($qb->expr()->in('sts.task', ':ids')) + ->setParameter('ids', array_column($ids, 'id')) + ->getQuery() + ->execute(); + + return $countDeletedTasks; } private function buildOrphanedSendingTasksQuery(QueryBuilder $queryBuilder): Query { diff --git a/mailpoet/tests/integration/Util/DataInconsistency/DataInconsistencyRepositoryTest.php b/mailpoet/tests/integration/Util/DataInconsistency/DataInconsistencyRepositoryTest.php index 4ebeda3226..78d847a115 100644 --- a/mailpoet/tests/integration/Util/DataInconsistency/DataInconsistencyRepositoryTest.php +++ b/mailpoet/tests/integration/Util/DataInconsistency/DataInconsistencyRepositoryTest.php @@ -4,8 +4,12 @@ namespace MailPoet\Util\DataInconsistency; use MailPoet\Cron\Workers\SendingQueue\SendingQueue as SendingQueueWorker; use MailPoet\Entities\ScheduledTaskEntity; +use MailPoet\Entities\ScheduledTaskSubscriberEntity; +use MailPoet\Entities\SubscriberEntity; use MailPoet\Test\DataFactories\ScheduledTask; +use MailPoet\Test\DataFactories\ScheduledTaskSubscriber; use MailPoet\Test\DataFactories\SendingQueue; +use MailPoet\Test\DataFactories\Subscriber; class DataInconsistencyRepositoryTest extends \MailPoetTest { private DataInconsistencyRepository $repository; @@ -32,13 +36,28 @@ class DataInconsistencyRepositoryTest extends \MailPoetTest { } public function testItCleansUpOrphanedSendingTasks(): void { - (new ScheduledTask())->create(SendingQueueWorker::TASK_TYPE, ScheduledTaskEntity::STATUS_SCHEDULED); + $taskWithSubscriber = (new ScheduledTask())->create(SendingQueueWorker::TASK_TYPE, ScheduledTaskEntity::STATUS_SCHEDULED); (new ScheduledTask())->create(SendingQueueWorker::TASK_TYPE, null); + + $subscriber = (new Subscriber())->create(); + (new ScheduledTaskSubscriber())->createProcessed($taskWithSubscriber, $subscriber); + $orphanedSendingTasksCount = $this->repository->getOrphanedSendingTasksCount(); verify($orphanedSendingTasksCount)->equals(2); + $taskSubscriberCount = $this->entityManager->getRepository(ScheduledTaskSubscriberEntity::class)->count([]); + verify($taskSubscriberCount)->equals(1); $this->repository->cleanupOrphanedSendingTasks(); $orphanedSendingTasksCount = $this->repository->getOrphanedSendingTasksCount(); verify($orphanedSendingTasksCount)->equals(0); + + // Check subscriber is not deleted + $this->entityManager->detach($subscriber); + $subscriber = $this->entityManager->find(SubscriberEntity::class, $subscriber->getId()); + $this->assertInstanceOf(SubscriberEntity::class, $subscriber); + + // Check task subscriber is deleted + $taskSubscriberCount = $this->entityManager->getRepository(ScheduledTaskSubscriberEntity::class)->count([]); + verify($taskSubscriberCount)->equals(0); } }