Use Newsletter\Url as service

[MAILPOET-3269]
This commit is contained in:
Jan Lysý
2021-05-28 11:21:32 +02:00
committed by Veljko V
parent c9636ebf1b
commit aeeceeeb8d
16 changed files with 130 additions and 35 deletions

View File

@ -32,14 +32,19 @@ class NewslettersResponseBuilder {
/** @var EntityManager */
private $entityManager;
/** @var NewsletterUrl */
private $newsletterUrl;
public function __construct(
EntityManager $entityManager,
NewslettersRepository $newslettersRepository,
NewsletterStatisticsRepository $newslettersStatsRepository
NewsletterStatisticsRepository $newslettersStatsRepository,
NewsletterUrl $newsletterUrl
) {
$this->newslettersStatsRepository = $newslettersStatsRepository;
$this->newslettersRepository = $newslettersRepository;
$this->entityManager = $entityManager;
$this->newsletterUrl = $newsletterUrl;
}
public function build(NewsletterEntity $newsletter, $relations = []) {
@ -125,7 +130,7 @@ class NewslettersResponseBuilder {
'statistics' => ($statistics && $newsletter->getType() !== NewsletterEntity::TYPE_NOTIFICATION)
? $statistics->asArray()
: false,
'preview_url' => NewsletterUrl::getViewInBrowserUrl(
'preview_url' => $this->newsletterUrl->getViewInBrowserUrl(
(object)[
'id' => $newsletter->getId(),
'hash' => $newsletter->getHash(),

View File

@ -72,6 +72,9 @@ class Newsletters extends APIEndpoint {
/** @var NewsletterSaveController */
private $newsletterSaveController;
/** @var NewsletterUrl */
private $newsletterUrl;
public function __construct(
Listing\Handler $listingHandler,
WPFunctions $wp,
@ -84,7 +87,8 @@ class Newsletters extends APIEndpoint {
Emoji $emoji,
SubscribersFeature $subscribersFeature,
SendPreviewController $sendPreviewController,
NewsletterSaveController $newsletterSaveController
NewsletterSaveController $newsletterSaveController,
NewsletterUrl $newsletterUrl
) {
$this->listingHandler = $listingHandler;
$this->wp = $wp;
@ -98,6 +102,7 @@ class Newsletters extends APIEndpoint {
$this->subscribersFeature = $subscribersFeature;
$this->sendPreviewController = $sendPreviewController;
$this->newsletterSaveController = $newsletterSaveController;
$this->newsletterUrl = $newsletterUrl;
}
public function get($data = []) {
@ -375,7 +380,7 @@ class Newsletters extends APIEndpoint {
private function getViewInBrowserUrl(NewsletterEntity $newsletter): string {
$this->fixMissingHash([$newsletter]); // Fix for MAILPOET-3275. Remove after May 2021
$url = NewsletterUrl::getViewInBrowserUrl(
$url = $this->newsletterUrl->getViewInBrowserUrl(
(object)[
'id' => $newsletter->getId(),
'hash' => $newsletter->getHash(),

View File

@ -25,16 +25,21 @@ class Shortcodes {
/** @var SubscribersRepository */
private $subscribersRepository;
/** @var NewsletterUrl */
private $newsletterUrl;
public function __construct(
Pages $subscriptionPages,
WPFunctions $wp,
SegmentSubscribersRepository $segmentSubscribersRepository,
SubscribersRepository $subscribersRepository
SubscribersRepository $subscribersRepository,
NewsletterUrl $newsletterUrl
) {
$this->subscriptionPages = $subscriptionPages;
$this->wp = $wp;
$this->segmentSubscribersRepository = $segmentSubscribersRepository;
$this->subscribersRepository = $subscribersRepository;
$this->newsletterUrl = $newsletterUrl;
}
public function init() {
@ -145,7 +150,7 @@ class Shortcodes {
}
public function renderArchiveSubject($newsletter, $subscriber, $queue) {
$previewUrl = NewsletterUrl::getViewInBrowserUrl($newsletter, $subscriber, $queue);
$previewUrl = $this->newsletterUrl->getViewInBrowserUrl($newsletter, $subscriber, $queue);
return '<a href="' . esc_attr($previewUrl) . '" target="_blank" title="'
. esc_attr(__('Preview in a new tab', 'mailpoet')) . '">'
. esc_attr($newsletter->newsletterRenderedSubject) .

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\Url::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);

View File

@ -19,14 +19,19 @@ class Link implements CategoryInterface {
/** @var SettingsController */
private $settings;
/** @var NewsletterUrl */
private $newsletterUrl;
/** @var WPFunctions */
private $wp;
public function __construct(
SettingsController $settings,
NewsletterUrl $newsletterUrl,
WPFunctions $wp
) {
$this->settings = $settings;
$this->newsletterUrl = $newsletterUrl;
$this->wp = $wp;
}
@ -69,7 +74,7 @@ class Link implements CategoryInterface {
);
case 'newsletter_view_in_browser_url':
$url = NewsletterUrl::getViewInBrowserUrl(
$url = $this->newsletterUrl->getViewInBrowserUrl(
$newsletterModel,
$wpUserPreview ? null : $subscriberModel,
$queueModel,
@ -124,7 +129,7 @@ class Link implements CategoryInterface {
$url = $subscriptionUrlFactory->getManageUrl($subscriberModel);
break;
case 'newsletter_view_in_browser_url':
$url = NewsletterUrl::getViewInBrowserUrl(
$url = $this->newsletterUrl->getViewInBrowserUrl(
$newsletterModel,
$subscriberModel,
$queueModel,

View File

@ -2,23 +2,38 @@
namespace MailPoet\Newsletter;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\Models\Subscriber as SubscriberModel;
use MailPoet\Router\Endpoints\ViewInBrowser as ViewInBrowserEndpoint;
use MailPoet\Router\Router;
use MailPoet\Subscribers\LinkTokens;
use MailPoet\Subscribers\SubscribersRepository;
class Url {
public static function getViewInBrowserUrl(
/** @var LinkTokens */
private $linkTokens;
/** @var SubscribersRepository */
private $subscribersRepository;
public function __construct(LinkTokens $linkTokens, SubscribersRepository $subscribersRepository) {
$this->linkTokens = $linkTokens;
$this->subscribersRepository = $subscribersRepository;
}
public function getViewInBrowserUrl(
$newsletter,
$subscriber = false,
$queue = false,
bool $preview = true
) {
$linkTokens = new LinkTokens;
if ($subscriber instanceof SubscriberModel) {
$subscriber->token = $linkTokens->getToken($subscriber);
$subscriberEntity = $this->subscribersRepository->findOneById($subscriber->id);
if ($subscriberEntity instanceof SubscriberEntity) {
$subscriber->token = $this->linkTokens->getToken($subscriberEntity);
}
$data = self::createUrlDataObject($newsletter, $subscriber, $queue, $preview);
}
$data = $this->createUrlDataObject($newsletter, $subscriber, $queue, $preview);
return Router::buildRequest(
ViewInBrowserEndpoint::ENDPOINT,
ViewInBrowserEndpoint::ACTION_VIEW,
@ -26,7 +41,7 @@ class Url {
);
}
public static function createUrlDataObject($newsletter, $subscriber, $queue, $preview) {
public function createUrlDataObject($newsletter, $subscriber, $queue, $preview) {
return [
(!empty($newsletter->id)) ?
(int)$newsletter->id :
@ -47,7 +62,7 @@ class Url {
];
}
public static function transformUrlDataObject($data) {
public function transformUrlDataObject($data) {
reset($data);
if (!is_int(key($data))) return $data;
$transformedData = [];

View File

@ -13,6 +13,9 @@ class ViewInBrowserController {
/** @var LinkTokens */
private $linkTokens;
/** @var NewsletterUrl */
private $newsletterUrl;
/** @var ViewInBrowserRenderer */
private $viewInBrowserRenderer;
@ -24,6 +27,7 @@ class ViewInBrowserController {
public function __construct(
LinkTokens $linkTokens,
NewsletterUrl $newsletterUrl,
ViewInBrowserRenderer $viewInBrowserRenderer,
SendingQueuesRepository $sendingQueuesRepository,
SubscribersRepository $subscribersRepository
@ -32,10 +36,11 @@ class ViewInBrowserController {
$this->viewInBrowserRenderer = $viewInBrowserRenderer;
$this->subscribersRepository = $subscribersRepository;
$this->sendingQueuesRepository = $sendingQueuesRepository;
$this->newsletterUrl = $newsletterUrl;
}
public function view(array $data) {
$data = NewsletterUrl::transformUrlDataObject($data);
$data = $this->newsletterUrl->transformUrlDataObject($data);
$isPreview = !empty($data['preview']);
$newsletter = $this->getNewsletter($data);
$subscriber = $this->getSubscriber($data);

View File

@ -5,13 +5,20 @@ namespace MailPoet\Subscribers\ImportExport\PersonalDataExporters;
use MailPoet\Models\Newsletter;
use MailPoet\Models\StatisticsNewsletters;
use MailPoet\Models\Subscriber;
use MailPoet\Newsletter\Url;
use MailPoet\Newsletter\Url as NewsletterUrl;
use MailPoet\WP\Functions as WPFunctions;
class NewslettersExporter {
const LIMIT = 100;
/** @var NewsletterUrl */
private $newsletterUrl;
public function __construct(NewsletterUrl $newsletterUrl) {
$this->newsletterUrl = $newsletterUrl;
}
public function export($email, $page = 1) {
$data = $this->exportSubscriber(Subscriber::findOne(trim($email)), $page);
return [
@ -67,7 +74,7 @@ class NewslettersExporter {
if (isset($newsletters[$statisticsRow['newsletter_id']])) {
$newsletterData[] = [
'name' => WPFunctions::get()->__('Email preview', 'mailpoet'),
'value' => Url::getViewInBrowserUrl(
'value' => $this->newsletterUrl->getViewInBrowserUrl(
$newsletters[$statisticsRow['newsletter_id']],
$subscriber
),

View File

@ -5,11 +5,13 @@ namespace MailPoet\Subscription;
use MailPoet\Config\Renderer as TemplateRenderer;
use MailPoet\Form\Block\Date as FormBlockDate;
use MailPoet\Form\Renderer as FormRenderer;
use MailPoet\InvalidStateException;
use MailPoet\Models\CustomField;
use MailPoet\Models\Segment;
use MailPoet\Models\Subscriber;
use MailPoet\Settings\SettingsController;
use MailPoet\Subscribers\LinkTokens;
use MailPoet\Subscribers\SubscribersRepository;
use MailPoet\Util\Helpers;
use MailPoet\Util\Url as UrlHelper;
use MailPoet\WP\Functions as WPFunctions;
@ -39,6 +41,9 @@ class ManageSubscriptionFormRenderer {
/** @var TemplateRenderer */
private $templateRenderer;
/** @var SubscribersRepository */
private $subscribersRepository;
public function __construct(
WPFunctions $wp,
SettingsController $settings,
@ -46,7 +51,8 @@ class ManageSubscriptionFormRenderer {
LinkTokens $linkTokens,
FormRenderer $formRenderer,
FormBlockDate $dateBlock,
TemplateRenderer $templateRenderer
TemplateRenderer $templateRenderer,
SubscribersRepository $subscribersRepository
) {
$this->wp = $wp;
$this->settings = $settings;
@ -55,6 +61,7 @@ class ManageSubscriptionFormRenderer {
$this->formRenderer = $formRenderer;
$this->dateBlock = $dateBlock;
$this->templateRenderer = $templateRenderer;
$this->subscribersRepository = $subscribersRepository;
}
public function renderForm(Subscriber $subscriber, string $formState = self::FORM_STATE_NOT_SUBMITTED): string {
@ -79,11 +86,15 @@ class ManageSubscriptionFormRenderer {
$form = $this->wp->applyFilters('mailpoet_manage_subscription_page_form_fields', $form);
$subscriberEntity = $this->subscribersRepository->findOneById($subscriber->id);
if (!$subscriberEntity) {
throw new InvalidStateException();
}
$templateData = [
'actionUrl' => admin_url('admin-post.php'),
'redirectUrl' => $this->urlHelper->getCurrentUrl(),
'email' => $subscriber->email,
'token' => $this->linkTokens->getToken($subscriber),
'token' => $this->linkTokens->getToken($subscriberEntity),
'editEmailInfo' => __('Need to change your email address? Unsubscribe here, then simply sign up again.', 'mailpoet'),
'formHtml' => $this->formRenderer->renderBlocks($form, [], $honeypot = false, $captcha = false),
'formState' => $formState,

View File

@ -10,6 +10,13 @@ use MailPoet\Newsletter\Url as NewsletterUrl;
use MailPoetVendor\Carbon\Carbon;
class State {
/** @var NewsletterUrl */
private $newsletterUrl;
public function __construct(NewsletterUrl $newsletterUrl) {
$this->newsletterUrl = $newsletterUrl;
}
/**
* @return array
*/
@ -88,7 +95,7 @@ class State {
'newsletter_id' => (int)$queue->newsletterId,
'queue_id' => (int)$queue->id,
'subject' => $queue->newsletterRenderedSubject ?: $newsletter->subject,
'preview_url' => NewsletterUrl::getViewInBrowserUrl(
'preview_url' => $this->newsletterUrl->getViewInBrowserUrl(
$newsletter,
null,
$queue

View File

@ -79,6 +79,9 @@ class NewslettersTest extends \MailPoetTest {
/** @var NewslettersResponseBuilder */
private $newslettersResponseBuilder;
/** @var Url */
private $newsletterUrl;
public function _before() {
parent::_before();
$this->cronHelper = ContainerWrapper::getInstance()->get(CronHelper::class);
@ -88,6 +91,7 @@ class NewslettersTest extends \MailPoetTest {
$this->segmentRepository = ContainerWrapper::getInstance()->get(SegmentsRepository::class);
$this->newsletterSegmentRepository = ContainerWrapper::getInstance()->get(NewsletterSegmentRepository::class);
$this->newslettersResponseBuilder = ContainerWrapper::getInstance()->get(NewslettersResponseBuilder::class);
$this->newsletterUrl = ContainerWrapper::getInstance()->get(Url::class);
$this->endpoint = Stub::copy(
ContainerWrapper::getInstance()->get(Newsletters::class),
[
@ -97,7 +101,8 @@ class NewslettersTest extends \MailPoetTest {
new NewsletterStatisticsRepository(
$this->diContainer->get(EntityManager::class),
$this->makeEmpty(WCHelper::class)
)
),
$this->diContainer->get(Url::class)
),
]
);
@ -648,7 +653,7 @@ class NewslettersTest extends \MailPoetTest {
$response = $this->endpoint->listing();
$previewLink = $response->data[0]['preview_url'];
parse_str((string)parse_url($previewLink, PHP_URL_QUERY), $previewLinkData);
$previewLinkData = Url::transformUrlDataObject(Router::decodeRequestData($previewLinkData['data']));
$previewLinkData = $this->newsletterUrl->transformUrlDataObject(Router::decodeRequestData($previewLinkData['data']));
expect($previewLinkData['newsletter_hash'])->notEmpty();
expect($previewLinkData['subscriber_id'])->false();
expect($previewLinkData['subscriber_token'])->false();
@ -680,7 +685,8 @@ class NewslettersTest extends \MailPoetTest {
$mocks['emoji'] ?? $this->diContainer->get(Emoji::class),
$mocks['subscribersFeature'] ?? $this->diContainer->get(SubscribersFeature::class),
$mocks['sendPreviewController'] ?? $this->diContainer->get(SendPreviewController::class),
$this->diContainer->get(NewsletterSaveController::class)
$this->diContainer->get(NewsletterSaveController::class),
$this->diContainer->get(Url::class)
);
}

View File

@ -1,10 +1,9 @@
<?php
namespace MailPoet\Test\Config;
namespace MailPoet\Config;
use Codeception\Util\Fixtures;
use Helper\WordPress;
use MailPoet\Config\Shortcodes;
use MailPoet\DI\ContainerWrapper;
use MailPoet\Models\Newsletter;
use MailPoet\Models\ScheduledTask;
@ -20,8 +19,12 @@ class ShortcodesTest extends \MailPoetTest {
public $queue;
public $newsletter;
/** @var Url */
private $newsletterUrl;
public function _before() {
parent::_before();
$this->newsletterUrl = $this->diContainer->get(Url::class);
$newsletter = Newsletter::create();
$newsletter->type = Newsletter::TYPE_STANDARD;
$newsletter->status = Newsletter::STATUS_SENT;
@ -55,7 +58,7 @@ class ShortcodesTest extends \MailPoetTest {
expect($link)->stringContainsString('endpoint=view_in_browser');
$parsedLink = parse_url($link, PHP_URL_QUERY);
parse_str(html_entity_decode((string)$parsedLink), $data);
$requestData = Url::transformUrlDataObject(
$requestData = $this->newsletterUrl->transformUrlDataObject(
Router::decodeRequestData($data['data'])
);
expect($requestData['newsletter_hash'])->equals($this->newsletter->hash);

View File

@ -24,10 +24,14 @@ class SendPreviewControllerTest extends \MailPoetTest {
/** @var NewsletterEntity */
private $newsletter;
/** @var Url */
private $newsletterUrl;
public function _before() {
parent::_before();
$this->truncateEntity(NewsletterEntity::class);
$this->truncateEntity(SubscriberEntity::class);
$this->newsletterUrl = $this->diContainer->get(Url::class);
$this->subscriptionUrlFactory = SubscriptionUrlFactory::getInstance();
$newsletter = new NewsletterEntity();
$newsletter->setType(NewsletterEntity::TYPE_STANDARD);
@ -61,7 +65,7 @@ class SendPreviewControllerTest extends \MailPoetTest {
function ($newsletter, $subscriber, $extraParams) {
$unsubscribeLink = $this->subscriptionUrlFactory->getConfirmUnsubscribeUrl(null);
$manageLink = $this->subscriptionUrlFactory->getManageUrl(null);
$viewInBrowserLink = Url::getViewInBrowserUrl(
$viewInBrowserLink = $this->newsletterUrl->getViewInBrowserUrl(
(object)[
'id' => $this->newsletter->getId(),
'hash' => $this->newsletter->getHash(),

View File

@ -37,10 +37,18 @@ class ShortcodesTest extends \MailPoetTest {
/** @var SubscriptionUrlFactory */
private $subscriptionUrlFactory;
/** @var LinkTokens */
private $linkTokens;
/** @var NewsletterUrl */
private $newsletterUrl;
public function _before() {
parent::_before();
$this->cleanup();
$this->settings = SettingsController::getInstance();
$this->linkTokens = $this->diContainer->get(LinkTokens::class);
$this->newsletterUrl = $this->diContainer->get(NewsletterUrl::class);
$populator = $this->diContainer->get(Populator::class);
$populator->up();
$this->wPUser = $this->_createWPUser();
@ -54,7 +62,7 @@ class ShortcodesTest extends \MailPoetTest {
$this->shortcodesObject->setSubscriber($this->subscriber);
$this->shortcodesObject->setWpUserPreview(false);
$this->settings->set('tracking.enabled', false);
$this->subscriptionUrlFactory = new SubscriptionUrlFactory(WPFunctions::get(), $this->settings, new LinkTokens);
$this->subscriptionUrlFactory = new SubscriptionUrlFactory(WPFunctions::get(), $this->settings, $this->linkTokens);
$this->entityManager->flush();
}
@ -292,7 +300,7 @@ class ShortcodesTest extends \MailPoetTest {
$parsedUrlQuery = parse_url($link, PHP_URL_QUERY);
$queryData = [];
parse_str((string)$parsedUrlQuery, $queryData);
return NewsletterUrl::transformUrlDataObject(json_decode(base64_decode($queryData['data']), true));
return $this->newsletterUrl->transformUrlDataObject(json_decode(base64_decode($queryData['data']), true));
}
public function testItReturnsShortcodeWhenTrackingEnabled() {
@ -346,7 +354,7 @@ class ShortcodesTest extends \MailPoetTest {
$this->subscriptionUrlFactory->getConfirmUnsubscribeUrl(null),
$this->subscriptionUrlFactory->getUnsubscribeUrl(null),
$this->subscriptionUrlFactory->getManageUrl(null),
NewsletterUrl::getViewInBrowserUrl($newsletterModel),
$this->newsletterUrl->getViewInBrowserUrl($newsletterModel),
];
$result = $shortcodesObject->process($shortcodes);
// hash is returned

View File

@ -8,8 +8,8 @@ use MailPoet\Entities\ScheduledTaskEntity;
use MailPoet\Entities\SendingQueueEntity;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\Models\Newsletter;
use MailPoet\Models\Subscriber;
use MailPoet\Newsletter\Sending\SendingQueuesRepository;
use MailPoet\Newsletter\Url;
use MailPoet\Subscribers\LinkTokens;
use MailPoet\Subscribers\SubscribersRepository;
use MailPoet\Tasks\Sending as SendingTask;
@ -39,12 +39,16 @@ class ViewInBrowserControllerTest extends \MailPoetTest {
/** @var SendingQueuesRepository */
private $sendingQueuesRepository;
/** @var Url */
private $newsletterUrl;
public function _before() {
// instantiate class
$this->viewInBrowserController = $this->diContainer->get(ViewInBrowserController::class);
$this->linkTokens = $this->diContainer->get(LinkTokens::class);
$this->subscribersRepository = $this->diContainer->get(SubscribersRepository::class);
$this->sendingQueuesRepository = $this->diContainer->get(SendingQueuesRepository::class);
$this->newsletterUrl = $this->diContainer->get(Url::class);
// create newsletter
$newsletter = Newsletter::create();
@ -230,6 +234,7 @@ class ViewInBrowserControllerTest extends \MailPoetTest {
private function createController($viewInBrowserRenderer): ViewInBrowserController {
return new ViewInBrowserController(
$this->linkTokens,
$this->newsletterUrl,
$viewInBrowserRenderer,
$this->sendingQueuesRepository,
$this->subscribersRepository

View File

@ -6,6 +6,7 @@ use MailPoet\Cron\Workers\SendingQueue\Migration;
use MailPoet\Models\Newsletter;
use MailPoet\Models\ScheduledTask;
use MailPoet\Models\SendingQueue;
use MailPoet\Newsletter\Url;
use MailPoet\Tasks\Sending as SendingTask;
use MailPoet\Tasks\State;
use MailPoetVendor\Idiorm\ORM;
@ -17,7 +18,9 @@ class StateTest extends \MailPoetTest {
public function _before() {
parent::_before();
$this->tasksState = new State();
$this->tasksState = new State(
$this->diContainer->get(Url::class)
);
}
public function testItCanFetchBasicTasksData() {