diff --git a/mailpoet/lib/Util/DataInconsistency/DataInconsistencyRepository.php b/mailpoet/lib/Util/DataInconsistency/DataInconsistencyRepository.php index d55b97c3b8..60989d8826 100644 --- a/mailpoet/lib/Util/DataInconsistency/DataInconsistencyRepository.php +++ b/mailpoet/lib/Util/DataInconsistency/DataInconsistencyRepository.php @@ -5,6 +5,8 @@ namespace MailPoet\Util\DataInconsistency; use MailPoet\Cron\Workers\SendingQueue\SendingQueue; use MailPoet\Entities\ScheduledTaskEntity; use MailPoetVendor\Doctrine\ORM\EntityManager; +use MailPoetVendor\Doctrine\ORM\Query; +use MailPoetVendor\Doctrine\ORM\QueryBuilder; class DataInconsistencyRepository { private EntityManager $entityManager; @@ -16,14 +18,32 @@ class DataInconsistencyRepository { } public function getOrphanedSendingTasksCount(): int { - return (int)$this->entityManager->createQueryBuilder() - ->select('count(st.id)') + $builder = $this->entityManager->createQueryBuilder() + ->select('count(st.id)'); + return (int)$this->buildOrphanedSendingTasksQuery($builder)->getSingleScalarResult(); + } + + public function cleanupOrphanedSendingTasks(): int { + $ids = $this->buildOrphanedSendingTasksQuery( + $this->entityManager->createQueryBuilder() + ->select('st.id') + )->getResult(); + + $qb = $this->entityManager->createQueryBuilder(); + return $qb->delete(ScheduledTaskEntity::class, 'st') + ->where($qb->expr()->in('st.id', ':ids')) + ->setParameter('ids', array_column($ids, 'id')) + ->getQuery() + ->execute(); + } + + private function buildOrphanedSendingTasksQuery(QueryBuilder $queryBuilder): Query { + return $queryBuilder ->from(ScheduledTaskEntity::class, 'st') ->leftJoin('st.sendingQueue', 'sq') ->where('sq.id IS NULL') ->andWhere('st.type = :type') ->setParameter('type', SendingQueue::TASK_TYPE) - ->getQuery() - ->getSingleScalarResult(); + ->getQuery(); } } diff --git a/mailpoet/tests/integration/Util/DataInconsistency/DataInconsistencyRepositoryTest.php b/mailpoet/tests/integration/Util/DataInconsistency/DataInconsistencyRepositoryTest.php index 8dd32a11e5..4ebeda3226 100644 --- a/mailpoet/tests/integration/Util/DataInconsistency/DataInconsistencyRepositoryTest.php +++ b/mailpoet/tests/integration/Util/DataInconsistency/DataInconsistencyRepositoryTest.php @@ -10,11 +10,11 @@ use MailPoet\Test\DataFactories\SendingQueue; class DataInconsistencyRepositoryTest extends \MailPoetTest { private DataInconsistencyRepository $repository; - public function _before() { + public function _before(): void { $this->repository = $this->diContainer->get(DataInconsistencyRepository::class); } - public function testItFetchesOrphanedSendingTasksCount() { + public function testItFetchesOrphanedSendingTasksCount(): void { $orphanedSendingTasksCount = $this->repository->getOrphanedSendingTasksCount(); verify($orphanedSendingTasksCount)->equals(0); @@ -30,4 +30,15 @@ class DataInconsistencyRepositoryTest extends \MailPoetTest { $orphanedSendingTasksCount = $this->repository->getOrphanedSendingTasksCount(); verify($orphanedSendingTasksCount)->equals(2); } + + public function testItCleansUpOrphanedSendingTasks(): void { + (new ScheduledTask())->create(SendingQueueWorker::TASK_TYPE, ScheduledTaskEntity::STATUS_SCHEDULED); + (new ScheduledTask())->create(SendingQueueWorker::TASK_TYPE, null); + $orphanedSendingTasksCount = $this->repository->getOrphanedSendingTasksCount(); + verify($orphanedSendingTasksCount)->equals(2); + + $this->repository->cleanupOrphanedSendingTasks(); + $orphanedSendingTasksCount = $this->repository->getOrphanedSendingTasksCount(); + verify($orphanedSendingTasksCount)->equals(0); + } }