Use Newsletter\Links as service

[MAILPOET-3269]
This commit is contained in:
Jan Lysý
2021-05-28 10:00:20 +02:00
committed by Veljko V
parent 8826b01ec9
commit c9636ebf1b
10 changed files with 70 additions and 31 deletions

View File

@ -16,8 +16,15 @@ class Links {
/** @var LinkTokens */
private $linkTokens;
public function __construct(LinkTokens $linkTokens) {
/** @var NewsletterLinks */
private $newsletterLinks;
public function __construct(
LinkTokens $linkTokens,
NewsletterLinks $newsletterLinks
) {
$this->linkTokens = $linkTokens;
$this->newsletterLinks = $newsletterLinks;
}
public function process($renderedNewsletter, $newsletter, $queue) {
@ -29,8 +36,8 @@ class Links {
public function hashAndReplaceLinks($renderedNewsletter, $newsletterId, $queueId) {
// join HTML and TEXT rendered body into a text string
$content = Helpers::joinObject($renderedNewsletter);
list($content, $links) = NewsletterLinks::process($content, $newsletterId, $queueId);
$links = NewsletterLinks::ensureInstantUnsubscribeLink($links);
[$content, $links] = $this->newsletterLinks->process($content, $newsletterId, $queueId);
$links = $this->newsletterLinks->ensureInstantUnsubscribeLink($links);
// split the processed body with hashed links back to HTML and TEXT
list($renderedNewsletter['html'], $renderedNewsletter['text'])
= Helpers::splitObject($content);
@ -41,7 +48,7 @@ class Links {
}
public function saveLinks($links, $newsletter, $queue) {
return NewsletterLinks::save($links, $newsletter->id, $queue->id);
return $this->newsletterLinks->save($links, $newsletter->id, $queue->id);
}
public function getUnsubscribeUrl($queue, $subscriberId) {
@ -54,7 +61,7 @@ class Links {
if (!$linkHash instanceof NewsletterLinkModel) {
return '';
}
$data = NewsletterLinks::createUrlDataObject(
$data = $this->newsletterLinks->createUrlDataObject(
$subscriber->id,
$this->linkTokens->getToken($subscriber),
$queue->id,

View File

@ -49,6 +49,9 @@ class Newsletter {
/** @var LinksTask */
private $linksTask;
/** @var NewsletterLinks */
private $newsletterLinks;
public function __construct(
WPFunctions $wp = null,
PostsTask $postsTask = null,
@ -66,7 +69,7 @@ class Newsletter {
}
$this->postsTask = $postsTask;
if ($gaTracking === null) {
$gaTracking = new GATracking;
$gaTracking = ContainerWrapper::getInstance()->get(GATracking::class);
}
$this->gaTracking = $gaTracking;
$this->loggerFactory = LoggerFactory::getInstance();
@ -77,6 +80,7 @@ class Newsletter {
$this->renderer = ContainerWrapper::getInstance()->get(Renderer::class);
$this->newslettersRepository = ContainerWrapper::getInstance()->get(NewslettersRepository::class);
$this->linksTask = ContainerWrapper::getInstance()->get(LinksTask::class);
$this->newsletterLinks = ContainerWrapper::getInstance()->get(NewsletterLinks::class);
}
public function getNewsletterFromQueue($queue) {
@ -209,7 +213,7 @@ class Newsletter {
$queue
);
if ($this->trackingEnabled) {
$preparedNewsletter = NewsletterLinks::replaceSubscriberData(
$preparedNewsletter = $this->newsletterLinks->replaceSubscriberData(
$subscriber->id,
$queue->id,
$preparedNewsletter

View File

@ -321,6 +321,7 @@ class ContainerConfigurator implements IContainerConfigurator {
$container->autowire(\MailPoet\Newsletter\NewslettersRepository::class)->setPublic(true);
$container->autowire(\MailPoet\Newsletter\AutomaticEmailsRepository::class)->setPublic(true);
$container->autowire(\MailPoet\Newsletter\NewsletterHtmlSanitizer::class)->setPublic(true);
$container->autowire(\MailPoet\Newsletter\Links\Links::class)->setPublic(true);
$container->autowire(\MailPoet\Newsletter\Listing\NewsletterListingRepository::class)->setPublic(true);
$container->autowire(\MailPoet\Newsletter\Options\NewsletterOptionsRepository::class)->setPublic(true);
$container->autowire(\MailPoet\Newsletter\Options\NewsletterOptionFieldsRepository::class)->setPublic(true);
@ -355,6 +356,7 @@ class ContainerConfigurator implements IContainerConfigurator {
$container->autowire(\MailPoet\Newsletter\Sending\SendingQueuesRepository::class)->setPublic(true);
$container->autowire(\MailPoet\Newsletter\ViewInBrowser\ViewInBrowserController::class)->setPublic(true);
$container->autowire(\MailPoet\Newsletter\ViewInBrowser\ViewInBrowserRenderer::class)->setPublic(true);
$container->autowire(\MailPoet\Statistics\GATracking::class)->setPublic(true);
// Newsletter templates
$container->autowire(\MailPoet\NewsletterTemplates\NewsletterTemplatesRepository::class)->setPublic(true);
// Util

View File

@ -27,16 +27,21 @@ class ViewInBrowserRenderer {
/** @var Shortcodes */
private $shortcodes;
/** @var Links */
private $links;
public function __construct(
Emoji $emoji,
SettingsController $settings,
Shortcodes $shortcodes,
Renderer $renderer
Renderer $renderer,
Links $links
) {
$this->emoji = $emoji;
$this->isTrackingEnabled = $settings->get('tracking.enabled');
$this->renderer = $renderer;
$this->shortcodes = $shortcodes;
$this->links = $links;
}
public function render(
@ -58,8 +63,8 @@ class ViewInBrowserRenderer {
// 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(Links::getLinkRegex(), $newsletterBody)) {
$newsletterBody = Links::convertHashedLinksToShortcodesAndUrls(
if ($wpUserPreview && preg_match($this->links->getLinkRegex(), $newsletterBody)) {
$newsletterBody = $this->links->convertHashedLinksToShortcodesAndUrls(
$newsletterBody,
$queue->getId(),
$convertAll = true
@ -82,7 +87,7 @@ class ViewInBrowserRenderer {
);
$renderedNewsletter = $this->shortcodes->replace($newsletterBody);
if (!$wpUserPreview && $queue && $subscriber && $this->isTrackingEnabled) {
$renderedNewsletter = Links::replaceSubscriberData(
$renderedNewsletter = $this->links->replaceSubscriberData(
$subscriber->getId(),
$queue->getId(),
$renderedNewsletter

View File

@ -47,6 +47,9 @@ class Track {
/** @var NewsletterLinkRepository */
private $newsletterLinkRepository;
/** @var Links */
private $links;
public function __construct(
Clicks $clicks,
Opens $opens,
@ -54,7 +57,8 @@ class Track {
SubscribersRepository $subscribersRepository,
NewslettersRepository $newslettersRepository,
NewsletterLinkRepository $newsletterLinkRepository,
LinkTokens $linkTokens
LinkTokens $linkTokens,
Links $links
) {
$this->clicks = $clicks;
$this->opens = $opens;
@ -63,6 +67,7 @@ class Track {
$this->subscribersRepository = $subscribersRepository;
$this->newslettersRepository = $newslettersRepository;
$this->newsletterLinkRepository = $newsletterLinkRepository;
$this->links = $links;
}
public function click($data) {
@ -74,7 +79,7 @@ class Track {
}
public function _processTrackData($data) {
$data = (object)Links::transformUrlDataObject($data);
$data = (object)$this->links->transformUrlDataObject($data);
if (empty($data->queue_id) || // phpcs:ignore Squiz.NamingConventions.ValidVariableName.NotCamelCaps
empty($data->subscriber_id) || // phpcs:ignore Squiz.NamingConventions.ValidVariableName.NotCamelCaps
empty($data->subscriber_token) // phpcs:ignore Squiz.NamingConventions.ValidVariableName.NotCamelCaps

View File

@ -12,8 +12,12 @@ class GATracking {
/** @var SecondLevelDomainNames */
private $secondLevelDomainNames;
public function __construct() {
/** @var NewsletterLinks */
private $newsletterLinks;
public function __construct(NewsletterLinks $newsletterLinks) {
$this->secondLevelDomainNames = new SecondLevelDomainNames();
$this->newsletterLinks = $newsletterLinks;
}
public function applyGATracking($renderedNewsletter, $newsletter, $internalHost = null) {
@ -32,9 +36,9 @@ class GATracking {
private function addGAParamsToLinks($renderedNewsletter, $gaCampaign, $internalHost = null) {
// join HTML and TEXT rendered body into a text string
$content = Helpers::joinObject($renderedNewsletter);
$extractedLinks = NewsletterLinks::extract($content);
$extractedLinks = $this->newsletterLinks->extract($content);
$processedLinks = $this->addParams($extractedLinks, $gaCampaign, $internalHost);
list($content, $links) = NewsletterLinks::replace($content, $processedLinks);
list($content, $links) = $this->newsletterLinks->replace($content, $processedLinks);
// split the processed body with hashed links back to HTML and TEXT
list($renderedNewsletter['html'], $renderedNewsletter['text'])
= Helpers::splitObject($content);

View File

@ -2,6 +2,7 @@
namespace MailPoet\Subscription;
use MailPoet\DI\ContainerWrapper;
use MailPoet\Models\Subscriber;
use MailPoet\Router\Endpoints\Subscription as SubscriptionEndpoint;
use MailPoet\Router\Router;
@ -111,7 +112,8 @@ class SubscriptionUrlFactory {
*/
public static function getInstance() {
if (!self::$instance instanceof SubscriptionUrlFactory) {
self::$instance = new SubscriptionUrlFactory(new WPFunctions, SettingsController::getInstance(), new LinkTokens);
$linkTokens = ContainerWrapper::getInstance()->get(LinkTokens::class);
self::$instance = new SubscriptionUrlFactory(new WPFunctions, SettingsController::getInstance(), $linkTokens);
}
return self::$instance;
}

View File

@ -10,6 +10,7 @@ use MailPoet\Cron\CronHelper;
use MailPoet\Cron\Workers\SendingQueue\SendingErrorHandler;
use MailPoet\Cron\Workers\SendingQueue\SendingQueue as SendingQueueWorker;
use MailPoet\Cron\Workers\SendingQueue\SendingThrottlingHandler;
use MailPoet\Cron\Workers\SendingQueue\Tasks\Links as TasksLinks;
use MailPoet\Cron\Workers\SendingQueue\Tasks\Mailer as MailerTask;
use MailPoet\Cron\Workers\SendingQueue\Tasks\Newsletter as NewsletterTask;
use MailPoet\Cron\Workers\StatsNotifications\Scheduler as StatsNotificationsScheduler;
@ -79,6 +80,8 @@ class SendingQueueTest extends \MailPoetTest {
private $segmentsRepository;
/** @var WPFunctions */
private $wp;
/** @var TasksLinks */
private $tasksLinks;
public function _before() {
parent::_before();
@ -131,6 +134,7 @@ class SendingQueueTest extends \MailPoetTest {
$this->cronHelper = $this->diContainer->get(CronHelper::class);
$this->newslettersRepository = $this->diContainer->get(NewslettersRepository::class);
$this->segmentsRepository = $this->diContainer->get(SegmentsRepository::class);
$this->tasksLinks = $this->diContainer->get(TasksLinks::class);
$this->sendingQueueWorker = $this->getSendingQueueWorker(Stub::makeEmpty(NewslettersRepository::class, ['findOneById' => new NewsletterEntity()]));
}
@ -139,8 +143,9 @@ class SendingQueueTest extends \MailPoetTest {
}
private function getTrackedUnsubscribeURL() {
$linkTokens = new LinkTokens;
$data = Links::createUrlDataObject(
$linkTokens = $this->diContainer->get(LinkTokens::class);
$links = $this->diContainer->get(Links::class);
$data = $links->createUrlDataObject(
$this->subscriber->id,
$linkTokens->getToken($this->subscriber),
$this->queue->id,
@ -181,7 +186,8 @@ class SendingQueueTest extends \MailPoetTest {
$this->cronHelper,
$this->subscribersFinder,
$this->segmentsRepository,
$this->wp
$this->wp,
$this->tasksLinks
);
try {
$sendingQueueWorker->process();
@ -207,6 +213,7 @@ class SendingQueueTest extends \MailPoetTest {
$this->subscribersFinder,
$this->segmentsRepository,
$this->wp,
$this->tasksLinks,
Stub::make(
new MailerTask(),
[
@ -249,6 +256,7 @@ class SendingQueueTest extends \MailPoetTest {
$this->subscribersFinder,
$this->segmentsRepository,
$this->wp,
$this->tasksLinks,
Stub::make(
new MailerTask(),
[
@ -289,7 +297,8 @@ class SendingQueueTest extends \MailPoetTest {
$this->cronHelper,
$this->subscribersFinder,
$this->segmentsRepository,
$this->wp
$this->wp,
$this->tasksLinks
);
$sendingQueueWorker->process();
}
@ -1021,6 +1030,7 @@ class SendingQueueTest extends \MailPoetTest {
$this->subscribersFinder,
$this->segmentsRepository,
$this->wp,
$this->tasksLinks,
$mailerMock
);
}

View File

@ -25,7 +25,7 @@ class LinksTest extends \MailPoetTest {
];
$newsletter = (object)['id' => 1];
$queue = (object)['id' => 2];
$result = $this->links->saveLinks($links, $newsletter, $queue);
$this->links->saveLinks($links, $newsletter, $queue);
$newsletterLink = NewsletterLink::where('hash', $links[0]['hash'])
->findOne();
assert($newsletterLink instanceof NewsletterLink);

View File

@ -19,7 +19,11 @@ class GATrackingTest extends \MailPoetTest {
/** @var string[] */
private $renderedNewsletter;
/** @var GATracking */
private $tracking;
public function _before() {
$this->tracking = $this->diContainer->get(GATracking::class);
$this->internalHost = 'newsletters.mailpoet.com';
$this->gaCampaign = 'Spring email';
$this->link = add_query_arg(['foo' => 'bar', 'baz' => 'xyz'], 'http://www.mailpoet.com/');
@ -32,18 +36,16 @@ class GATrackingTest extends \MailPoetTest {
public function testItConditionallyAppliesGATracking() {
// No process (empty GA campaign)
$newsletter = Newsletter::createOrUpdate(['id' => 123]);
$tracking = new GATracking();
$result = $tracking->applyGATracking($this->renderedNewsletter, $newsletter, $this->internalHost);
$result = $this->tracking->applyGATracking($this->renderedNewsletter, $newsletter, $this->internalHost);
expect($result)->equals($this->renderedNewsletter);
// Process (filled GA campaign)
$newsletter->gaCampaign = $this->gaCampaign;
$newsletter->save();
$result = $tracking->applyGATracking($this->renderedNewsletter, $newsletter, $this->internalHost);
$result = $this->tracking->applyGATracking($this->renderedNewsletter, $newsletter, $this->internalHost);
expect($result)->notEquals($this->renderedNewsletter);
}
public function testItGetsGACampaignFromParentNewsletterForPostNotifications() {
$tracking = new GATracking();
$notification = Newsletter::create();
$notification->hydrate([
'type' => Newsletter::TYPE_NOTIFICATION,
@ -56,26 +58,24 @@ class GATrackingTest extends \MailPoetTest {
'type' => Newsletter::TYPE_NOTIFICATION_HISTORY,
]);
$notificationHistory->save();
$result = $tracking->applyGATracking($this->renderedNewsletter, $notificationHistory, $this->internalHost);
$result = $this->tracking->applyGATracking($this->renderedNewsletter, $notificationHistory, $this->internalHost);
expect($result)->notEquals($this->renderedNewsletter);
}
public function testItCanAddGAParamsToLinks() {
$tracking = new GATracking();
$newsletter = Newsletter::createOrUpdate([
'ga_campaign' => $this->gaCampaign,
]);
$result = $tracking->applyGATracking($this->renderedNewsletter, $newsletter, $this->internalHost);
$result = $this->tracking->applyGATracking($this->renderedNewsletter, $newsletter, $this->internalHost);
expect($result['text'])->stringContainsString('utm_campaign=' . urlencode($this->gaCampaign));
expect($result['html'])->stringContainsString('utm_campaign=' . urlencode($this->gaCampaign));
}
public function testItKeepsShorcodes() {
$tracking = new GATracking();
$newsletter = Newsletter::createOrUpdate([
'ga_campaign' => $this->gaCampaign,
]);
$result = $tracking->applyGATracking($this->renderedNewsletter, $newsletter, $this->internalHost);
$result = $this->tracking->applyGATracking($this->renderedNewsletter, $newsletter, $this->internalHost);
expect($result['text'])->stringContainsString('email=[subscriber:email]');
expect($result['html'])->stringContainsString('email=[subscriber:email]');
}