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\Newsletter\NewslettersRepository;
use MailPoet\Newsletter\Sending\ScheduledTasksRepository;
use MailPoet\Newsletter\Sending\SendingQueuesRepository;
use MailPoet\Segments\SegmentsRepository;
use MailPoet\Segments\SubscribersFinder;
use MailPoet\Subscribers\SubscribersRepository;
@ -78,6 +79,9 @@ class SendingQueue {
/** @var SubscribersRepository */
private $subscribersRepository;
/** @var SendingQueuesRepository */
private $sendingQueueRepository;
public function __construct(
SendingErrorHandler $errorHandler,
SendingThrottlingHandler $throttlingHandler,
@ -92,6 +96,7 @@ class SendingQueue {
ScheduledTasksRepository $scheduledTasksRepository,
MailerTask $mailerTask,
SubscribersRepository $subscribersRepository,
SendingQueuesRepository $sendingQueuesRepository,
$newsletterTask = false
) {
$this->errorHandler = $errorHandler;
@ -109,6 +114,7 @@ class SendingQueue {
$this->links = $links;
$this->scheduledTasksRepository = $scheduledTasksRepository;
$this->subscribersRepository = $subscribersRepository;
$this->sendingQueueRepository = $sendingQueuesRepository;
}
public function process($timer = false) {
@ -160,13 +166,34 @@ class SendingQueue {
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.)
$newsletterEntity = $this->newsletterTask->preProcessNewsletter($newsletterEntity, $queue);
$this->wp->removeFilter('mailpoet_sending_newsletter_render_after_pre_process', $afterPreProcessFilter);
if (!$newsletterEntity) {
$this->deleteTask($queue);
return;
}
if ($campaignId) {
$this->sendingQueueRepository->addCampaignId($queue->getSendingQueueEntity(), $campaignId);
}
$newsletter = Newsletter::findOne($newsletterEntity->getId());
if (!$newsletter) {
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
* @param int[] $segmentIds