diff --git a/mailpoet/lib/Cron/Workers/SendingQueue/SendingQueue.php b/mailpoet/lib/Cron/Workers/SendingQueue/SendingQueue.php index 0cd3961451..2bebc3304a 100644 --- a/mailpoet/lib/Cron/Workers/SendingQueue/SendingQueue.php +++ b/mailpoet/lib/Cron/Workers/SendingQueue/SendingQueue.php @@ -182,7 +182,7 @@ class SendingQueue { } // pre-process newsletter (render, replace shortcodes/links, etc.) - $newsletterEntity = $this->newsletterTask->preProcessNewsletter($newsletterEntity, $legacyQueue); + $newsletterEntity = $this->newsletterTask->preProcessNewsletter($newsletterEntity, $task); if (!$newsletterEntity) { $this->deleteTask($task); diff --git a/mailpoet/lib/Cron/Workers/SendingQueue/Tasks/Newsletter.php b/mailpoet/lib/Cron/Workers/SendingQueue/Tasks/Newsletter.php index 9ad76fe098..c6f2994891 100644 --- a/mailpoet/lib/Cron/Workers/SendingQueue/Tasks/Newsletter.php +++ b/mailpoet/lib/Cron/Workers/SendingQueue/Tasks/Newsletter.php @@ -134,17 +134,18 @@ class Newsletter { return $newsletter; } - public function preProcessNewsletter(NewsletterEntity $newsletter, Sending $sendingTask) { + public function preProcessNewsletter(NewsletterEntity $newsletter, ScheduledTaskEntity $task) { // return the newsletter if it was previously rendered - /** @phpstan-ignore-next-line - SendingQueue::getNewsletterRenderedBody() is called inside Sending using __call(). Sending will be refactored soon to stop using Paris models. */ - if (!is_null($sendingTask->getNewsletterRenderedBody())) { - return (!$sendingTask->validate()) ? - $this->stopNewsletterPreProcessing(sprintf('QUEUE-%d-RENDER', $sendingTask->id)) : - $newsletter; + $queue = $task->getSendingQueue(); + if (!$queue) { + return false; + } + if ($queue->getNewsletterRenderedBody() !== null) { + return $newsletter; } $this->loggerFactory->getLogger(LoggerFactory::TOPIC_NEWSLETTERS)->info( 'pre-processing newsletter', - ['newsletter_id' => $newsletter->getId(), 'task_id' => $sendingTask->taskId] + ['newsletter_id' => $newsletter->getId(), 'task_id' => $task->getId()] ); $campaignId = null; @@ -154,7 +155,7 @@ class Newsletter { // hook to the newsletter post-processing filter and add tracking image $this->trackingImageInserted = OpenTracking::addTrackingImage(); // render newsletter - $renderedNewsletter = $this->renderer->render($newsletter, $sendingTask->getSendingQueueEntity()); + $renderedNewsletter = $this->renderer->render($newsletter, $queue); $renderedNewsletter = $this->wp->applyFilters( 'mailpoet_sending_newsletter_render_after_pre_process', $renderedNewsletter, @@ -165,10 +166,10 @@ class Newsletter { } $renderedNewsletter = $this->gaTracking->applyGATracking($renderedNewsletter, $newsletter); // hash and save all links - $renderedNewsletter = $this->linksTask->process($renderedNewsletter, $newsletter, $sendingTask); + $renderedNewsletter = $this->linksTask->process($renderedNewsletter, $newsletter, $queue); } else { // render newsletter - $renderedNewsletter = $this->renderer->render($newsletter, $sendingTask->getSendingQueueEntity()); + $renderedNewsletter = $this->renderer->render($newsletter, $queue); $renderedNewsletter = $this->wp->applyFilters( 'mailpoet_sending_newsletter_render_after_pre_process', $renderedNewsletter, @@ -188,7 +189,7 @@ class Newsletter { // delete notification history record since it will never be sent $this->loggerFactory->getLogger(LoggerFactory::TOPIC_POST_NOTIFICATIONS)->info( 'no posts in post notification, deleting it', - ['newsletter_id' => $newsletter->getId(), 'task_id' => $sendingTask->taskId] + ['newsletter_id' => $newsletter->getId(), 'task_id' => $task->getId()] ); $this->newslettersRepository->bulkDelete([(int)$newsletter->getId()]); return false; @@ -196,43 +197,41 @@ class Newsletter { // extract and save newsletter posts $this->postsTask->extractAndSave($renderedNewsletter, $newsletter); - $sendingQueueEntity = $sendingTask->getSendingQueueEntity(); - if ($campaignId !== null) { - $this->sendingQueuesRepository->saveCampaignId($sendingQueueEntity, $campaignId); + $this->sendingQueuesRepository->saveCampaignId($queue, $campaignId); } $filterSegmentId = $newsletter->getFilterSegmentId(); if ($filterSegmentId) { $filterSegment = $this->segmentsRepository->findOneById($filterSegmentId); if ($filterSegment instanceof SegmentEntity && $filterSegment->getType() === SegmentEntity::TYPE_DYNAMIC) { - $this->sendingQueuesRepository->saveFilterSegmentMeta($sendingQueueEntity, $filterSegment); + $this->sendingQueuesRepository->saveFilterSegmentMeta($queue, $filterSegment); } } // update queue with the rendered and pre-processed newsletter - $sendingTask->newsletterRenderedSubject = ShortcodesTask::process( - $newsletter->getSubject(), - $renderedNewsletter['html'], - $newsletter, - null, - $sendingQueueEntity + $queue->setNewsletterRenderedSubject( + ShortcodesTask::process( + $newsletter->getSubject(), + $renderedNewsletter['html'], + $newsletter, + null, + $queue + ) ); // if the rendered subject is empty, use a default subject, // having no subject in a newsletter is considered spammy - if (empty(trim((string)$sendingTask->newsletterRenderedSubject))) { - $sendingTask->newsletterRenderedSubject = __('No subject', 'mailpoet'); + if (empty(trim((string)$queue->getNewsletterRenderedSubject()))) { + $queue->setNewsletterRenderedSubject(__('No subject', 'mailpoet')); } $renderedNewsletter = $this->emoji->encodeEmojisInBody($renderedNewsletter); - $sendingTask->newsletterRenderedBody = $renderedNewsletter; - $sendingTask->save(); + $queue->setNewsletterRenderedBody($renderedNewsletter); - // catch DB errors - $queueErrors = $sendingTask->getErrors(); - - if ($queueErrors) { - $this->stopNewsletterPreProcessing(sprintf('QUEUE-%d-SAVE', $sendingTask->id)); + try { + $this->sendingQueuesRepository->flush(); + } catch (\Throwable $e) { + $this->stopNewsletterPreProcessing(sprintf('QUEUE-%d-SAVE', $queue->getId())); } return $newsletter; }