Replace Subscriber model with Doctrine in SendingQueue and SendingQueueTest

[MAILPOET-5737]
This commit is contained in:
Rodrigo Primo
2023-11-23 14:26:07 -03:00
committed by Aschepikov
parent 5ac874c713
commit 83826b3f65
4 changed files with 48 additions and 42 deletions

View File

@@ -17,7 +17,6 @@ use MailPoet\Mailer\MailerLog;
use MailPoet\Mailer\MetaInfo;
use MailPoet\Models\Newsletter;
use MailPoet\Models\StatisticsNewsletters as StatisticsNewslettersModel;
use MailPoet\Models\Subscriber as SubscriberModel;
use MailPoet\Newsletter\NewslettersRepository;
use MailPoet\Newsletter\Sending\ScheduledTasksRepository;
use MailPoet\Newsletter\Sending\ScheduledTaskSubscribersRepository;
@@ -248,20 +247,32 @@ class SendingQueue {
$this->scheduledTasksRepository->flush();
return;
}
$foundSubscribers = empty($foundSubscribersIds) ? [] : SubscriberModel::whereIn('id', $foundSubscribersIds)
->whereNull('deleted_at')
->findMany();
$foundSubscribers = empty($foundSubscribersIds) ? [] : $this->subscribersRepository->findBy(['id' => $foundSubscribersIds, 'deletedAt' => null]);
} else {
// No segments = Welcome emails or some Automatic emails.
// Welcome emails or some Automatic emails use segments only for scheduling and store them as a newsletter option
$foundSubscribers = SubscriberModel::whereIn('id', $subscribersToProcessIds);
$foundSubscribers = $newsletter->type === NewsletterEntity::TYPE_AUTOMATION_TRANSACTIONAL ?
$foundSubscribers->whereNotEqual('status', SubscriberModel::STATUS_BOUNCED) :
$foundSubscribers->where('status', SubscriberModel::STATUS_SUBSCRIBED);
$foundSubscribers = $foundSubscribers
->whereNull('deleted_at')
->findMany();
$foundSubscribersIds = SubscriberModel::extractSubscribersIds($foundSubscribers);
$queryBuilder = $this->entityManager->createQueryBuilder();
$queryBuilder->select('s')
->from(SubscriberEntity::class, 's')
->where('s.id IN (:subscriberIds)')
->setParameter('subscriberIds', $subscribersToProcessIds)
->andWhere('s.deletedAt IS NULL');
if ($newsletterEntity->getType() === NewsletterEntity::TYPE_AUTOMATION_TRANSACTIONAL) {
$queryBuilder->andWhere('s.status != :bouncedStatus')
->setParameter('bouncedStatus', SubscriberEntity::STATUS_BOUNCED);
} else {
$queryBuilder->andWhere('s.status = :subscribedStatus')
->setParameter('subscribedStatus', SubscriberEntity::STATUS_SUBSCRIBED);
}
$foundSubscribers = $queryBuilder->getQuery()->getResult();
$foundSubscribersIds = array_filter(
array_map(function(SubscriberEntity $subscriber) {
return (!empty($subscriber->getId())) ? $subscriber->getId() : false;
}, $foundSubscribers)
);
}
// if some subscribers weren't found, remove them from the processing list
if (count($foundSubscribersIds) !== count($subscribersToProcessIds)) {
@@ -332,7 +343,10 @@ class SendingQueue {
return $this->throttlingHandler->getBatchSize();
}
public function processQueue(ScheduledTaskEntity $task, $newsletter, $subscribers, $timer) {
/**
* @param SubscriberEntity[] $subscribers
*/
public function processQueue(ScheduledTaskEntity $task, $newsletter, array $subscribers, $timer) {
// determine if processing is done in bulk or individually
$processingMethod = $this->mailerTask->getProcessingMethod();
$preparedNewsletters = [];
@@ -356,29 +370,23 @@ class SendingQueue {
}
foreach ($subscribers as $subscriber) {
$subscriberEntity = $this->subscribersRepository->findOneById($subscriber->id);
if (!$subscriberEntity instanceof SubscriberEntity) {
continue;
}
// render shortcodes and replace subscriber data in tracked links
$preparedNewsletters[] =
$this->newsletterTask->prepareNewsletterForSending(
$newsletterEntity,
$subscriberEntity,
$subscriber,
$sendingQueueEntity
);
// format subscriber name/address according to mailer settings
$preparedSubscribers[] = $this->mailerTask->prepareSubscriberForSending(
$subscriber
);
$preparedSubscribersIds[] = $subscriber->id;
$preparedSubscribersIds[] = $subscriber->getId();
// create personalized instant unsubsribe link
$unsubscribeUrls[] = $this->links->getUnsubscribeUrl($sendingQueueEntity->getId(), $subscriberEntity);
$oneClickUnsubscribeUrls[] = $this->links->getOneClickUnsubscribeUrl($sendingQueueEntity->getId(), $subscriberEntity);
$unsubscribeUrls[] = $this->links->getUnsubscribeUrl($sendingQueueEntity->getId(), $subscriber);
$oneClickUnsubscribeUrls[] = $this->links->getOneClickUnsubscribeUrl($sendingQueueEntity->getId(), $subscriber);
$metasForSubscriber = $this->mailerMetaInfo->getNewsletterMetaInfo($newsletterEntity, $subscriberEntity);
$metasForSubscriber = $this->mailerMetaInfo->getNewsletterMetaInfo($newsletterEntity, $subscriber);
if ($campaignId) {
$metasForSubscriber['campaign_id'] = $campaignId;
}
@@ -387,7 +395,7 @@ class SendingQueue {
// keep track of values for statistics purposes
$statistics[] = [
'newsletter_id' => $newsletter->id,
'subscriber_id' => $subscriber->id,
'subscriber_id' => $subscriber->getId(),
'queue_id' => $sendingQueueEntity->getId(),
];
if ($processingMethod === 'individual') {

View File

@@ -2,10 +2,12 @@
namespace MailPoet\Cron\Workers\SendingQueue\Tasks;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\Mailer\Mailer as MailerInstance;
use MailPoet\Mailer\MailerFactory;
use MailPoet\Mailer\MailerLog;
use MailPoet\Mailer\Methods\MailPoet;
use MailPoet\Models\Subscriber;
class Mailer {
/** @var MailerFactory */
@@ -58,8 +60,10 @@ class Mailer {
'individual';
}
public function prepareSubscriberForSending($subscriber) {
return $this->mailer->formatSubscriberNameAndEmailAddress($subscriber);
public function prepareSubscriberForSending(SubscriberEntity $subscriber) {
$subscriberModel = Subscriber::findOne($subscriber->getId());
return $this->mailer->formatSubscriberNameAndEmailAddress($subscriberModel);
}
public function sendBulk($preparedNewsletters, $preparedSubscribers, $extraParams = []) {

View File

@@ -32,7 +32,6 @@ use MailPoet\Mailer\MailerFactory;
use MailPoet\Mailer\MailerLog;
use MailPoet\Mailer\SubscriberError;
use MailPoet\Models\SendingQueue;
use MailPoet\Models\Subscriber;
use MailPoet\Newsletter\Links\Links;
use MailPoet\Newsletter\NewslettersRepository;
use MailPoet\Newsletter\Sending\ScheduledTasksRepository;
@@ -499,7 +498,7 @@ class SendingQueueTest extends \MailPoetTest {
MailerTask::class,
[
'prepareSubscriberForSending' => function($subscriber) {
return $subscriber->get('email');
return $subscriber->getEmail();
},
'getProcessingMethod' => 'individual',
'send' => Expected::exactly(2, function($newsletter, $subscriberEmail, $extraParams) use ($subscribersRepository, $sendingQueue) {
@@ -521,12 +520,7 @@ class SendingQueueTest extends \MailPoetTest {
)
);
$subscribersModels = [
Subscriber::findOne($subscriber1->getId()),
Subscriber::findOne($subscriber2->getId()),
];
$sendingQueueWorker->processQueue($scheduledTask, $newsletter, $subscribersModels, $timer);
$sendingQueueWorker->processQueue($scheduledTask, $newsletter, [$subscriber1, $subscriber2], $timer);
}
public function testItCanProcessSubscribersInBulk() {

View File

@@ -8,8 +8,8 @@ use MailPoet\Config\Populator;
use MailPoet\Cron\Workers\SendingQueue\Tasks\Mailer as MailerTask;
use MailPoet\Mailer\Mailer;
use MailPoet\Mailer\MailerFactory;
use MailPoet\Models\Subscriber;
use MailPoet\Settings\SettingsController;
use MailPoet\Test\DataFactories\Subscriber as SubscriberFactory;
class MailerTest extends \MailPoetTest {
/** @var SettingsController */
@@ -90,12 +90,12 @@ class MailerTest extends \MailPoetTest {
}
public function testItCanPrepareSubscriberForSending() {
/** @var Subscriber $subscriber */
$subscriber = Subscriber::create();
$subscriber->email = 'test@example.com';
$subscriber->firstName = 'John';
$subscriber->lastName = 'Doe';
$subscriber->save();
$subscriber = (new SubscriberFactory())
->withEmail('test@example.com')
->withFirstName('John')
->withLastName('Doe')
->create();
$mailerTask = $this->diContainer->get(MailerTask::class);
$preparedSubscriber = $mailerTask->prepareSubscriberForSending($subscriber);
verify($preparedSubscriber)->equals('John Doe <test@example.com>');