Allow re-subscribe functionality in third party API

[MAILPOET-3307]
This commit is contained in:
Jan Lysý
2021-02-02 11:33:35 +01:00
committed by Veljko V
parent b37e5a36ab
commit 349918e45d

View File

@ -8,6 +8,7 @@ use MailPoet\Models\Segment;
use MailPoet\Models\Subscriber; use MailPoet\Models\Subscriber;
use MailPoet\Models\SubscriberSegment; use MailPoet\Models\SubscriberSegment;
use MailPoet\Newsletter\Scheduler\WelcomeScheduler; use MailPoet\Newsletter\Scheduler\WelcomeScheduler;
use MailPoet\Settings\SettingsController;
use MailPoet\Subscribers\ConfirmationEmailMailer; use MailPoet\Subscribers\ConfirmationEmailMailer;
use MailPoet\Subscribers\NewSubscriberNotificationMailer; use MailPoet\Subscribers\NewSubscriberNotificationMailer;
use MailPoet\Subscribers\RequiredCustomFieldValidator; use MailPoet\Subscribers\RequiredCustomFieldValidator;
@ -33,18 +34,23 @@ class API {
/** @var WelcomeScheduler */ /** @var WelcomeScheduler */
private $welcomeScheduler; private $welcomeScheduler;
/** @var SettingsController */
private $settings;
public function __construct( public function __construct(
NewSubscriberNotificationMailer $newSubscriberNotificationMailer, NewSubscriberNotificationMailer $newSubscriberNotificationMailer,
ConfirmationEmailMailer $confirmationEmailMailer, ConfirmationEmailMailer $confirmationEmailMailer,
RequiredCustomFieldValidator $requiredCustomFieldValidator, RequiredCustomFieldValidator $requiredCustomFieldValidator,
ApiDataSanitizer $customFieldsDataSanitizer, ApiDataSanitizer $customFieldsDataSanitizer,
WelcomeScheduler $welcomeScheduler WelcomeScheduler $welcomeScheduler,
SettingsController $settings
) { ) {
$this->newSubscriberNotificationMailer = $newSubscriberNotificationMailer; $this->newSubscriberNotificationMailer = $newSubscriberNotificationMailer;
$this->confirmationEmailMailer = $confirmationEmailMailer; $this->confirmationEmailMailer = $confirmationEmailMailer;
$this->requiredCustomFieldValidator = $requiredCustomFieldValidator; $this->requiredCustomFieldValidator = $requiredCustomFieldValidator;
$this->customFieldsDataSanitizer = $customFieldsDataSanitizer; $this->customFieldsDataSanitizer = $customFieldsDataSanitizer;
$this->welcomeScheduler = $welcomeScheduler; $this->welcomeScheduler = $welcomeScheduler;
$this->settings = $settings;
} }
public function getSubscriberFields() { public function getSubscriberFields() {
@ -118,6 +124,7 @@ class API {
$scheduleWelcomeEmail = (isset($options['schedule_welcome_email']) && $options['schedule_welcome_email'] === false) ? false : true; $scheduleWelcomeEmail = (isset($options['schedule_welcome_email']) && $options['schedule_welcome_email'] === false) ? false : true;
$sendConfirmationEmail = (isset($options['send_confirmation_email']) && $options['send_confirmation_email'] === false) ? false : true; $sendConfirmationEmail = (isset($options['send_confirmation_email']) && $options['send_confirmation_email'] === false) ? false : true;
$skipSubscriberNotification = (isset($options['skip_subscriber_notification']) && $options['skip_subscriber_notification'] === true) ? true : false; $skipSubscriberNotification = (isset($options['skip_subscriber_notification']) && $options['skip_subscriber_notification'] === true) ? true : false;
$signupConfirmationEnabled = (bool)$this->settings->get('signup_confirmation.enabled');
if (empty($listIds)) { if (empty($listIds)) {
throw new APIException(__('At least one segment ID is required.', 'mailpoet'), APIException::SEGMENT_REQUIRED); throw new APIException(__('At least one segment ID is required.', 'mailpoet'), APIException::SEGMENT_REQUIRED);
@ -163,17 +170,30 @@ class API {
SubscriberSegment::subscribeToSegments($subscriber, $foundSegmentsIds); SubscriberSegment::subscribeToSegments($subscriber, $foundSegmentsIds);
// set status depending on signup confirmation setting
if ($subscriber->status !== Subscriber::STATUS_SUBSCRIBED) {
if ($signupConfirmationEnabled === true) {
$subscriber->set('status', Subscriber::STATUS_UNCONFIRMED);
} else {
$subscriber->set('status', Subscriber::STATUS_SUBSCRIBED);
}
$subscriber->save();
if ($subscriber->getErrors() !== false) {
throw new APIException(
WPFunctions::get()->__(sprintf('Failed to save a status of a subscriber : %s', strtolower(implode(', ', $subscriber->getErrors()))), 'mailpoet'),
APIException::FAILED_TO_SAVE_SUBSCRIBER
);
}
}
// schedule welcome email // schedule welcome email
if ($scheduleWelcomeEmail && $subscriber->status === Subscriber::STATUS_SUBSCRIBED) { if ($scheduleWelcomeEmail && $subscriber->status === Subscriber::STATUS_SUBSCRIBED) {
$this->_scheduleWelcomeNotification($subscriber, $foundSegmentsIds); $this->_scheduleWelcomeNotification($subscriber, $foundSegmentsIds);
} }
// send confirmation email // send confirmation email
if ( if ($sendConfirmationEmail) {
$sendConfirmationEmail
&& $subscriber->status === Subscriber::STATUS_UNCONFIRMED
&& (int)$subscriber->countConfirmations === 0
) {
$result = $this->_sendConfirmationEmail($subscriber); $result = $this->_sendConfirmationEmail($subscriber);
if (!$result && $subscriber->getErrors()) { if (!$result && $subscriber->getErrors()) {
throw new APIException( throw new APIException(
@ -357,7 +377,7 @@ class API {
} }
protected function _sendConfirmationEmail(Subscriber $subscriber) { protected function _sendConfirmationEmail(Subscriber $subscriber) {
return $this->confirmationEmailMailer->sendConfirmationEmail($subscriber); return $this->confirmationEmailMailer->sendConfirmationEmailOnce($subscriber);
} }
protected function _scheduleWelcomeNotification(Subscriber $subscriber, array $segments) { protected function _scheduleWelcomeNotification(Subscriber $subscriber, array $segments) {