Use Doctrine in SubscriberActions

[MAILPOET-3032]
This commit is contained in:
Jan Lysý
2021-03-30 20:31:36 +02:00
committed by Veljko V
parent f92d31fdb6
commit 7db23849f7

View File

@ -2,10 +2,11 @@
namespace MailPoet\Subscribers; namespace MailPoet\Subscribers;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\Models\Segment; use MailPoet\Models\Segment;
use MailPoet\Models\Subscriber; use MailPoet\Models\Subscriber;
use MailPoet\Models\SubscriberSegment;
use MailPoet\Newsletter\Scheduler\WelcomeScheduler; use MailPoet\Newsletter\Scheduler\WelcomeScheduler;
use MailPoet\Segments\SegmentsRepository;
use MailPoet\Settings\SettingsController; use MailPoet\Settings\SettingsController;
use MailPoet\Util\Helpers; use MailPoet\Util\Helpers;
@ -23,22 +24,42 @@ class SubscriberActions {
/** @var WelcomeScheduler */ /** @var WelcomeScheduler */
private $welcomeScheduler; private $welcomeScheduler;
/** @var SubscriberSaveController */
private $subscriberSaveController;
/** @var SubscribersRepository */
private $subscribersRepository;
/** @var SubscriberSegmentRepository */
private $subscriberSegmentRepository;
/** @var SegmentsRepository */
private $segmentsRepository;
public function __construct( public function __construct(
SettingsController $settings, SettingsController $settings,
NewSubscriberNotificationMailer $newSubscriberNotificationMailer, NewSubscriberNotificationMailer $newSubscriberNotificationMailer,
ConfirmationEmailMailer $confirmationEmailMailer, ConfirmationEmailMailer $confirmationEmailMailer,
WelcomeScheduler $welcomeScheduler WelcomeScheduler $welcomeScheduler,
SegmentsRepository $segmentsRepository,
SubscriberSaveController $subscriberSaveController,
SubscribersRepository $subscribersRepository,
SubscriberSegmentRepository $subscriberSegmentRepository
) { ) {
$this->settings = $settings; $this->settings = $settings;
$this->newSubscriberNotificationMailer = $newSubscriberNotificationMailer; $this->newSubscriberNotificationMailer = $newSubscriberNotificationMailer;
$this->confirmationEmailMailer = $confirmationEmailMailer; $this->confirmationEmailMailer = $confirmationEmailMailer;
$this->welcomeScheduler = $welcomeScheduler; $this->welcomeScheduler = $welcomeScheduler;
$this->subscriberSaveController = $subscriberSaveController;
$this->subscribersRepository = $subscribersRepository;
$this->subscriberSegmentRepository = $subscriberSegmentRepository;
$this->segmentsRepository = $segmentsRepository;
} }
public function subscribe($subscriberData = [], $segmentIds = []) { public function subscribe($subscriberData = [], $segmentIds = []): SubscriberEntity {
// filter out keys from the subscriber_data array // filter out keys from the subscriber_data array
// that should not be editable when subscribing // that should not be editable when subscribing
$subscriberData = Subscriber::filterOutReservedColumns($subscriberData); $subscriberData = $this->subscriberSaveController->filterOutReservedColumns($subscriberData);
$signupConfirmationEnabled = (bool)$this->settings->get( $signupConfirmationEnabled = (bool)$this->settings->get(
'signup_confirmation.enabled' 'signup_confirmation.enabled'
@ -46,54 +67,52 @@ class SubscriberActions {
$subscriberData['subscribed_ip'] = Helpers::getIP(); $subscriberData['subscribed_ip'] = Helpers::getIP();
$subscriber = Subscriber::findOne($subscriberData['email']); $subscriber = $this->subscribersRepository->findOneBy(['email' => $subscriberData['email']]);
if (!$subscriber && !isset($subscriberData['source'])) {
$subscriberData['source'] = Source::FORM;
}
if ($subscriber === false || !$signupConfirmationEnabled) { if (!$subscriber || !$signupConfirmationEnabled) {
// create new subscriber or update if no confirmation is required // create new subscriber or update if no confirmation is required
$subscriber = Subscriber::createOrUpdate($subscriberData); $subscriber = $this->subscriberSaveController->createOrUpdate($subscriberData, $subscriber);
if ($subscriber->getErrors() !== false) {
$subscriber = Source::setSource($subscriber, Source::FORM);
$subscriber->save();
return $subscriber;
}
$subscriber = Subscriber::findOne($subscriber->id);
} else { } else {
// store subscriber data to be updated after confirmation // store subscriber data to be updated after confirmation
$subscriber->setUnconfirmedData($subscriberData); $unconfirmedData = $this->subscriberSaveController->filterOutReservedColumns($subscriberData);
$subscriber->setExpr('updated_at', 'NOW()'); $unconfirmedData = json_encode($unconfirmedData);
$subscriber->setUnconfirmedData($unconfirmedData ?: null);
} }
// restore trashed subscriber // restore trashed subscriber
if ($subscriber->deletedAt !== null) { if ($subscriber->getDeletedAt()) {
$subscriber->setExpr('deleted_at', 'NULL'); $subscriber->setDeletedAt(null);
} }
// set status depending on signup confirmation setting // set status depending on signup confirmation setting
if ($subscriber->status !== Subscriber::STATUS_SUBSCRIBED) { if ($subscriber->getStatus() !== SubscriberEntity::STATUS_SUBSCRIBED) {
if ($signupConfirmationEnabled === true) { if ($signupConfirmationEnabled === true) {
$subscriber->set('status', Subscriber::STATUS_UNCONFIRMED); $subscriber->setStatus(SubscriberEntity::STATUS_UNCONFIRMED);
} else { } else {
$subscriber->set('status', Subscriber::STATUS_SUBSCRIBED); $subscriber->setStatus(SubscriberEntity::STATUS_SUBSCRIBED);
} }
} }
$subscriber = Source::setSource($subscriber, Source::FORM); $this->subscribersRepository->flush();
// link subscriber to segments
$segments = $this->segmentsRepository->findBy(['id' => $segmentIds]);
$this->subscriberSegmentRepository->subscribeToSegments($subscriber, $segments);
if ($subscriber->save()) { $subscriberModel = Subscriber::findOne($subscriber->getId());
// link subscriber to segments if ($subscriberModel) {
SubscriberSegment::subscribeToSegments($subscriber, $segmentIds); $this->confirmationEmailMailer->sendConfirmationEmailOnce($subscriberModel);
}
$this->confirmationEmailMailer->sendConfirmationEmailOnce($subscriber); if ($subscriber->getStatus() === SubscriberEntity::STATUS_SUBSCRIBED && $subscriberModel) {
$this->newSubscriberNotificationMailer->send($subscriberModel, Segment::whereIn('id', $segmentIds)->findMany());
if ($subscriber->status === Subscriber::STATUS_SUBSCRIBED) { $this->welcomeScheduler->scheduleSubscriberWelcomeNotification(
$this->newSubscriberNotificationMailer->send($subscriber, Segment::whereIn('id', $segmentIds)->findMany()); $subscriber->getId(),
$segmentIds
$this->welcomeScheduler->scheduleSubscriberWelcomeNotification( );
$subscriber->id,
$segmentIds
);
}
} }
return $subscriber; return $subscriber;