From bcc96d27bb4790f1864fb8b4fdb5bd4adc7cb4ac Mon Sep 17 00:00:00 2001 From: Jan Jakes Date: Thu, 18 Jan 2024 13:32:15 +0100 Subject: [PATCH] Delete scheduled tasks subscribers using a repository [MAILPOET-5845] --- .../lib/Newsletter/NewslettersRepository.php | 26 ++++++++++++------- .../ScheduledTaskSubscribersRepository.php | 16 ++++++++++++ 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/mailpoet/lib/Newsletter/NewslettersRepository.php b/mailpoet/lib/Newsletter/NewslettersRepository.php index 696338dfd4..2a0e2b2d2d 100644 --- a/mailpoet/lib/Newsletter/NewslettersRepository.php +++ b/mailpoet/lib/Newsletter/NewslettersRepository.php @@ -25,6 +25,7 @@ use MailPoet\Entities\StatisticsWooCommercePurchaseEntity; use MailPoet\Entities\StatsNotificationEntity; use MailPoet\Logging\LoggerFactory; use MailPoet\Newsletter\Options\NewsletterOptionsRepository; +use MailPoet\Newsletter\Sending\ScheduledTaskSubscribersRepository; use MailPoet\Statistics\StatisticsClicksRepository; use MailPoet\Statistics\StatisticsNewslettersRepository; use MailPoet\Statistics\StatisticsOpensRepository; @@ -43,6 +44,7 @@ class NewslettersRepository extends Repository { private NewsletterLinkRepository $newsletterLinkRepository; private NewsletterOptionsRepository $newsletterOptionsRepository; private NewsletterPostsRepository $newsletterPostsRepository; + private ScheduledTaskSubscribersRepository $scheduledTaskSubscribersRepository; private StatisticsClicksRepository $statisticsClicksRepository; private StatisticsNewslettersRepository $statisticsNewslettersRepository; private StatisticsOpensRepository $statisticsOpensRepository; @@ -53,6 +55,7 @@ class NewslettersRepository extends Repository { NewsletterLinkRepository $newsletterLinkRepository, NewsletterOptionsRepository $newsletterOptionsRepository, NewsletterPostsRepository $newsletterPostsRepository, + ScheduledTaskSubscribersRepository $scheduledTaskSubscribersRepository, StatisticsClicksRepository $statisticsClicksRepository, StatisticsNewslettersRepository $statisticsNewslettersRepository, StatisticsOpensRepository $statisticsOpensRepository, @@ -63,6 +66,7 @@ class NewslettersRepository extends Repository { $this->newsletterLinkRepository = $newsletterLinkRepository; $this->newsletterOptionsRepository = $newsletterOptionsRepository; $this->newsletterPostsRepository = $newsletterPostsRepository; + $this->scheduledTaskSubscribersRepository = $scheduledTaskSubscribersRepository; $this->statisticsClicksRepository = $statisticsClicksRepository; $this->statisticsNewslettersRepository = $statisticsNewslettersRepository; $this->statisticsOpensRepository = $statisticsOpensRepository; @@ -434,17 +438,19 @@ class NewslettersRepository extends Repository { ", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]); // Delete scheduled tasks and scheduled task subscribers + /** @var string[] $taskIds */ + $taskIds = $this->entityManager->createQueryBuilder() + ->select('IDENTITY(q.task)') + ->from(SendingQueueEntity::class, 'q') + ->where('q.newsletter IN (:ids)') + ->setParameter('ids', $ids) + ->getQuery() + ->getSingleColumnResult(); + $taskIds = array_map('intval', $taskIds); + + $this->scheduledTaskSubscribersRepository->deleteByTaskIds($taskIds); + $sendingQueueTable = $entityManager->getClassMetadata(SendingQueueEntity::class)->getTableName(); - $scheduledTaskSubscribersTable = $entityManager->getClassMetadata(ScheduledTaskSubscriberEntity::class)->getTableName(); - - // Delete scheduled tasks subscribers - $entityManager->getConnection()->executeStatement(" - DELETE ts FROM $scheduledTaskSubscribersTable ts - JOIN $scheduledTasksTable t ON t.`id` = ts.`task_id` - JOIN $sendingQueueTable q ON q.`task_id` = t.`id` - WHERE q.`newsletter_id` IN (:ids) - ", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]); - $entityManager->getConnection()->executeStatement(" DELETE t FROM $scheduledTasksTable t JOIN $sendingQueueTable q ON t.`id` = q.`task_id` diff --git a/mailpoet/lib/Newsletter/Sending/ScheduledTaskSubscribersRepository.php b/mailpoet/lib/Newsletter/Sending/ScheduledTaskSubscribersRepository.php index 372a61284e..3d8fe6387f 100644 --- a/mailpoet/lib/Newsletter/Sending/ScheduledTaskSubscribersRepository.php +++ b/mailpoet/lib/Newsletter/Sending/ScheduledTaskSubscribersRepository.php @@ -118,6 +118,22 @@ class ScheduledTaskSubscribersRepository extends Repository { $stmt->executeQuery(); } + /** @param int[] $ids */ + public function deleteByTaskIds(array $ids): void { + $this->entityManager->createQueryBuilder() + ->delete(ScheduledTaskSubscriberEntity::class, 'sts') + ->where('sts.task IN (:taskIds)') + ->setParameter('taskIds', $ids) + ->getQuery() + ->execute(); + + // delete was done via DQL, make sure the entities are also detached from the entity manager + $this->detachAll(function (ScheduledTaskSubscriberEntity $entity) use ($ids) { + $task = $entity->getTask(); + return $task && in_array($task->getId(), $ids, true); + }); + } + public function deleteByScheduledTask(ScheduledTaskEntity $scheduledTask): void { $this->entityManager->createQueryBuilder() ->delete(ScheduledTaskSubscriberEntity::class, 'sts')