init
This commit is contained in:
@@ -0,0 +1,116 @@
|
||||
<?php // phpcs:ignore SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing
|
||||
|
||||
namespace MailPoet\Newsletter\ViewInBrowser;
|
||||
|
||||
if (!defined('ABSPATH')) exit;
|
||||
|
||||
|
||||
use MailPoet\EmailEditor\Integrations\MailPoet\DependencyNotice;
|
||||
use MailPoet\Entities\SubscriberEntity;
|
||||
use MailPoet\Newsletter\NewslettersRepository;
|
||||
use MailPoet\Newsletter\Sending\SendingQueuesRepository;
|
||||
use MailPoet\Newsletter\Url as NewsletterUrl;
|
||||
use MailPoet\Subscribers\LinkTokens;
|
||||
use MailPoet\Subscribers\SubscribersRepository;
|
||||
|
||||
class ViewInBrowserController {
|
||||
/** @var LinkTokens */
|
||||
private $linkTokens;
|
||||
|
||||
/** @var NewsletterUrl */
|
||||
private $newsletterUrl;
|
||||
|
||||
/** @var ViewInBrowserRenderer */
|
||||
private $viewInBrowserRenderer;
|
||||
|
||||
/** @var SubscribersRepository */
|
||||
private $subscribersRepository;
|
||||
|
||||
/** @var SendingQueuesRepository */
|
||||
private $sendingQueuesRepository;
|
||||
|
||||
/** @var NewslettersRepository */
|
||||
private $newslettersRepository;
|
||||
|
||||
/** @var DependencyNotice */
|
||||
private $dependencyNotice;
|
||||
|
||||
public function __construct(
|
||||
LinkTokens $linkTokens,
|
||||
NewsletterUrl $newsletterUrl,
|
||||
NewslettersRepository $newslettersRepository,
|
||||
ViewInBrowserRenderer $viewInBrowserRenderer,
|
||||
SendingQueuesRepository $sendingQueuesRepository,
|
||||
DependencyNotice $dependencyNotice,
|
||||
SubscribersRepository $subscribersRepository
|
||||
) {
|
||||
$this->linkTokens = $linkTokens;
|
||||
$this->viewInBrowserRenderer = $viewInBrowserRenderer;
|
||||
$this->subscribersRepository = $subscribersRepository;
|
||||
$this->sendingQueuesRepository = $sendingQueuesRepository;
|
||||
$this->newsletterUrl = $newsletterUrl;
|
||||
$this->dependencyNotice = $dependencyNotice;
|
||||
$this->newslettersRepository = $newslettersRepository;
|
||||
}
|
||||
|
||||
public function view(array $data) {
|
||||
$data = $this->newsletterUrl->transformUrlDataObject($data);
|
||||
$isPreview = !empty($data['preview']);
|
||||
$newsletter = $this->getNewsletter($data);
|
||||
$subscriber = $this->getSubscriber($data);
|
||||
if ($newsletter->getWpPostId() && $this->dependencyNotice->checkDependenciesAndEventuallyShowNotice()) {
|
||||
return '';
|
||||
}
|
||||
|
||||
// if queue and subscriber exist, subscriber must have received the newsletter
|
||||
$queue = isset($data['queue_id']) ? $this->sendingQueuesRepository->findOneById($data['queue_id']) : null;
|
||||
if (!$isPreview && $queue && $subscriber->getId() && !$this->sendingQueuesRepository->isSubscriberProcessed($queue, $subscriber)) {
|
||||
throw new \InvalidArgumentException("Subscriber did not receive the newsletter yet");
|
||||
}
|
||||
|
||||
return $this->viewInBrowserRenderer->render($isPreview, $newsletter, $subscriber, $queue);
|
||||
}
|
||||
|
||||
private function getNewsletter(array $data) {
|
||||
// newsletter - ID is mandatory, hash must be set and valid
|
||||
if (empty($data['newsletter_id'])) {
|
||||
throw new \InvalidArgumentException("Missing 'newsletter_id'");
|
||||
}
|
||||
if (empty($data['newsletter_hash'])) {
|
||||
throw new \InvalidArgumentException("Missing 'newsletter_hash'");
|
||||
}
|
||||
|
||||
$newsletter = $this->newslettersRepository->findOneById($data['newsletter_id']);
|
||||
if (!$newsletter) {
|
||||
throw new \InvalidArgumentException("Invalid 'newsletter_id'");
|
||||
}
|
||||
|
||||
if ($data['newsletter_hash'] !== $newsletter->getHash()) {
|
||||
throw new \InvalidArgumentException("Invalid 'newsletter_hash'");
|
||||
}
|
||||
return $newsletter;
|
||||
}
|
||||
|
||||
private function getSubscriber(array $data): SubscriberEntity {
|
||||
// subscriber is optional; if exists, token must validate
|
||||
$subscriber = null;
|
||||
if (!empty($data['subscriber_id'])) {
|
||||
$subscriber = $this->subscribersRepository->findOneById($data['subscriber_id']);
|
||||
}
|
||||
if ($subscriber && empty($data['subscriber_token'])) {
|
||||
throw new \InvalidArgumentException("Missing 'subscriber_token'");
|
||||
}
|
||||
|
||||
if ($subscriber && !$this->linkTokens->verifyToken($subscriber, $data['subscriber_token'])) {
|
||||
throw new \InvalidArgumentException("Invalid 'subscriber_token'");
|
||||
}
|
||||
|
||||
// if this is a preview and subscriber does not exist,
|
||||
// attempt to set subscriber to the current logged-in WP user
|
||||
if (!$subscriber && !empty($data['preview'])) {
|
||||
$subscriber = $this->subscribersRepository->getCurrentWPUser();
|
||||
}
|
||||
|
||||
return $subscriber ?? new SubscriberEntity();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,126 @@
|
||||
<?php // phpcs:ignore SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing
|
||||
|
||||
namespace MailPoet\Newsletter\ViewInBrowser;
|
||||
|
||||
if (!defined('ABSPATH')) exit;
|
||||
|
||||
|
||||
use MailPoet\EmailEditor\Engine\Personalizer;
|
||||
use MailPoet\Entities\NewsletterEntity;
|
||||
use MailPoet\Entities\SendingQueueEntity;
|
||||
use MailPoet\Entities\SubscriberEntity;
|
||||
use MailPoet\Newsletter\Links\Links;
|
||||
use MailPoet\Newsletter\Renderer\Renderer;
|
||||
use MailPoet\Newsletter\Shortcodes\Shortcodes;
|
||||
use MailPoet\Settings\TrackingConfig;
|
||||
use MailPoet\WP\Emoji;
|
||||
|
||||
class ViewInBrowserRenderer {
|
||||
/** @var Emoji */
|
||||
private $emoji;
|
||||
|
||||
/** @var TrackingConfig */
|
||||
private $trackingConfig;
|
||||
|
||||
/** @var Renderer */
|
||||
private $renderer;
|
||||
|
||||
/** @var Shortcodes */
|
||||
private $shortcodes;
|
||||
|
||||
/** @var Links */
|
||||
private $links;
|
||||
|
||||
private Personalizer $personalizer;
|
||||
|
||||
public function __construct(
|
||||
Emoji $emoji,
|
||||
TrackingConfig $trackingConfig,
|
||||
Shortcodes $shortcodes,
|
||||
Renderer $renderer,
|
||||
Links $links,
|
||||
Personalizer $personalizer
|
||||
) {
|
||||
$this->emoji = $emoji;
|
||||
$this->trackingConfig = $trackingConfig;
|
||||
$this->renderer = $renderer;
|
||||
$this->shortcodes = $shortcodes;
|
||||
$this->links = $links;
|
||||
$this->personalizer = $personalizer;
|
||||
}
|
||||
|
||||
public function render(
|
||||
bool $isPreview,
|
||||
NewsletterEntity $newsletter,
|
||||
SubscriberEntity $subscriber = null,
|
||||
SendingQueueEntity $queue = null
|
||||
) {
|
||||
$wpUserPreview = $isPreview;
|
||||
$isTrackingEnabled = $this->trackingConfig->isEmailTrackingEnabled();
|
||||
|
||||
if ($queue && $queue->getNewsletterRenderedBody()) {
|
||||
$body = $queue->getNewsletterRenderedBody();
|
||||
if (is_array($body)) {
|
||||
$newsletterBody = $body['html'];
|
||||
} else {
|
||||
$newsletterBody = '';
|
||||
}
|
||||
$newsletterBody = $this->emoji->decodeEmojisInBody($newsletterBody);
|
||||
// rendered newsletter body has shortcodes converted to links; we need to
|
||||
// isolate "view in browser", "unsubscribe" and "manage subscription" links
|
||||
// and convert them to shortcodes, which later will be replaced with "#" when
|
||||
// newsletter is previewed
|
||||
if ($wpUserPreview && preg_match($this->links->getLinkRegex(), $newsletterBody)) {
|
||||
$newsletterBody = $this->links->convertHashedLinksToShortcodesAndUrls(
|
||||
$newsletterBody,
|
||||
$queue->getId(),
|
||||
$convertAll = true
|
||||
);
|
||||
// remove open tracking link
|
||||
$newsletterBody = str_replace(Links::DATA_TAG_OPEN, '', $newsletterBody);
|
||||
}
|
||||
} else {
|
||||
if ($wpUserPreview) {
|
||||
$newsletterBody = $this->renderer->renderAsPreview($newsletter, 'html');
|
||||
} else {
|
||||
$newsletterBody = $this->renderer->render($newsletter, $sendingTask = null, 'html');
|
||||
}
|
||||
}
|
||||
$this->prepareShortcodes(
|
||||
$newsletter,
|
||||
$subscriber,
|
||||
$queue,
|
||||
$wpUserPreview
|
||||
);
|
||||
$renderedNewsletter = $this->shortcodes->replace($newsletterBody);
|
||||
if (!$wpUserPreview && $queue && $subscriber && $isTrackingEnabled) {
|
||||
$renderedNewsletter = $this->links->replaceSubscriberData(
|
||||
$subscriber->getId(),
|
||||
$queue->getId(),
|
||||
$renderedNewsletter
|
||||
);
|
||||
}
|
||||
if ($newsletter->getWpPostId() !== null) {
|
||||
$this->personalizer->set_context([
|
||||
'recipient_email' => $subscriber ? $subscriber->getEmail() : null,
|
||||
'is_user_preview' => $wpUserPreview,
|
||||
'newsletter_id' => $newsletter->getId(),
|
||||
'queue_id' => $queue ? $queue->getId() : null,
|
||||
]);
|
||||
$renderedNewsletter = $this->personalizer->personalize_content($renderedNewsletter);
|
||||
}
|
||||
return $renderedNewsletter;
|
||||
}
|
||||
|
||||
private function prepareShortcodes(
|
||||
NewsletterEntity $newsletter,
|
||||
?SubscriberEntity $subscriber,
|
||||
?SendingQueueEntity $queue,
|
||||
bool $wpUserPreview
|
||||
) {
|
||||
$this->shortcodes->setQueue($queue);
|
||||
$this->shortcodes->setNewsletter($newsletter);
|
||||
$this->shortcodes->setWpUserPreview($wpUserPreview);
|
||||
$this->shortcodes->setSubscriber($subscriber);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
<?php
|
||||
Reference in New Issue
Block a user