Replace Subscriber model with Doctrine in SendingQueue and SendingQueueTest
[MAILPOET-5737]
This commit is contained in:
committed by
Aschepikov
parent
5ac874c713
commit
83826b3f65
@@ -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') {
|
||||
|
@@ -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 = []) {
|
||||
|
@@ -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() {
|
||||
|
@@ -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>');
|
||||
|
Reference in New Issue
Block a user