Use Newsletter\Links as service
[MAILPOET-3269]
This commit is contained in:
@ -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,
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
);
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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]');
|
||||
}
|
||||
|
Reference in New Issue
Block a user