Extract newsletter validation to a service
[MAILPOET-4236]
This commit is contained in:
committed by
Veljko V
parent
f547eea48b
commit
fdaf22d46b
@ -17,8 +17,8 @@ use MailPoet\Newsletter\NewslettersRepository;
|
|||||||
use MailPoet\Newsletter\Scheduler\Scheduler;
|
use MailPoet\Newsletter\Scheduler\Scheduler;
|
||||||
use MailPoet\Newsletter\Sending\ScheduledTasksRepository;
|
use MailPoet\Newsletter\Sending\ScheduledTasksRepository;
|
||||||
use MailPoet\Newsletter\Sending\SendingQueuesRepository;
|
use MailPoet\Newsletter\Sending\SendingQueuesRepository;
|
||||||
|
use MailPoet\Newsletter\Validator;
|
||||||
use MailPoet\Segments\SubscribersFinder;
|
use MailPoet\Segments\SubscribersFinder;
|
||||||
use MailPoet\Services\Bridge;
|
|
||||||
use MailPoet\Tasks\Sending as SendingTask;
|
use MailPoet\Tasks\Sending as SendingTask;
|
||||||
use MailPoet\Util\License\Features\Subscribers as SubscribersFeature;
|
use MailPoet\Util\License\Features\Subscribers as SubscribersFeature;
|
||||||
|
|
||||||
@ -36,9 +36,6 @@ class SendingQueue extends APIEndpoint {
|
|||||||
/** @var NewslettersRepository */
|
/** @var NewslettersRepository */
|
||||||
private $newsletterRepository;
|
private $newsletterRepository;
|
||||||
|
|
||||||
/** @var Bridge */
|
|
||||||
private $bridge;
|
|
||||||
|
|
||||||
/** @var SendingQueuesRepository */
|
/** @var SendingQueuesRepository */
|
||||||
private $sendingQueuesRepository;
|
private $sendingQueuesRepository;
|
||||||
|
|
||||||
@ -51,24 +48,27 @@ class SendingQueue extends APIEndpoint {
|
|||||||
/** @var Scheduler */
|
/** @var Scheduler */
|
||||||
private $scheduler;
|
private $scheduler;
|
||||||
|
|
||||||
|
/** @var Validator */
|
||||||
|
private $validator;
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
SubscribersFeature $subscribersFeature,
|
SubscribersFeature $subscribersFeature,
|
||||||
NewslettersRepository $newsletterRepository,
|
NewslettersRepository $newsletterRepository,
|
||||||
SendingQueuesRepository $sendingQueuesRepository,
|
SendingQueuesRepository $sendingQueuesRepository,
|
||||||
Bridge $bridge,
|
|
||||||
SubscribersFinder $subscribersFinder,
|
SubscribersFinder $subscribersFinder,
|
||||||
ScheduledTasksRepository $scheduledTasksRepository,
|
ScheduledTasksRepository $scheduledTasksRepository,
|
||||||
MailerFactory $mailerFactory,
|
MailerFactory $mailerFactory,
|
||||||
Scheduler $scheduler
|
Scheduler $scheduler,
|
||||||
|
Validator $validator
|
||||||
) {
|
) {
|
||||||
$this->subscribersFeature = $subscribersFeature;
|
$this->subscribersFeature = $subscribersFeature;
|
||||||
$this->subscribersFinder = $subscribersFinder;
|
$this->subscribersFinder = $subscribersFinder;
|
||||||
$this->newsletterRepository = $newsletterRepository;
|
$this->newsletterRepository = $newsletterRepository;
|
||||||
$this->bridge = $bridge;
|
|
||||||
$this->sendingQueuesRepository = $sendingQueuesRepository;
|
$this->sendingQueuesRepository = $sendingQueuesRepository;
|
||||||
$this->scheduledTasksRepository = $scheduledTasksRepository;
|
$this->scheduledTasksRepository = $scheduledTasksRepository;
|
||||||
$this->mailerFactory = $mailerFactory;
|
$this->mailerFactory = $mailerFactory;
|
||||||
$this->scheduler = $scheduler;
|
$this->scheduler = $scheduler;
|
||||||
|
$this->validator = $validator;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function add($data = []) {
|
public function add($data = []) {
|
||||||
@ -97,7 +97,7 @@ class SendingQueue extends APIEndpoint {
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
$validationError = $this->validateNewsletter($newsletterEntity);
|
$validationError = $this->validator->validate($newsletterEntity);
|
||||||
if ($validationError) {
|
if ($validationError) {
|
||||||
return $this->errorResponse([
|
return $this->errorResponse([
|
||||||
APIError::BAD_REQUEST => $validationError,
|
APIError::BAD_REQUEST => $validationError,
|
||||||
@ -178,30 +178,6 @@ class SendingQueue extends APIEndpoint {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function validateNewsletter(NewsletterEntity $newsletterEntity): ?string {
|
|
||||||
if (
|
|
||||||
$newsletterEntity->getBody()
|
|
||||||
&& is_array($newsletterEntity->getBody())
|
|
||||||
&& $newsletterEntity->getBody()['content']
|
|
||||||
) {
|
|
||||||
$body = json_encode($newsletterEntity->getBody()['content']);
|
|
||||||
if ($body === false) {
|
|
||||||
return __('Poet, please add prose to your masterpiece before you send it to your followers.');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (
|
|
||||||
$this->bridge->isMailpoetSendingServiceEnabled()
|
|
||||||
&& (strpos($body, '[link:subscription_unsubscribe_url]') === false)
|
|
||||||
&& (strpos($body, '[link:subscription_unsubscribe]') === false)
|
|
||||||
) {
|
|
||||||
return __('All emails must include an "Unsubscribe" link. Add a footer widget to your email to continue.');
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return __('Poet, please add prose to your masterpiece before you send it to your followers.');
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function pause($data = []) {
|
public function pause($data = []) {
|
||||||
$newsletterId = (isset($data['newsletter_id'])
|
$newsletterId = (isset($data['newsletter_id'])
|
||||||
? (int)$data['newsletter_id']
|
? (int)$data['newsletter_id']
|
||||||
|
@ -391,6 +391,7 @@ class ContainerConfigurator implements IContainerConfigurator {
|
|||||||
$container->autowire(\MailPoet\Newsletter\AutomaticEmailsRepository::class)->setPublic(true);
|
$container->autowire(\MailPoet\Newsletter\AutomaticEmailsRepository::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\Newsletter\NewsletterHtmlSanitizer::class)->setPublic(true);
|
$container->autowire(\MailPoet\Newsletter\NewsletterHtmlSanitizer::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\Newsletter\Url::class)->setPublic(true);
|
$container->autowire(\MailPoet\Newsletter\Url::class)->setPublic(true);
|
||||||
|
$container->autowire(\MailPoet\Newsletter\Validator::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\Newsletter\Links\Links::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\Listing\NewsletterListingRepository::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\Newsletter\Options\NewsletterOptionsRepository::class)->setPublic(true);
|
$container->autowire(\MailPoet\Newsletter\Options\NewsletterOptionsRepository::class)->setPublic(true);
|
||||||
|
42
mailpoet/lib/Newsletter/Validator.php
Normal file
42
mailpoet/lib/Newsletter/Validator.php
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
<?php declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace MailPoet\Newsletter;
|
||||||
|
|
||||||
|
use MailPoet\Entities\NewsletterEntity;
|
||||||
|
use MailPoet\Services\Bridge;
|
||||||
|
|
||||||
|
class Validator {
|
||||||
|
|
||||||
|
/** @var Bridge */
|
||||||
|
private $bridge;
|
||||||
|
|
||||||
|
public function __construct(
|
||||||
|
Bridge $bridge
|
||||||
|
) {
|
||||||
|
$this->bridge = $bridge;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function validate(NewsletterEntity $newsletterEntity): ?string {
|
||||||
|
if (
|
||||||
|
$newsletterEntity->getBody()
|
||||||
|
&& is_array($newsletterEntity->getBody())
|
||||||
|
&& $newsletterEntity->getBody()['content']
|
||||||
|
) {
|
||||||
|
$body = json_encode($newsletterEntity->getBody()['content']);
|
||||||
|
if ($body === false) {
|
||||||
|
return __('Poet, please add prose to your masterpiece before you send it to your followers.');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
$this->bridge->isMailpoetSendingServiceEnabled()
|
||||||
|
&& (strpos($body, '[link:subscription_unsubscribe_url]') === false)
|
||||||
|
&& (strpos($body, '[link:subscription_unsubscribe]') === false)
|
||||||
|
) {
|
||||||
|
return __('All emails must include an "Unsubscribe" link. Add a footer widget to your email to continue.');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return __('Poet, please add prose to your masterpiece before you send it to your followers.');
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
@ -18,6 +18,7 @@ use MailPoet\Newsletter\Options\NewsletterOptionsRepository;
|
|||||||
use MailPoet\Newsletter\Scheduler\Scheduler;
|
use MailPoet\Newsletter\Scheduler\Scheduler;
|
||||||
use MailPoet\Newsletter\Sending\ScheduledTasksRepository;
|
use MailPoet\Newsletter\Sending\ScheduledTasksRepository;
|
||||||
use MailPoet\Newsletter\Sending\SendingQueuesRepository;
|
use MailPoet\Newsletter\Sending\SendingQueuesRepository;
|
||||||
|
use MailPoet\Newsletter\Validator;
|
||||||
use MailPoet\Segments\SubscribersFinder;
|
use MailPoet\Segments\SubscribersFinder;
|
||||||
use MailPoet\Services\Bridge;
|
use MailPoet\Services\Bridge;
|
||||||
use MailPoet\Settings\SettingsController;
|
use MailPoet\Settings\SettingsController;
|
||||||
@ -80,11 +81,11 @@ class SendingQueueTest extends \MailPoetTest {
|
|||||||
]),
|
]),
|
||||||
$this->diContainer->get(NewslettersRepository::class),
|
$this->diContainer->get(NewslettersRepository::class),
|
||||||
$this->diContainer->get(SendingQueuesRepository::class),
|
$this->diContainer->get(SendingQueuesRepository::class),
|
||||||
$this->diContainer->get(Bridge::class),
|
|
||||||
$this->diContainer->get(SubscribersFinder::class),
|
$this->diContainer->get(SubscribersFinder::class),
|
||||||
$this->diContainer->get(ScheduledTasksRepository::class),
|
$this->diContainer->get(ScheduledTasksRepository::class),
|
||||||
$this->diContainer->get(MailerFactory::class),
|
$this->diContainer->get(MailerFactory::class),
|
||||||
$this->diContainer->get(Scheduler::class)
|
$this->diContainer->get(Scheduler::class),
|
||||||
|
$this->diContainer->get(Validator::class)
|
||||||
);
|
);
|
||||||
$res = $sendingQueue->add(['newsletter_id' => $this->newsletter->getId()]);
|
$res = $sendingQueue->add(['newsletter_id' => $this->newsletter->getId()]);
|
||||||
expect($res->status)->equals(APIResponse::STATUS_FORBIDDEN);
|
expect($res->status)->equals(APIResponse::STATUS_FORBIDDEN);
|
||||||
@ -149,13 +150,13 @@ class SendingQueueTest extends \MailPoetTest {
|
|||||||
$this->diContainer->get(SubscribersFeature::class),
|
$this->diContainer->get(SubscribersFeature::class),
|
||||||
$this->diContainer->get(NewslettersRepository::class),
|
$this->diContainer->get(NewslettersRepository::class),
|
||||||
$this->diContainer->get(SendingQueuesRepository::class),
|
$this->diContainer->get(SendingQueuesRepository::class),
|
||||||
Stub::make(Bridge::class, [
|
|
||||||
'isMailpoetSendingServiceEnabled' => true,
|
|
||||||
]),
|
|
||||||
$this->diContainer->get(SubscribersFinder::class),
|
$this->diContainer->get(SubscribersFinder::class),
|
||||||
$this->diContainer->get(ScheduledTasksRepository::class),
|
$this->diContainer->get(ScheduledTasksRepository::class),
|
||||||
$this->diContainer->get(MailerFactory::class),
|
$this->diContainer->get(MailerFactory::class),
|
||||||
$this->diContainer->get(Scheduler::class)
|
$this->diContainer->get(Scheduler::class),
|
||||||
|
new Validator(Stub::make(Bridge::class, [
|
||||||
|
'isMailpoetSendingServiceEnabled' => true,
|
||||||
|
]))
|
||||||
);
|
);
|
||||||
$response = $sendingQueue->add(['newsletter_id' => $newsletter->getId()]);
|
$response = $sendingQueue->add(['newsletter_id' => $newsletter->getId()]);
|
||||||
$response = $response->getData();
|
$response = $response->getData();
|
||||||
|
Reference in New Issue
Block a user