From c84a6894ba4eb4a73b22c04e08aed92e6d2b7a48 Mon Sep 17 00:00:00 2001 From: Sam Najian Date: Wed, 22 Feb 2023 17:48:43 +0100 Subject: [PATCH] Throw and log the issue if coupon was not found when rendering [MAILPOET-4983] --- .../lib/Newsletter/NewslettersRepository.php | 6 ++++ .../lib/Newsletter/Renderer/Blocks/Coupon.php | 14 +++++++++- .../lib/Newsletter/Renderer/Preprocessor.php | 1 - mailpoet/lib/Newsletter/Renderer/Renderer.php | 28 +++++++++++++++++-- .../integration/Newsletter/RendererTest.php | 6 +++- .../TransactionalEmails/RendererTest.php | 4 ++- 6 files changed, 52 insertions(+), 7 deletions(-) diff --git a/mailpoet/lib/Newsletter/NewslettersRepository.php b/mailpoet/lib/Newsletter/NewslettersRepository.php index 1e49e46ba2..1ca483f2bf 100644 --- a/mailpoet/lib/Newsletter/NewslettersRepository.php +++ b/mailpoet/lib/Newsletter/NewslettersRepository.php @@ -543,6 +543,12 @@ class NewslettersRepository extends Repository { return $this->findBy(['status' => NewsletterEntity::STATUS_CORRUPT, 'deletedAt' => null]); } + public function setAsCorrupt(NewsletterEntity $entity): void { + $entity->setStatus(NewsletterEntity::STATUS_CORRUPT); + $this->persist($entity); + $this->flush(); + } + private function fetchChildrenIds(array $parentIds) { $ids = $this->entityManager->createQueryBuilder()->select('n.id') ->from(NewsletterEntity::class, 'n') diff --git a/mailpoet/lib/Newsletter/Renderer/Blocks/Coupon.php b/mailpoet/lib/Newsletter/Renderer/Blocks/Coupon.php index b544af633c..7abaafeb9f 100644 --- a/mailpoet/lib/Newsletter/Renderer/Blocks/Coupon.php +++ b/mailpoet/lib/Newsletter/Renderer/Blocks/Coupon.php @@ -4,6 +4,7 @@ namespace MailPoet\Newsletter\Renderer\Blocks; use MailPoet\Newsletter\Renderer\EscapeHelper as EHelper; use MailPoet\Newsletter\Renderer\StylesHelper; +use MailPoet\NewsletterProcessingException; use MailPoet\WooCommerce\Helper; class Coupon { @@ -23,7 +24,18 @@ class Coupon { public function render($element, $columnBaseWidth) { $couponCode = self::CODE_PLACEHOLDER; if (!empty($element['couponId'])) { - $couponCode = $this->helper->wcGetCouponCodeById((int)$element['couponId']); + try { + $couponCode = $this->helper->wcGetCouponCodeById((int)$element['couponId']); + } catch (\Exception $e) { + if (!$this->helper->isWooCommerceActive()) { + throw NewsletterProcessingException::create()->withMessage(__('Woocommerce is not active', 'mailpoet')); + } else { + throw NewsletterProcessingException::create()->withMessage($e->getMessage())->withCode($e->getCode()); + } + } + if (empty($couponCode)) { + throw NewsletterProcessingException::create()->withMessage(__('Couldn\'t find coupon, please edit and adjust if coupons is removed.', 'mailpoet')); + } } $element['styles']['block']['width'] = $this->calculateWidth($element, $columnBaseWidth); $styles = 'display:inline-block;-webkit-text-size-adjust:none;mso-hide:all;text-decoration:none;text-align:center;' . StylesHelper::getBlockStyles($element, $exclude = ['textAlign']); diff --git a/mailpoet/lib/Newsletter/Renderer/Preprocessor.php b/mailpoet/lib/Newsletter/Renderer/Preprocessor.php index 5e1db2b990..d14bc3567c 100644 --- a/mailpoet/lib/Newsletter/Renderer/Preprocessor.php +++ b/mailpoet/lib/Newsletter/Renderer/Preprocessor.php @@ -7,7 +7,6 @@ use MailPoet\Logging\LoggerFactory; use MailPoet\Newsletter\NewslettersRepository; use MailPoet\Newsletter\Renderer\Blocks\AbandonedCartContent; use MailPoet\Newsletter\Renderer\Blocks\AutomatedLatestContentBlock; -use MailPoet\NewsletterProcessingException; use MailPoet\Tasks\Sending as SendingTask; use MailPoet\WooCommerce\CouponPreProcessor; use MailPoet\WooCommerce\TransactionalEmails\ContentPreprocessor; diff --git a/mailpoet/lib/Newsletter/Renderer/Renderer.php b/mailpoet/lib/Newsletter/Renderer/Renderer.php index af25a97d27..c12136089f 100644 --- a/mailpoet/lib/Newsletter/Renderer/Renderer.php +++ b/mailpoet/lib/Newsletter/Renderer/Renderer.php @@ -5,7 +5,10 @@ namespace MailPoet\Newsletter\Renderer; use MailPoet\Config\Env; use MailPoet\Config\ServicesChecker; use MailPoet\Entities\NewsletterEntity; +use MailPoet\Logging\LoggerFactory; +use MailPoet\Newsletter\NewslettersRepository; use MailPoet\Newsletter\Renderer\EscapeHelper as EHelper; +use MailPoet\NewsletterProcessingException; use MailPoet\Tasks\Sending as SendingTask; use MailPoet\Util\pQuery\DomNode; use MailPoet\WP\Functions as WPFunctions; @@ -32,13 +35,21 @@ class Renderer { /** @var WPFunctions */ private $wp; + /*** @var LoggerFactory */ + private $loggerFactory; + + /*** @var NewslettersRepository */ + private $newslettersRepository; + public function __construct( Blocks\Renderer $blocksRenderer, Columns\Renderer $columnsRenderer, Preprocessor $preprocessor, \MailPoetVendor\CSS $cSSInliner, ServicesChecker $servicesChecker, - WPFunctions $wp + WPFunctions $wp, + LoggerFactory $loggerFactory, + NewslettersRepository $newslettersRepository ) { $this->blocksRenderer = $blocksRenderer; $this->columnsRenderer = $columnsRenderer; @@ -46,6 +57,8 @@ class Renderer { $this->cSSInliner = $cSSInliner; $this->servicesChecker = $servicesChecker; $this->wp = $wp; + $this->loggerFactory = $loggerFactory; + $this->newslettersRepository = $newslettersRepository; } public function render(NewsletterEntity $newsletter, SendingTask $sendingTask = null, $type = false) { @@ -75,8 +88,17 @@ class Renderer { $language = $this->wp->getBloginfo('language'); $metaRobots = $preview ? '' : ''; - $content = $this->preprocessor->process($newsletter, $content, $preview, $sendingTask); - $renderedBody = $this->renderBody($newsletter, $content); + $renderedBody = ""; + try { + $content = $this->preprocessor->process($newsletter, $content, $preview, $sendingTask); + $renderedBody = $this->renderBody($newsletter, $content); + } catch (NewsletterProcessingException $e) { + $this->loggerFactory->getLogger(LoggerFactory::TOPIC_COUPONS)->error( + $e->getMessage(), + ['newsletter_id' => $newsletter->getId()] + ); + $this->newslettersRepository->setAsCorrupt($newsletter); + } $renderedStyles = $this->renderStyles($styles); $customFontsLinks = StylesHelper::getCustomFontsLinks($styles); diff --git a/mailpoet/tests/integration/Newsletter/RendererTest.php b/mailpoet/tests/integration/Newsletter/RendererTest.php index 4add3f8a11..d9671c5db3 100644 --- a/mailpoet/tests/integration/Newsletter/RendererTest.php +++ b/mailpoet/tests/integration/Newsletter/RendererTest.php @@ -5,6 +5,8 @@ namespace MailPoet\Test\Newsletter; use Codeception\Util\Fixtures; use MailPoet\Config\ServicesChecker; use MailPoet\Entities\NewsletterEntity; +use MailPoet\Logging\LoggerFactory; +use MailPoet\Newsletter\NewslettersRepository; use MailPoet\Newsletter\Renderer\Blocks\Button; use MailPoet\Newsletter\Renderer\Blocks\Divider; use MailPoet\Newsletter\Renderer\Blocks\Footer; @@ -54,7 +56,9 @@ class RendererTest extends \MailPoetTest { $this->diContainer->get(Preprocessor::class), $this->diContainer->get(\MailPoetVendor\CSS::class), $this->servicesChecker, - $this->diContainer->get(WPFunctions::class) + $this->diContainer->get(WPFunctions::class), + $this->diContainer->get(LoggerFactory::class), + $this->diContainer->get(NewslettersRepository::class) ); $this->columnRenderer = new ColumnRenderer(); $this->dOMParser = new pQuery(); diff --git a/mailpoet/tests/integration/WooCommerce/TransactionalEmails/RendererTest.php b/mailpoet/tests/integration/WooCommerce/TransactionalEmails/RendererTest.php index a52ad1ee02..07edee3106 100644 --- a/mailpoet/tests/integration/WooCommerce/TransactionalEmails/RendererTest.php +++ b/mailpoet/tests/integration/WooCommerce/TransactionalEmails/RendererTest.php @@ -117,7 +117,9 @@ class RendererTest extends \MailPoetTest { ), $this->diContainer->get(\MailPoetVendor\CSS::class), $this->diContainer->get(ServicesChecker::class), - $this->diContainer->get(WPFunctions::class) + $this->diContainer->get(WPFunctions::class), + $this->diContainer->get(LoggerFactory::class), + $this->diContainer->get(NewslettersRepository::class) ); } }