Calculate and store campaign IDs on sending queues

[MAILPOET-5033]
This commit is contained in:
John Oleksowicz
2023-02-13 13:11:35 -06:00
committed by Aschepikov
parent 64137aebb3
commit 0435c09c53
3 changed files with 59 additions and 7 deletions

View File

@@ -20,6 +20,7 @@ use MailPoet\Models\StatisticsNewsletters as StatisticsNewslettersModel;
use MailPoet\Models\Subscriber as SubscriberModel; use MailPoet\Models\Subscriber as SubscriberModel;
use MailPoet\Newsletter\NewslettersRepository; use MailPoet\Newsletter\NewslettersRepository;
use MailPoet\Newsletter\Sending\ScheduledTasksRepository; use MailPoet\Newsletter\Sending\ScheduledTasksRepository;
use MailPoet\Newsletter\Sending\SendingQueuesRepository;
use MailPoet\Segments\SegmentsRepository; use MailPoet\Segments\SegmentsRepository;
use MailPoet\Segments\SubscribersFinder; use MailPoet\Segments\SubscribersFinder;
use MailPoet\Subscribers\SubscribersRepository; use MailPoet\Subscribers\SubscribersRepository;
@@ -78,6 +79,9 @@ class SendingQueue {
/** @var SubscribersRepository */ /** @var SubscribersRepository */
private $subscribersRepository; private $subscribersRepository;
/** @var SendingQueuesRepository */
private $sendingQueueRepository;
public function __construct( public function __construct(
SendingErrorHandler $errorHandler, SendingErrorHandler $errorHandler,
SendingThrottlingHandler $throttlingHandler, SendingThrottlingHandler $throttlingHandler,
@@ -92,6 +96,7 @@ class SendingQueue {
ScheduledTasksRepository $scheduledTasksRepository, ScheduledTasksRepository $scheduledTasksRepository,
MailerTask $mailerTask, MailerTask $mailerTask,
SubscribersRepository $subscribersRepository, SubscribersRepository $subscribersRepository,
SendingQueuesRepository $sendingQueuesRepository,
$newsletterTask = false $newsletterTask = false
) { ) {
$this->errorHandler = $errorHandler; $this->errorHandler = $errorHandler;
@@ -109,6 +114,7 @@ class SendingQueue {
$this->links = $links; $this->links = $links;
$this->scheduledTasksRepository = $scheduledTasksRepository; $this->scheduledTasksRepository = $scheduledTasksRepository;
$this->subscribersRepository = $subscribersRepository; $this->subscribersRepository = $subscribersRepository;
$this->sendingQueueRepository = $sendingQueuesRepository;
} }
public function process($timer = false) { public function process($timer = false) {
@@ -160,13 +166,34 @@ class SendingQueue {
return; return;
} }
$campaignId = null;
$afterPreProcessFilter = function(array $renderedNewsletters, NewsletterEntity $renderedNewsletterEntity) use ($newsletterEntity, &$campaignId) {
if ($newsletterEntity !== $renderedNewsletterEntity || !isset($renderedNewsletters['text'])) {
return;
}
$textVersion = $renderedNewsletters['text'];
$campaignId = $this->calculateCampaignId($newsletterEntity, $textVersion);
return $renderedNewsletters;
};
// This filter fires during preProcessNewsletter, after some initial rendering but before any shortcodes are replaced.
$this->wp->addFilter('mailpoet_sending_newsletter_render_after_pre_process', $afterPreProcessFilter, 10, 2);
// pre-process newsletter (render, replace shortcodes/links, etc.) // pre-process newsletter (render, replace shortcodes/links, etc.)
$newsletterEntity = $this->newsletterTask->preProcessNewsletter($newsletterEntity, $queue); $newsletterEntity = $this->newsletterTask->preProcessNewsletter($newsletterEntity, $queue);
$this->wp->removeFilter('mailpoet_sending_newsletter_render_after_pre_process', $afterPreProcessFilter);
if (!$newsletterEntity) { if (!$newsletterEntity) {
$this->deleteTask($queue); $this->deleteTask($queue);
return; return;
} }
if ($campaignId) {
$this->sendingQueueRepository->addCampaignId($queue->getSendingQueueEntity(), $campaignId);
}
$newsletter = Newsletter::findOne($newsletterEntity->getId()); $newsletter = Newsletter::findOne($newsletterEntity->getId());
if (!$newsletter) { if (!$newsletter) {
return; return;
@@ -389,6 +416,10 @@ class SendingQueue {
); );
} }
public function calculateCampaignId(NewsletterEntity $newsletter, string $textBody): string {
return substr(md5(implode('|', [$newsletter->getId(), $textBody, $newsletter->getSubject()])), 0, 16);
}
/** /**
* Checks whether some of segments was deleted or trashed * Checks whether some of segments was deleted or trashed
* @param int[] $segmentIds * @param int[] $segmentIds

View File

@@ -150,4 +150,14 @@ class SendingQueuesRepository extends Repository {
->getQuery() ->getQuery()
->execute(); ->execute();
} }
public function addCampaignId(SendingQueueEntity $queue, string $campaignId): void {
$meta = $queue->getMeta();
if (!is_array($meta)) {
$meta = [];
}
$meta['campaignId'] = $campaignId;
$queue->setMeta($meta);
$this->flush();
}
} }

View File

@@ -44,6 +44,7 @@ use MailPoet\Models\SubscriberSegment;
use MailPoet\Newsletter\Links\Links; use MailPoet\Newsletter\Links\Links;
use MailPoet\Newsletter\NewslettersRepository; use MailPoet\Newsletter\NewslettersRepository;
use MailPoet\Newsletter\Sending\ScheduledTasksRepository; use MailPoet\Newsletter\Sending\ScheduledTasksRepository;
use MailPoet\Newsletter\Sending\SendingQueuesRepository;
use MailPoet\Router\Endpoints\Track; use MailPoet\Router\Endpoints\Track;
use MailPoet\Router\Router; use MailPoet\Router\Router;
use MailPoet\Segments\SegmentsRepository; use MailPoet\Segments\SegmentsRepository;
@@ -96,6 +97,8 @@ class SendingQueueTest extends \MailPoetTest {
private $scheduledTasksRepository; private $scheduledTasksRepository;
/** @var SubscribersRepository */ /** @var SubscribersRepository */
private $subscribersRepository; private $subscribersRepository;
/** @var SendingQueuesRepository */
private $sendingQueuesRepository;
public function _before() { public function _before() {
parent::_before(); parent::_before();
@@ -154,6 +157,7 @@ class SendingQueueTest extends \MailPoetTest {
$this->tasksLinks = $this->diContainer->get(TasksLinks::class); $this->tasksLinks = $this->diContainer->get(TasksLinks::class);
$this->scheduledTasksRepository = $this->diContainer->get(ScheduledTasksRepository::class); $this->scheduledTasksRepository = $this->diContainer->get(ScheduledTasksRepository::class);
$this->subscribersRepository = $this->diContainer->get(SubscribersRepository::class); $this->subscribersRepository = $this->diContainer->get(SubscribersRepository::class);
$this->sendingQueuesRepository = $this->diContainer->get(SendingQueuesRepository::class);
$this->sendingQueueWorker = $this->getSendingQueueWorker(); $this->sendingQueueWorker = $this->getSendingQueueWorker();
} }
@@ -209,7 +213,8 @@ class SendingQueueTest extends \MailPoetTest {
$this->tasksLinks, $this->tasksLinks,
$this->scheduledTasksRepository, $this->scheduledTasksRepository,
$this->diContainer->get(MailerTask::class), $this->diContainer->get(MailerTask::class),
$this->subscribersRepository $this->subscribersRepository,
$this->sendingQueuesRepository
); );
try { try {
$sendingQueueWorker->process(); $sendingQueueWorker->process();
@@ -243,7 +248,8 @@ class SendingQueueTest extends \MailPoetTest {
'sendBulk' => $this->mailerTaskDummyResponse, 'sendBulk' => $this->mailerTaskDummyResponse,
] ]
), ),
$this->subscribersRepository $this->subscribersRepository,
$this->sendingQueuesRepository
); );
$sendingQueueWorker->sendNewsletters( $sendingQueueWorker->sendNewsletters(
$this->queue, $this->queue,
@@ -288,7 +294,8 @@ class SendingQueueTest extends \MailPoetTest {
'sendBulk' => $this->mailerTaskDummyResponse, 'sendBulk' => $this->mailerTaskDummyResponse,
] ]
), ),
$this->subscribersRepository $this->subscribersRepository,
$this->sendingQueuesRepository
); );
$sendingQueueWorker->sendNewsletters( $sendingQueueWorker->sendNewsletters(
$queue, $queue,
@@ -327,7 +334,8 @@ class SendingQueueTest extends \MailPoetTest {
$this->tasksLinks, $this->tasksLinks,
$this->scheduledTasksRepository, $this->scheduledTasksRepository,
$this->diContainer->get(MailerTask::class), $this->diContainer->get(MailerTask::class),
$this->subscribersRepository $this->subscribersRepository,
$this->sendingQueuesRepository
); );
$sendingQueueWorker->process(); $sendingQueueWorker->process();
} }
@@ -650,7 +658,8 @@ class SendingQueueTest extends \MailPoetTest {
'sendBulk' => Stub::consecutive(['response' => false, 'error' => $mailerError], $this->mailerTaskDummyResponse), 'sendBulk' => Stub::consecutive(['response' => false, 'error' => $mailerError], $this->mailerTaskDummyResponse),
] ]
), ),
$this->subscribersRepository $this->subscribersRepository,
$this->sendingQueuesRepository
); );
$sendingQueueWorker->sendNewsletters( $sendingQueueWorker->sendNewsletters(
@@ -1049,7 +1058,8 @@ class SendingQueueTest extends \MailPoetTest {
'sendBulk' => $this->mailerTaskDummyResponse, 'sendBulk' => $this->mailerTaskDummyResponse,
] ]
), ),
$this->subscribersRepository $this->subscribersRepository,
$this->sendingQueuesRepository
); );
try { try {
$sendingQueueWorker->sendNewsletters( $sendingQueueWorker->sendNewsletters(
@@ -1271,7 +1281,8 @@ class SendingQueueTest extends \MailPoetTest {
$this->tasksLinks, $this->tasksLinks,
$this->scheduledTasksRepository, $this->scheduledTasksRepository,
$mailerMock ?? $this->diContainer->get(MailerTask::class), $mailerMock ?? $this->diContainer->get(MailerTask::class),
$this->subscribersRepository $this->subscribersRepository,
$this->sendingQueuesRepository
); );
} }
} }