Use Doctrine in SubscriberActions
[MAILPOET-3032]
This commit is contained in:
@ -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;
|
||||||
|
Reference in New Issue
Block a user