diff --git a/mailpoet/lib/DI/ContainerConfigurator.php b/mailpoet/lib/DI/ContainerConfigurator.php index ff90f57b00..e32b315a25 100644 --- a/mailpoet/lib/DI/ContainerConfigurator.php +++ b/mailpoet/lib/DI/ContainerConfigurator.php @@ -617,6 +617,8 @@ class ContainerConfigurator implements IContainerConfigurator { $container->autowire(\MailPoet\NewsletterTemplates\ThumbnailSaver::class)->setPublic(true); $container->autowire(\MailPoet\NewsletterTemplates\BrandStyles::class)->setPublic(true); // Util + $container->autowire(\MailPoet\Util\DataInconsistency\DataInconsistencyController::class)->setPublic(true); + $container->autowire(\MailPoet\Util\DataInconsistency\DataInconsistencyRepository::class)->setPublic(true); $container->autowire(\MailPoet\Util\Cookies::class)->setPublic(true); $container->autowire(\MailPoet\Util\DBCollationChecker::class); $container->autowire(\MailPoet\Util\FreeDomains::class); diff --git a/mailpoet/lib/Util/DataInconsistency/DataInconsistencyController.php b/mailpoet/lib/Util/DataInconsistency/DataInconsistencyController.php new file mode 100644 index 0000000000..1103a4730e --- /dev/null +++ b/mailpoet/lib/Util/DataInconsistency/DataInconsistencyController.php @@ -0,0 +1,23 @@ +repository = $repository; + } + + public function getInconsistentDataStatus(): array { + $result = [ + self::ORPHANED_TASKS => $this->repository->getOrphanedSendingTasksCount(), + ]; + $result['total'] = array_sum($result); + return $result; + } +} diff --git a/mailpoet/lib/Util/DataInconsistency/DataInconsistencyRepository.php b/mailpoet/lib/Util/DataInconsistency/DataInconsistencyRepository.php new file mode 100644 index 0000000000..d55b97c3b8 --- /dev/null +++ b/mailpoet/lib/Util/DataInconsistency/DataInconsistencyRepository.php @@ -0,0 +1,29 @@ +entityManager = $entityManager; + } + + public function getOrphanedSendingTasksCount(): int { + return (int)$this->entityManager->createQueryBuilder() + ->select('count(st.id)') + ->from(ScheduledTaskEntity::class, 'st') + ->leftJoin('st.sendingQueue', 'sq') + ->where('sq.id IS NULL') + ->andWhere('st.type = :type') + ->setParameter('type', SendingQueue::TASK_TYPE) + ->getQuery() + ->getSingleScalarResult(); + } +} diff --git a/mailpoet/tests/integration/Util/DataInconsistency/DataInconsistencyRepositoryTest.php b/mailpoet/tests/integration/Util/DataInconsistency/DataInconsistencyRepositoryTest.php new file mode 100644 index 0000000000..8dd32a11e5 --- /dev/null +++ b/mailpoet/tests/integration/Util/DataInconsistency/DataInconsistencyRepositoryTest.php @@ -0,0 +1,33 @@ +repository = $this->diContainer->get(DataInconsistencyRepository::class); + } + + public function testItFetchesOrphanedSendingTasksCount() { + $orphanedSendingTasksCount = $this->repository->getOrphanedSendingTasksCount(); + verify($orphanedSendingTasksCount)->equals(0); + + // Add non orphaned sending task + $okTask = (new ScheduledTask())->create(SendingQueueWorker::TASK_TYPE, ScheduledTaskEntity::STATUS_SCHEDULED); + (new SendingQueue())->create($okTask); + $orphanedSendingTasksCount = $this->repository->getOrphanedSendingTasksCount(); + verify($orphanedSendingTasksCount)->equals(0); + + // Add orphaned sending tasks + (new ScheduledTask())->create(SendingQueueWorker::TASK_TYPE, ScheduledTaskEntity::STATUS_SCHEDULED); + (new ScheduledTask())->create(SendingQueueWorker::TASK_TYPE, null); + $orphanedSendingTasksCount = $this->repository->getOrphanedSendingTasksCount(); + verify($orphanedSendingTasksCount)->equals(2); + } +}