diff --git a/lib/Cron/Workers/SendingQueue/Tasks/Links.php b/lib/Cron/Workers/SendingQueue/Tasks/Links.php index e05482f0d5..f0c0f56c75 100644 --- a/lib/Cron/Workers/SendingQueue/Tasks/Links.php +++ b/lib/Cron/Workers/SendingQueue/Tasks/Links.php @@ -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, diff --git a/lib/Cron/Workers/SendingQueue/Tasks/Newsletter.php b/lib/Cron/Workers/SendingQueue/Tasks/Newsletter.php index cec51f3463..a97c48e80d 100644 --- a/lib/Cron/Workers/SendingQueue/Tasks/Newsletter.php +++ b/lib/Cron/Workers/SendingQueue/Tasks/Newsletter.php @@ -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 diff --git a/lib/DI/ContainerConfigurator.php b/lib/DI/ContainerConfigurator.php index e51f4d2a55..7ebdbb302a 100644 --- a/lib/DI/ContainerConfigurator.php +++ b/lib/DI/ContainerConfigurator.php @@ -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 diff --git a/lib/Newsletter/ViewInBrowser/ViewInBrowserRenderer.php b/lib/Newsletter/ViewInBrowser/ViewInBrowserRenderer.php index a2405e2734..0aa677f078 100644 --- a/lib/Newsletter/ViewInBrowser/ViewInBrowserRenderer.php +++ b/lib/Newsletter/ViewInBrowser/ViewInBrowserRenderer.php @@ -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 diff --git a/lib/Router/Endpoints/Track.php b/lib/Router/Endpoints/Track.php index e957d8a37e..77801be810 100644 --- a/lib/Router/Endpoints/Track.php +++ b/lib/Router/Endpoints/Track.php @@ -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 diff --git a/lib/Statistics/GATracking.php b/lib/Statistics/GATracking.php index 42181f65b8..5486660ac6 100644 --- a/lib/Statistics/GATracking.php +++ b/lib/Statistics/GATracking.php @@ -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); diff --git a/lib/Subscription/SubscriptionUrlFactory.php b/lib/Subscription/SubscriptionUrlFactory.php index 5393065773..585bf2081f 100644 --- a/lib/Subscription/SubscriptionUrlFactory.php +++ b/lib/Subscription/SubscriptionUrlFactory.php @@ -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; } diff --git a/tests/integration/Cron/Workers/SendingQueue/SendingQueueTest.php b/tests/integration/Cron/Workers/SendingQueue/SendingQueueTest.php index 6588ce73b6..a5e7a0973f 100644 --- a/tests/integration/Cron/Workers/SendingQueue/SendingQueueTest.php +++ b/tests/integration/Cron/Workers/SendingQueue/SendingQueueTest.php @@ -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 ); } diff --git a/tests/integration/Cron/Workers/SendingQueue/Tasks/LinksTest.php b/tests/integration/Cron/Workers/SendingQueue/Tasks/LinksTest.php index 996832573f..3d7cd60c43 100644 --- a/tests/integration/Cron/Workers/SendingQueue/Tasks/LinksTest.php +++ b/tests/integration/Cron/Workers/SendingQueue/Tasks/LinksTest.php @@ -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); diff --git a/tests/integration/Statistics/GATrackingTest.php b/tests/integration/Statistics/GATrackingTest.php index b0be840bdd..059469c890 100644 --- a/tests/integration/Statistics/GATrackingTest.php +++ b/tests/integration/Statistics/GATrackingTest.php @@ -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]'); }