Delete also task subscribers when fixing orphaned scheduled tasks

[MAILPOET-1587]
This commit is contained in:
Rostislav Wolny
2024-08-01 11:09:53 +02:00
committed by Aschepikov
parent c513befdb8
commit 34feae9f1f
2 changed files with 37 additions and 2 deletions

View File

@@ -4,6 +4,7 @@ namespace MailPoet\Util\DataInconsistency;
use MailPoet\Cron\Workers\SendingQueue\SendingQueue; use MailPoet\Cron\Workers\SendingQueue\SendingQueue;
use MailPoet\Entities\ScheduledTaskEntity; use MailPoet\Entities\ScheduledTaskEntity;
use MailPoet\Entities\ScheduledTaskSubscriberEntity;
use MailPoetVendor\Doctrine\ORM\EntityManager; use MailPoetVendor\Doctrine\ORM\EntityManager;
use MailPoetVendor\Doctrine\ORM\Query; use MailPoetVendor\Doctrine\ORM\Query;
use MailPoetVendor\Doctrine\ORM\QueryBuilder; use MailPoetVendor\Doctrine\ORM\QueryBuilder;
@@ -29,12 +30,27 @@ class DataInconsistencyRepository {
->select('st.id') ->select('st.id')
)->getResult(); )->getResult();
if (!$ids) {
return 0;
}
// delete the orphaned tasks
$qb = $this->entityManager->createQueryBuilder(); $qb = $this->entityManager->createQueryBuilder();
return $qb->delete(ScheduledTaskEntity::class, 'st') $countDeletedTasks = $qb->delete(ScheduledTaskEntity::class, 'st')
->where($qb->expr()->in('st.id', ':ids')) ->where($qb->expr()->in('st.id', ':ids'))
->setParameter('ids', array_column($ids, 'id')) ->setParameter('ids', array_column($ids, 'id'))
->getQuery() ->getQuery()
->execute(); ->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 { private function buildOrphanedSendingTasksQuery(QueryBuilder $queryBuilder): Query {

View File

@@ -4,8 +4,12 @@ namespace MailPoet\Util\DataInconsistency;
use MailPoet\Cron\Workers\SendingQueue\SendingQueue as SendingQueueWorker; use MailPoet\Cron\Workers\SendingQueue\SendingQueue as SendingQueueWorker;
use MailPoet\Entities\ScheduledTaskEntity; use MailPoet\Entities\ScheduledTaskEntity;
use MailPoet\Entities\ScheduledTaskSubscriberEntity;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\Test\DataFactories\ScheduledTask; use MailPoet\Test\DataFactories\ScheduledTask;
use MailPoet\Test\DataFactories\ScheduledTaskSubscriber;
use MailPoet\Test\DataFactories\SendingQueue; use MailPoet\Test\DataFactories\SendingQueue;
use MailPoet\Test\DataFactories\Subscriber;
class DataInconsistencyRepositoryTest extends \MailPoetTest { class DataInconsistencyRepositoryTest extends \MailPoetTest {
private DataInconsistencyRepository $repository; private DataInconsistencyRepository $repository;
@@ -32,13 +36,28 @@ class DataInconsistencyRepositoryTest extends \MailPoetTest {
} }
public function testItCleansUpOrphanedSendingTasks(): void { 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); (new ScheduledTask())->create(SendingQueueWorker::TASK_TYPE, null);
$subscriber = (new Subscriber())->create();
(new ScheduledTaskSubscriber())->createProcessed($taskWithSubscriber, $subscriber);
$orphanedSendingTasksCount = $this->repository->getOrphanedSendingTasksCount(); $orphanedSendingTasksCount = $this->repository->getOrphanedSendingTasksCount();
verify($orphanedSendingTasksCount)->equals(2); verify($orphanedSendingTasksCount)->equals(2);
$taskSubscriberCount = $this->entityManager->getRepository(ScheduledTaskSubscriberEntity::class)->count([]);
verify($taskSubscriberCount)->equals(1);
$this->repository->cleanupOrphanedSendingTasks(); $this->repository->cleanupOrphanedSendingTasks();
$orphanedSendingTasksCount = $this->repository->getOrphanedSendingTasksCount(); $orphanedSendingTasksCount = $this->repository->getOrphanedSendingTasksCount();
verify($orphanedSendingTasksCount)->equals(0); 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);
} }
} }