Inject subscribe() action instead of calling it statically [MAILPOET-1825]

This commit is contained in:
wxa
2019-02-20 15:18:06 +03:00
committed by M. Shull
parent 7528f0f52b
commit 2f487fd300
7 changed files with 90 additions and 44 deletions

View File

@@ -16,6 +16,7 @@ use MailPoet\Segments\SubscribersListings;
use MailPoet\Settings\SettingsController; use MailPoet\Settings\SettingsController;
use MailPoet\Subscribers\RequiredCustomFieldValidator; use MailPoet\Subscribers\RequiredCustomFieldValidator;
use MailPoet\Subscribers\Source; use MailPoet\Subscribers\Source;
use MailPoet\Subscribers\SubscriberActions;
use MailPoet\Subscription\Throttling as SubscriptionThrottling; use MailPoet\Subscription\Throttling as SubscriptionThrottling;
use MailPoet\WP\Functions as WPFunctions; use MailPoet\WP\Functions as WPFunctions;
@@ -35,6 +36,9 @@ class Subscribers extends APIEndpoint {
/** @var SubscribersListings */ /** @var SubscribersListings */
private $subscribers_listings; private $subscribers_listings;
/** @var SubscriberActions */
private $subscriber_actions;
/** @var RequiredCustomFieldValidator */ /** @var RequiredCustomFieldValidator */
private $required_custom_field_validator; private $required_custom_field_validator;
@@ -50,6 +54,7 @@ class Subscribers extends APIEndpoint {
public function __construct( public function __construct(
Listing\BulkActionController $bulk_action_controller, Listing\BulkActionController $bulk_action_controller,
SubscribersListings $subscribers_listings, SubscribersListings $subscribers_listings,
SubscriberActions $subscriber_actions,
RequiredCustomFieldValidator $required_custom_field_validator, RequiredCustomFieldValidator $required_custom_field_validator,
Listing\Handler $listing_handler, Listing\Handler $listing_handler,
WPFunctions $wp, WPFunctions $wp,
@@ -57,6 +62,7 @@ class Subscribers extends APIEndpoint {
) { ) {
$this->bulk_action_controller = $bulk_action_controller; $this->bulk_action_controller = $bulk_action_controller;
$this->subscribers_listings = $subscribers_listings; $this->subscribers_listings = $subscribers_listings;
$this->subscriber_actions = $subscriber_actions;
$this->required_custom_field_validator = $required_custom_field_validator; $this->required_custom_field_validator = $required_custom_field_validator;
$this->listing_handler = $listing_handler; $this->listing_handler = $listing_handler;
$this->wp = $wp; $this->wp = $wp;
@@ -183,7 +189,7 @@ class Subscribers extends APIEndpoint {
throw new \Exception(sprintf(__('You need to wait %d seconds before subscribing again.', 'mailpoet'), $timeout)); throw new \Exception(sprintf(__('You need to wait %d seconds before subscribing again.', 'mailpoet'), $timeout));
} }
$subscriber = Subscriber::subscribe($data, $segment_ids); $subscriber = $this->subscriber_actions->subscribe($data, $segment_ids);
$errors = $subscriber->getErrors(); $errors = $subscriber->getErrors();
if ($errors !== false) { if ($errors !== false) {

View File

@@ -17,7 +17,7 @@ if (!defined('ABSPATH')) exit;
class API { class API {
/** @var NewSubscriberNotificationMailer */ /** @var NewSubscriberNotificationMailer */
private $new_subscribe_notification_mailer; private $new_subscriber_notification_mailer;
/** @var ConfirmationEmailMailer */ /** @var ConfirmationEmailMailer */
private $confirmation_email_mailer; private $confirmation_email_mailer;
@@ -26,11 +26,11 @@ class API {
private $required_custom_field_validator; private $required_custom_field_validator;
public function __construct( public function __construct(
NewSubscriberNotificationMailer $new_subscribe_notification_mailer, NewSubscriberNotificationMailer $new_subscriber_notification_mailer,
ConfirmationEmailMailer $confirmation_email_mailer, ConfirmationEmailMailer $confirmation_email_mailer,
RequiredCustomFieldValidator $required_custom_field_validator RequiredCustomFieldValidator $required_custom_field_validator
) { ) {
$this->new_subscribe_notification_mailer = $new_subscribe_notification_mailer; $this->new_subscriber_notification_mailer = $new_subscriber_notification_mailer;
$this->confirmation_email_mailer = $confirmation_email_mailer; $this->confirmation_email_mailer = $confirmation_email_mailer;
$this->required_custom_field_validator = $required_custom_field_validator; $this->required_custom_field_validator = $required_custom_field_validator;
} }
@@ -299,6 +299,6 @@ class API {
} }
private function sendSubscriberNotification(Subscriber $subscriber, array $segment_ids) { private function sendSubscriberNotification(Subscriber $subscriber, array $segment_ids) {
$this->new_subscribe_notification_mailer->send($subscriber, Segment::whereIn('id', $segment_ids)->findMany()); $this->new_subscriber_notification_mailer->send($subscriber, Segment::whereIn('id', $segment_ids)->findMany());
} }
} }

View File

@@ -3,7 +3,9 @@
namespace MailPoet\Config; namespace MailPoet\Config;
use MailPoet\Settings\SettingsController; use MailPoet\Settings\SettingsController;
use MailPoet\Subscription\Comment;
use MailPoet\Subscription\Form; use MailPoet\Subscription\Form;
use MailPoet\Subscription\Registration;
use MailPoet\Segments\WooCommerce as WooCommerceSegment; use MailPoet\Segments\WooCommerce as WooCommerceSegment;
use MailPoet\WP\Functions as WPFunctions; use MailPoet\WP\Functions as WPFunctions;
@@ -12,6 +14,12 @@ class Hooks {
/** @var Form */ /** @var Form */
private $subscription_form; private $subscription_form;
/** @var Comment */
private $subscription_comment;
/** @var Registration */
private $subscription_registration;
/** @var SettingsController */ /** @var SettingsController */
private $settings; private $settings;
@@ -23,11 +31,15 @@ class Hooks {
function __construct( function __construct(
Form $subscription_form, Form $subscription_form,
Comment $subscription_comment,
Registration $subscription_registration,
SettingsController $settings, SettingsController $settings,
WPFunctions $wp, WPFunctions $wp,
WooCommerceSegment $woocommerce_segment WooCommerceSegment $woocommerce_segment
) { ) {
$this->subscription_form = $subscription_form; $this->subscription_form = $subscription_form;
$this->subscription_comment = $subscription_comment;
$this->subscription_registration = $subscription_registration;
$this->settings = $settings; $this->settings = $settings;
$this->wp = $wp; $this->wp = $wp;
$this->woocommerce_segment = $woocommerce_segment; $this->woocommerce_segment = $woocommerce_segment;
@@ -54,25 +66,25 @@ class Hooks {
if ($this->wp->isUserLoggedIn()) { if ($this->wp->isUserLoggedIn()) {
$this->wp->addAction( $this->wp->addAction(
'comment_form_field_comment', 'comment_form_field_comment',
'\MailPoet\Subscription\Comment::extendLoggedInForm' [$this->subscription_comment, 'extendLoggedInForm']
); );
} else { } else {
$this->wp->addAction( $this->wp->addAction(
'comment_form_after_fields', 'comment_form_after_fields',
'\MailPoet\Subscription\Comment::extendLoggedOutForm' [$this->subscription_comment, 'extendLoggedOutForm']
); );
} }
$this->wp->addAction( $this->wp->addAction(
'comment_post', 'comment_post',
'\MailPoet\Subscription\Comment::onSubmit', [$this->subscription_comment, 'onSubmit'],
60, 60,
2 2
); );
$this->wp->addAction( $this->wp->addAction(
'wp_set_comment_status', 'wp_set_comment_status',
'\MailPoet\Subscription\Comment::onStatusUpdate', [$this->subscription_comment, 'onStatusUpdate'],
60, 60,
2 2
); );
@@ -87,22 +99,22 @@ class Hooks {
if (is_multisite()) { if (is_multisite()) {
$this->wp->addAction( $this->wp->addAction(
'signup_extra_fields', 'signup_extra_fields',
'\MailPoet\Subscription\Registration::extendForm' [$this->subscription_registration, 'extendForm']
); );
$this->wp->addAction( $this->wp->addAction(
'wpmu_validate_user_signup', 'wpmu_validate_user_signup',
'\MailPoet\Subscription\Registration::onMultiSiteRegister', [$this->subscription_registration, 'onMultiSiteRegister'],
60, 60,
1 1
); );
} else { } else {
$this->wp->addAction( $this->wp->addAction(
'register_form', 'register_form',
'\MailPoet\Subscription\Registration::extendForm' [$this->subscription_registration, 'extendForm']
); );
$this->wp->addAction( $this->wp->addAction(
'register_post', 'register_post',
'\MailPoet\Subscription\Registration::onRegister', [$this->subscription_registration, 'onRegister'],
60, 60,
3 3
); );

View File

@@ -85,7 +85,9 @@ class ContainerConfigurator implements IContainerConfigurator {
// Settings // Settings
$container->autowire(\MailPoet\Settings\SettingsController::class)->setPublic(true); $container->autowire(\MailPoet\Settings\SettingsController::class)->setPublic(true);
// Subscription // Subscription
$container->autowire(\MailPoet\Subscription\Comment::class)->setPublic(true);
$container->autowire(\MailPoet\Subscription\Form::class)->setPublic(true); $container->autowire(\MailPoet\Subscription\Form::class)->setPublic(true);
$container->autowire(\MailPoet\Subscription\Registration::class)->setPublic(true);
// Newsletter // Newsletter
$container->autowire(\MailPoet\Newsletter\AutomatedLatestContent::class)->setPublic(true); $container->autowire(\MailPoet\Newsletter\AutomatedLatestContent::class)->setPublic(true);
// WooCommerce // WooCommerce

View File

@@ -2,24 +2,38 @@
namespace MailPoet\Subscription; namespace MailPoet\Subscription;
use MailPoet\Models\Subscriber; use MailPoet\Models\Subscriber;
use MailPoet\Settings\SettingsController; use MailPoet\Settings\SettingsController;
use MailPoet\Subscribers\SubscriberActions;
class Comment { class Comment {
const SPAM = 'spam'; const SPAM = 'spam';
const APPROVED = 1; const APPROVED = 1;
const PENDING_APPROVAL = 0; const PENDING_APPROVAL = 0;
static function extendLoggedInForm($field) { /** @var SettingsController */
$field .= self::getSubscriptionField(); private $settings;
/** @var SubscriberActions */
private $subscriber_actions;
function __construct(
SettingsController $settings,
SubscriberActions $subscriber_actions
) {
$this->settings = $settings;
$this->subscriber_actions = $subscriber_actions;
}
function extendLoggedInForm($field) {
$field .= $this->getSubscriptionField();
return $field; return $field;
} }
static function extendLoggedOutForm() { function extendLoggedOutForm() {
echo self::getSubscriptionField(); echo $this->getSubscriptionField();
} }
static function getSubscriptionField() { private function getSubscriptionField() {
$settings = new SettingsController(); $label = $this->settings->get(
$label = $settings->get(
'subscribe.on_comment.label', 'subscribe.on_comment.label',
__('Yes, please add me to your mailing list.', 'mailpoet') __('Yes, please add me to your mailing list.', 'mailpoet')
); );
@@ -36,7 +50,7 @@ class Comment {
</p>'; </p>';
} }
static function onSubmit($comment_id, $comment_status) { function onSubmit($comment_id, $comment_status) {
if ($comment_status === Comment::SPAM) return; if ($comment_status === Comment::SPAM) return;
if ( if (
@@ -53,12 +67,12 @@ class Comment {
true true
); );
} else if ($comment_status === Comment::APPROVED) { } else if ($comment_status === Comment::APPROVED) {
static::subscribeAuthorOfComment($comment_id); $this->subscribeAuthorOfComment($comment_id);
} }
} }
} }
static function onStatusUpdate($comment_id, $action) { function onStatusUpdate($comment_id, $action) {
if ($action === 'approve') { if ($action === 'approve') {
// check if the comment's author wants to subscribe // check if the comment's author wants to subscribe
$do_subscribe = ( $do_subscribe = (
@@ -70,21 +84,20 @@ class Comment {
); );
if ($do_subscribe === true) { if ($do_subscribe === true) {
static::subscribeAuthorOfComment($comment_id); $this->subscribeAuthorOfComment($comment_id);
delete_comment_meta($comment_id, 'mailpoet'); delete_comment_meta($comment_id, 'mailpoet');
} }
} }
} }
private static function subscribeAuthorOfComment($comment_id) { private function subscribeAuthorOfComment($comment_id) {
$settings = new SettingsController(); $segment_ids = $this->settings->get('subscribe.on_comment.segments', array());
$segment_ids = $settings->get('subscribe.on_comment.segments', array());
if (!empty($segment_ids)) { if (!empty($segment_ids)) {
$comment = get_comment($comment_id); $comment = get_comment($comment_id);
$result = Subscriber::subscribe( $result = $this->subscriber_actions->subscribe(
array( array(
'email' => $comment->comment_author_email, 'email' => $comment->comment_author_email,
'first_name' => $comment->comment_author 'first_name' => $comment->comment_author

View File

@@ -3,12 +3,26 @@ namespace MailPoet\Subscription;
use MailPoet\Models\Setting; use MailPoet\Models\Setting;
use MailPoet\Models\Subscriber; use MailPoet\Models\Subscriber;
use MailPoet\Settings\SettingsController; use MailPoet\Settings\SettingsController;
use MailPoet\Subscribers\SubscriberActions;
class Registration { class Registration {
static function extendForm() { /** @var SettingsController */
$settings = new SettingsController(); private $settings;
$label = $settings->get(
/** @var SubscriberActions */
private $subscriber_actions;
function __construct(
SettingsController $settings,
SubscriberActions $subscriber_actions
) {
$this->settings = $settings;
$this->subscriber_actions = $subscriber_actions;
}
function extendForm() {
$label = $this->settings->get(
'subscribe.on_register.label', 'subscribe.on_register.label',
__('Yes, please add me to your mailing list.', 'mailpoet') __('Yes, please add me to your mailing list.', 'mailpoet')
); );
@@ -25,13 +39,13 @@ class Registration {
</p>'; </p>';
} }
static function onMultiSiteRegister($result) { function onMultiSiteRegister($result) {
if (empty($result['errors']->errors)) { if (empty($result['errors']->errors)) {
if ( if (
isset($_POST['mailpoet']['subscribe_on_register']) isset($_POST['mailpoet']['subscribe_on_register'])
&& (bool)$_POST['mailpoet']['subscribe_on_register'] === true && (bool)$_POST['mailpoet']['subscribe_on_register'] === true
) { ) {
static::subscribeNewUser( $this->subscribeNewUser(
$result['user_name'], $result['user_name'],
$result['user_email'] $result['user_email']
); );
@@ -40,7 +54,7 @@ class Registration {
return $result; return $result;
} }
static function onRegister( function onRegister(
$user_login, $user_login,
$user_email = null, $user_email = null,
$errors = null $errors = null
@@ -50,22 +64,21 @@ class Registration {
&& isset($_POST['mailpoet']['subscribe_on_register']) && isset($_POST['mailpoet']['subscribe_on_register'])
&& (bool)$_POST['mailpoet']['subscribe_on_register'] === true && (bool)$_POST['mailpoet']['subscribe_on_register'] === true
) { ) {
static::subscribeNewUser( $this->subscribeNewUser(
$user_login, $user_login,
$user_email $user_email
); );
} }
} }
private static function subscribeNewUser($name, $email) { private function subscribeNewUser($name, $email) {
$settings = new SettingsController(); $segment_ids = $this->settings->get(
$segment_ids = $settings->get(
'subscribe.on_register.segments', 'subscribe.on_register.segments',
[] []
); );
if (!empty($segment_ids)) { if (!empty($segment_ids)) {
Subscriber::subscribe( $this->subscriber_actions->subscribe(
array( array(
'email' => $email, 'email' => $email,
'first_name' => $name 'first_name' => $name

View File

@@ -393,7 +393,7 @@ class APITest extends \MailPoetTest {
\MailPoet\API\MP\v1\API::class, \MailPoet\API\MP\v1\API::class,
'addSubscriber', 'addSubscriber',
array( array(
'new_subscribe_notification_mailer'=> Stub::makeEmpty(NewSubscriberNotificationMailer::class, ['send']), 'new_subscriber_notification_mailer'=> Stub::makeEmpty(NewSubscriberNotificationMailer::class, ['send']),
'required_custom_field_validator' => Stub::makeEmpty(RequiredCustomFieldValidator::class, ['validate']), 'required_custom_field_validator' => Stub::makeEmpty(RequiredCustomFieldValidator::class, ['validate']),
'_scheduleWelcomeNotification' => Expected::once(), '_scheduleWelcomeNotification' => Expected::once(),
), $this); ), $this);
@@ -435,7 +435,7 @@ class APITest extends \MailPoetTest {
'addSubscriber', 'addSubscriber',
array( array(
'_scheduleWelcomeNotification' => Expected::never(), '_scheduleWelcomeNotification' => Expected::never(),
'new_subscribe_notification_mailer'=> Stub::makeEmpty(NewSubscriberNotificationMailer::class, ['send']), 'new_subscriber_notification_mailer'=> Stub::makeEmpty(NewSubscriberNotificationMailer::class, ['send']),
'required_custom_field_validator' => Stub::makeEmpty(RequiredCustomFieldValidator::class, ['validate']), 'required_custom_field_validator' => Stub::makeEmpty(RequiredCustomFieldValidator::class, ['validate']),
), $this); ), $this);
$subscriber = array( $subscriber = array(
@@ -451,7 +451,7 @@ class APITest extends \MailPoetTest {
'addSubscriber', 'addSubscriber',
array( array(
'_scheduleWelcomeNotification' => Expected::never(), '_scheduleWelcomeNotification' => Expected::never(),
'new_subscribe_notification_mailer'=> Stub::makeEmpty(NewSubscriberNotificationMailer::class, ['send']), 'new_subscriber_notification_mailer'=> Stub::makeEmpty(NewSubscriberNotificationMailer::class, ['send']),
'required_custom_field_validator' => Stub::makeEmpty(RequiredCustomFieldValidator::class, ['validate']) 'required_custom_field_validator' => Stub::makeEmpty(RequiredCustomFieldValidator::class, ['validate'])
), $this); ), $this);
$subscriber = array( $subscriber = array(
@@ -470,7 +470,7 @@ class APITest extends \MailPoetTest {
array( array(
'_sendConfirmationEmail' => Expected::once(), '_sendConfirmationEmail' => Expected::once(),
'required_custom_field_validator' => Stub::makeEmpty(RequiredCustomFieldValidator::class, ['validate']), 'required_custom_field_validator' => Stub::makeEmpty(RequiredCustomFieldValidator::class, ['validate']),
'new_subscribe_notification_mailer'=> Stub::makeEmpty(NewSubscriberNotificationMailer::class, ['send']) 'new_subscriber_notification_mailer'=> Stub::makeEmpty(NewSubscriberNotificationMailer::class, ['send'])
), $this); ), $this);
$subscriber = array( $subscriber = array(
'email' => 'test@example.com' 'email' => 'test@example.com'
@@ -511,7 +511,7 @@ class APITest extends \MailPoetTest {
array( array(
'__sendConfirmationEmail' => Expected::never(), '__sendConfirmationEmail' => Expected::never(),
'required_custom_field_validator' => Stub::makeEmpty(RequiredCustomFieldValidator::class, ['validate']), 'required_custom_field_validator' => Stub::makeEmpty(RequiredCustomFieldValidator::class, ['validate']),
'new_subscribe_notification_mailer'=> Stub::makeEmpty(NewSubscriberNotificationMailer::class, ['send']) 'new_subscriber_notification_mailer'=> Stub::makeEmpty(NewSubscriberNotificationMailer::class, ['send'])
), $this); ), $this);
$subscriber = array( $subscriber = array(
'email' => 'test@example.com' 'email' => 'test@example.com'