diff --git a/mailpoet/lib/Newsletter/Sending/ScheduledTaskSubscribersRepository.php b/mailpoet/lib/Newsletter/Sending/ScheduledTaskSubscribersRepository.php index 23f9106a0b..b4a01c0341 100644 --- a/mailpoet/lib/Newsletter/Sending/ScheduledTaskSubscribersRepository.php +++ b/mailpoet/lib/Newsletter/Sending/ScheduledTaskSubscribersRepository.php @@ -126,6 +126,19 @@ class ScheduledTaskSubscribersRepository extends Repository { ->execute(); } + public function deleteByScheduledTaskAndSubscriberIds(ScheduledTaskEntity $scheduledTask, array $subscriberIds): void { + $this->entityManager->createQueryBuilder() + ->delete(ScheduledTaskSubscriberEntity::class, 'sts') + ->where('sts.task = :task') + ->andWhere('sts.subscriber IN (:subscriberIds)') + ->setParameter('task', $scheduledTask) + ->setParameter('subscriberIds', $subscriberIds, Connection::PARAM_INT_ARRAY) + ->getQuery() + ->execute(); + + $this->checkCompleted($scheduledTask); + } + public function setSubscribers(ScheduledTaskEntity $task, array $subscriberIds): void { $this->deleteByScheduledTask($task); diff --git a/mailpoet/lib/Tasks/Sending.php b/mailpoet/lib/Tasks/Sending.php index e0adfb09f7..479dde5c85 100644 --- a/mailpoet/lib/Tasks/Sending.php +++ b/mailpoet/lib/Tasks/Sending.php @@ -254,8 +254,20 @@ class Sending { } public function removeSubscribers(array $subscriberIds) { - $this->taskSubscribers->removeSubscribers($subscriberIds); - $this->updateCount(); + $scheduledTaskEntity = $this->scheduledTasksRepository->findOneById($this->task->id); + + if ($scheduledTaskEntity instanceof ScheduledTaskEntity) { + $this->scheduledTaskSubscribersRepository->deleteByScheduledTaskAndSubscriberIds($scheduledTaskEntity, $subscriberIds); + + // we need to update those fields here as the Sending class is in a mixed state using Paris and Doctrine at the same time + // this probably won't be necessary anymore once https://mailpoet.atlassian.net/browse/MAILPOET-4375 is finished + $this->task->status = $scheduledTaskEntity->getStatus(); + if (!is_null($scheduledTaskEntity->getProcessedAt())) { + $this->task->processedAt = $scheduledTaskEntity->getProcessedAt()->format('Y-m-d H:i:s'); + } + + $this->updateCount(); + } } public function removeAllSubscribers() { diff --git a/mailpoet/lib/Tasks/Subscribers.php b/mailpoet/lib/Tasks/Subscribers.php index a7986a260b..fa18a5a17c 100644 --- a/mailpoet/lib/Tasks/Subscribers.php +++ b/mailpoet/lib/Tasks/Subscribers.php @@ -18,13 +18,6 @@ class Subscribers { return ScheduledTaskSubscriber::where('task_id', $this->task->id); } - public function removeSubscribers(array $subscribersToRemove) { - $this->getSubscribers() - ->whereIn('subscriber_id', $subscribersToRemove) - ->deleteMany(); - $this->checkCompleted(); - } - public function removeAllSubscribers() { $this->getSubscribers() ->deleteMany(); diff --git a/mailpoet/tests/integration/Newsletter/Sending/ScheduledTaskSubscribersRepositoryTest.php b/mailpoet/tests/integration/Newsletter/Sending/ScheduledTaskSubscribersRepositoryTest.php index 5268ec62f2..188ee895e6 100644 --- a/mailpoet/tests/integration/Newsletter/Sending/ScheduledTaskSubscribersRepositoryTest.php +++ b/mailpoet/tests/integration/Newsletter/Sending/ScheduledTaskSubscribersRepositoryTest.php @@ -3,6 +3,7 @@ namespace integration\Newsletter\Sending; use MailPoet\Entities\ScheduledTaskEntity; +use MailPoet\Entities\ScheduledTaskSubscriberEntity; use MailPoet\Entities\SubscriberEntity; use MailPoet\Newsletter\Sending\ScheduledTaskSubscribersRepository; use MailPoet\Test\DataFactories\ScheduledTask as ScheduledTaskFactory; @@ -29,6 +30,21 @@ class ScheduledTaskSubscribersRepositoryTest extends \MailPoetTest { /** @var SubscriberEntity */ private $subscriberProcessed; + /** @var ScheduledTaskSubscriberEntity */ + private $taskSubscriber1; + + /** @var ScheduledTaskSubscriberEntity */ + private $taskSubscriber2; + + /** @var ScheduledTaskSubscriberEntity */ + private $taskSubscriber3; + + /** @var ScheduledTaskSubscriberEntity */ + private $taskSubscriber4; + + /** @var ScheduledTaskSubscriberEntity */ + private $taskSubscriber5; + public function _before() { parent::_before(); $this->repository = $this->diContainer->get(ScheduledTaskSubscribersRepository::class); @@ -44,12 +60,12 @@ class ScheduledTaskSubscribersRepositoryTest extends \MailPoetTest { $this->scheduledTask1 = $scheduledTaskFactory->create('sending', ScheduledTaskEntity::STATUS_COMPLETED, Carbon::now()->subDay()); $this->scheduledTask2 = $scheduledTaskFactory->create('sending', ScheduledTaskEntity::STATUS_COMPLETED, Carbon::now()->subDay()); - $taskSubscriberFactory->createUnprocessed($this->scheduledTask1, $this->subscriberUnprocessed); - $taskSubscriberFactory->createProcessed($this->scheduledTask1, $this->subscriberProcessed); - $taskSubscriberFactory->createFailed($this->scheduledTask1, $subscriberFailed, 'Error Message'); + $this->taskSubscriber1 = $taskSubscriberFactory->createUnprocessed($this->scheduledTask1, $this->subscriberUnprocessed); + $this->taskSubscriber2 = $taskSubscriberFactory->createProcessed($this->scheduledTask1, $this->subscriberProcessed); + $this->taskSubscriber3 = $taskSubscriberFactory->createFailed($this->scheduledTask1, $subscriberFailed, 'Error Message'); - $taskSubscriberFactory->createUnprocessed($this->scheduledTask2, $this->subscriberUnprocessed); - $taskSubscriberFactory->createProcessed($this->scheduledTask2, $this->subscriberProcessed); + $this->taskSubscriber4 = $taskSubscriberFactory->createUnprocessed($this->scheduledTask2, $this->subscriberUnprocessed); + $this->taskSubscriber5 = $taskSubscriberFactory->createProcessed($this->scheduledTask2, $this->subscriberProcessed); } public function testItSetsSubscribers() { @@ -70,4 +86,14 @@ class ScheduledTaskSubscribersRepositoryTest extends \MailPoetTest { $this->assertEquals($this->subscriberUnprocessed->getId(), $task2Subscribers[0]->getSubscriber()->getId()); $this->assertEquals($this->subscriberProcessed->getId(), $task2Subscribers[1]->getSubscriber()->getId()); } + + public function testItDeleteByScheduledTaskAndSubscriberIds() { + $this->repository->deleteByScheduledTaskAndSubscriberIds($this->scheduledTask1, [$this->taskSubscriber1->getSubscriberId()]); + $this->assertSame([$this->taskSubscriber2, $this->taskSubscriber3], $this->repository->findBy(['task' => $this->scheduledTask1])); + $this->assertSame([$this->taskSubscriber4, $this->taskSubscriber5], $this->repository->findBy(['task' => $this->scheduledTask2])); + + $this->repository->deleteByScheduledTaskAndSubscriberIds($this->scheduledTask2, [$this->taskSubscriber4->getSubscriberId(), $this->taskSubscriber5->getSubscriberId()]); + $this->assertSame([$this->taskSubscriber2, $this->taskSubscriber3], $this->repository->findBy(['task' => $this->scheduledTask1])); + $this->assertSame([], $this->repository->findBy(['task' => $this->scheduledTask2])); + } }