diff --git a/lib/API/JSON/v1/Newsletters.php b/lib/API/JSON/v1/Newsletters.php index f22efa3f74..2a7129d7b0 100644 --- a/lib/API/JSON/v1/Newsletters.php +++ b/lib/API/JSON/v1/Newsletters.php @@ -21,6 +21,7 @@ use MailPoet\Models\Subscriber; use MailPoet\Newsletter\Renderer\Renderer; use MailPoet\Newsletter\Scheduler\Scheduler; use MailPoet\Newsletter\Url as NewsletterUrl; +use MailPoet\Services\AuthorizedEmailsController; use MailPoet\Settings\SettingsController; use MailPoet\WP\Functions as WPFunctions; use MailPoet\WooCommerce\Helper as WCHelper; @@ -47,6 +48,9 @@ class Newsletters extends APIEndpoint { /** @var FeaturesController */ private $features_controller; + /** @var AuthorizedEmailsController */ + private $authorized_emails_controller; + public $permissions = [ 'global' => AccessControl::PERMISSION_MANAGE_EMAILS, ]; @@ -57,7 +61,8 @@ class Newsletters extends APIEndpoint { WPFunctions $wp, WCHelper $woocommerce_helper, SettingsController $settings, - FeaturesController $features_controller + FeaturesController $features_controller, + AuthorizedEmailsController $authorized_emails_controller ) { $this->bulk_action = $bulk_action; $this->listing_handler = $listing_handler; @@ -65,6 +70,7 @@ class Newsletters extends APIEndpoint { $this->woocommerce_helper = $woocommerce_helper; $this->settings = $settings; $this->features_controller = $features_controller; + $this->authorized_emails_controller = $authorized_emails_controller; } function get($data = []) { @@ -115,6 +121,11 @@ class Newsletters extends APIEndpoint { unset($data['template_id']); } + $old_newsletter = null; + if (isset($data['id'])) { + $old_newsletter = Newsletter::findOne(intval($data['id'])) ?: null; + } + $newsletter = Newsletter::createOrUpdate($data); $errors = $newsletter->getErrors(); @@ -190,6 +201,7 @@ class Newsletters extends APIEndpoint { } $this->wp->doAction('mailpoet_api_newsletters_save_after', $newsletter); + $this->authorized_emails_controller->onNewsletterUpdate($newsletter, $old_newsletter); $preview_url = NewsletterUrl::getViewInBrowserUrl( NewsletterUrl::TYPE_LISTING_EDITOR, diff --git a/lib/Services/AuthorizedEmailsController.php b/lib/Services/AuthorizedEmailsController.php index 436ce0fc70..0d8162035b 100644 --- a/lib/Services/AuthorizedEmailsController.php +++ b/lib/Services/AuthorizedEmailsController.php @@ -14,11 +14,17 @@ class AuthorizedEmailsController { const AUTHORIZED_EMAIL_ADDRESSES_ERROR_SETTING = 'authorized_emails_addresses_check'; /** @var Bridge */ - public $bridge; + private $bridge; /** @var SettingsController */ private $settings; + private $automatic_email_types = [ + Newsletter::TYPE_WELCOME, + Newsletter::TYPE_NOTIFICATION, + Newsletter::TYPE_AUTOMATIC, + ]; + function __construct(SettingsController $settingsController, Bridge $bridge) { $this->settings = $settingsController; $this->bridge = $bridge; @@ -55,6 +61,18 @@ class AuthorizedEmailsController { } } + function onNewsletterUpdate(Newsletter $newsletter, Newsletter $old_newsletter = null) { + if ($old_newsletter === null || $newsletter->sender_address === $old_newsletter->sender_address) { + return; + } + if ($newsletter->type === Newsletter::TYPE_STANDARD && $newsletter->status === Newsletter::STATUS_SCHEDULED) { + $this->checkAuthorizedEmailAddresses(); + } + if (in_array($newsletter->type, $this->automatic_email_types, true) && $newsletter->status === Newsletter::STATUS_ACTIVE) { + $this->checkAuthorizedEmailAddresses(); + } + } + private function validateAddressesInSettings($authorized_emails, $result = []) { $default_sender_address = $this->settings->get('sender.address'); $signup_confirmation_address = $this->settings->get('signup_confirmation.from.address'); @@ -74,7 +92,7 @@ class AuthorizedEmailsController { "(`type` = '%s' AND `status` = '%s') OR (`type` IN ('%s') AND `status` = '%s')", Newsletter::TYPE_STANDARD, Newsletter::STATUS_SCHEDULED, - implode("', '", [ Newsletter::TYPE_WELCOME, Newsletter::TYPE_NOTIFICATION, Newsletter::TYPE_AUTOMATIC ]), + implode("', '", $this->automatic_email_types), Newsletter::STATUS_ACTIVE ); diff --git a/tests/integration/API/JSON/v1/NewslettersTest.php b/tests/integration/API/JSON/v1/NewslettersTest.php index 17a7921a18..c52e4f9331 100644 --- a/tests/integration/API/JSON/v1/NewslettersTest.php +++ b/tests/integration/API/JSON/v1/NewslettersTest.php @@ -3,6 +3,7 @@ namespace MailPoet\Test\API\JSON\v1; use Carbon\Carbon; +use Codeception\Stub\Expected; use Codeception\Util\Fixtures; use Codeception\Util\Stub; use Helper\WordPressHooks as WPHooksHelper; @@ -23,6 +24,7 @@ use MailPoet\Models\SendingQueue; use MailPoet\Newsletter\Scheduler\Scheduler; use MailPoet\Newsletter\Url; use MailPoet\Router\Router; +use MailPoet\Services\AuthorizedEmailsController; use MailPoet\Settings\SettingsController; use MailPoet\Subscription\Url as SubscriptionUrl; use MailPoet\Tasks\Sending as SendingTask; @@ -125,7 +127,8 @@ class NewslettersTest extends \MailPoetTest { $wp, $this->makeEmpty(WCHelper::class), new SettingsController(), - new FeaturesController() + new FeaturesController(), + $this->make(AuthorizedEmailsController::class, ['onNewsletterUpdate' => Expected::never()]) ); $response = $this->endpoint->get(['id' => $this->newsletter->id]); expect($response->status)->equals(APIResponse::STATUS_OK); @@ -165,7 +168,8 @@ class NewslettersTest extends \MailPoetTest { $wp, $this->makeEmpty(WCHelper::class), new SettingsController(), - new FeaturesController() + new FeaturesController(), + $this->make(AuthorizedEmailsController::class, ['onNewsletterUpdate' => Expected::once()]) ); $response = $this->endpoint->save($valid_data); @@ -532,7 +536,8 @@ class NewslettersTest extends \MailPoetTest { $wp, $this->makeEmpty(WCHelper::class), new SettingsController(), - new FeaturesController() + new FeaturesController(), + $this->make(AuthorizedEmailsController::class, ['onNewsletterUpdate' => Expected::never()]) ); $response = $this->endpoint->duplicate(['id' => $this->newsletter->id]);