diff --git a/lib/Cron/Workers/Bounce.php b/lib/Cron/Workers/Bounce.php index 56145e6d92..08082f48f1 100644 --- a/lib/Cron/Workers/Bounce.php +++ b/lib/Cron/Workers/Bounce.php @@ -2,6 +2,7 @@ namespace MailPoet\Cron\Workers; +use MailPoet\Entities\SubscriberEntity; use MailPoet\Mailer\Mailer; use MailPoet\Models\ScheduledTask; use MailPoet\Models\ScheduledTaskSubscriber; @@ -9,6 +10,7 @@ use MailPoet\Models\Subscriber; use MailPoet\Services\Bridge; use MailPoet\Services\Bridge\API; use MailPoet\Settings\SettingsController; +use MailPoet\Subscribers\SubscribersRepository; use MailPoet\Tasks\Bounce as BounceTask; use MailPoet\Tasks\Subscribers as TaskSubscribers; use MailPoet\Tasks\Subscribers\BatchIterator; @@ -30,13 +32,18 @@ class Bounce extends SimpleWorker { /** @var Bridge */ private $bridge; + /** @var SubscribersRepository */ + private $subscribersRepository; + public function __construct( SettingsController $settings, + SubscribersRepository $subscribersRepository, Bridge $bridge ) { $this->settings = $settings; $this->bridge = $bridge; parent::__construct(); + $this->subscribersRepository = $subscribersRepository; } public function init() { @@ -73,10 +80,7 @@ class Bounce extends SimpleWorker { // abort if execution limit is reached $this->cronHelper->enforceExecutionLimit($timer); - $subscriberEmails = Subscriber::select('email') - ->whereIn('id', $subscribersToProcessIds) - ->whereNull('deleted_at') - ->findArray(); + $subscriberEmails = $this->subscribersRepository->getUndeletedSubscribersEmailsByIds($subscribersToProcessIds); $subscriberEmails = array_column($subscriberEmails, 'email'); $this->processEmails($subscriberEmails); @@ -98,11 +102,12 @@ class Bounce extends SimpleWorker { continue; } if ($email['bounce'] === self::BOUNCED_HARD) { - $subscriber = Subscriber::findOne($email['address']); - $subscriber->status = Subscriber::STATUS_BOUNCED; - $subscriber->save(); + $subscriber = $this->subscribersRepository->findOneBy(['email' => $email['address']]); + if (!$subscriber instanceof SubscriberEntity) continue; + $subscriber->setStatus(SubscriberEntity::STATUS_BOUNCED); } } + $this->subscribersRepository->flush(); } public function getNextRunDate() { diff --git a/lib/Subscribers/SubscribersRepository.php b/lib/Subscribers/SubscribersRepository.php index 4d798622f2..8547ac985a 100644 --- a/lib/Subscribers/SubscribersRepository.php +++ b/lib/Subscribers/SubscribersRepository.php @@ -329,4 +329,19 @@ class SubscribersRepository extends Repository { $subscriberEntity->setLastEngagementAt($now); $this->flush(); } + + /** + * @param array $ids + * @return string[] + */ + public function getUndeletedSubscribersEmailsByIds(array $ids): array { + return $this->entityManager->createQueryBuilder() + ->select('s.email') + ->from(SubscriberEntity::class, 's') + ->where('s.deletedAt IS NULL') + ->andWhere('s.id IN (:ids)') + ->setParameter('ids', $ids) + ->getQuery() + ->getArrayResult(); + } } diff --git a/tests/integration/Cron/Workers/BounceTest.php b/tests/integration/Cron/Workers/BounceTest.php index 963ac37b15..f74daf8916 100644 --- a/tests/integration/Cron/Workers/BounceTest.php +++ b/tests/integration/Cron/Workers/BounceTest.php @@ -10,7 +10,6 @@ use MailPoet\Entities\SubscriberEntity; use MailPoet\Mailer\Mailer; use MailPoet\Models\ScheduledTask; use MailPoet\Models\ScheduledTaskSubscriber; -use MailPoet\Newsletter\Sending\ScheduledTasksRepository; use MailPoet\Services\Bridge; use MailPoet\Services\Bridge\API; use MailPoet\Settings\SettingsController; @@ -50,6 +49,7 @@ class BounceTest extends \MailPoetTest { $this->worker = new Bounce( $this->diContainer->get(SettingsController::class), + $this->subscribersRepository, $this->diContainer->get(Bridge::class) ); @@ -64,7 +64,11 @@ class BounceTest extends \MailPoetTest { public function testItCanInitializeBridgeAPI() { $this->setMailPoetSendingMethod(); - $worker = new Bounce($this->diContainer->get(SettingsController::class), $this->diContainer->get(Bridge::class)); + $worker = new Bounce( + $this->diContainer->get(SettingsController::class), + $this->subscribersRepository, + $this->diContainer->get(Bridge::class) + ); $worker->init(); expect($worker->api instanceof API)->true(); }