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;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\Models\Segment;
use MailPoet\Models\Subscriber;
use MailPoet\Models\SubscriberSegment;
use MailPoet\Newsletter\Scheduler\WelcomeScheduler;
use MailPoet\Segments\SegmentsRepository;
use MailPoet\Settings\SettingsController;
use MailPoet\Util\Helpers;
@ -23,22 +24,42 @@ class SubscriberActions {
/** @var WelcomeScheduler */
private $welcomeScheduler;
/** @var SubscriberSaveController */
private $subscriberSaveController;
/** @var SubscribersRepository */
private $subscribersRepository;
/** @var SubscriberSegmentRepository */
private $subscriberSegmentRepository;
/** @var SegmentsRepository */
private $segmentsRepository;
public function __construct(
SettingsController $settings,
NewSubscriberNotificationMailer $newSubscriberNotificationMailer,
ConfirmationEmailMailer $confirmationEmailMailer,
WelcomeScheduler $welcomeScheduler
WelcomeScheduler $welcomeScheduler,
SegmentsRepository $segmentsRepository,
SubscriberSaveController $subscriberSaveController,
SubscribersRepository $subscribersRepository,
SubscriberSegmentRepository $subscriberSegmentRepository
) {
$this->settings = $settings;
$this->newSubscriberNotificationMailer = $newSubscriberNotificationMailer;
$this->confirmationEmailMailer = $confirmationEmailMailer;
$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
// that should not be editable when subscribing
$subscriberData = Subscriber::filterOutReservedColumns($subscriberData);
$subscriberData = $this->subscriberSaveController->filterOutReservedColumns($subscriberData);
$signupConfirmationEnabled = (bool)$this->settings->get(
'signup_confirmation.enabled'
@ -46,54 +67,52 @@ class SubscriberActions {
$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
$subscriber = Subscriber::createOrUpdate($subscriberData);
if ($subscriber->getErrors() !== false) {
$subscriber = Source::setSource($subscriber, Source::FORM);
$subscriber->save();
return $subscriber;
}
$subscriber = Subscriber::findOne($subscriber->id);
$subscriber = $this->subscriberSaveController->createOrUpdate($subscriberData, $subscriber);
} else {
// store subscriber data to be updated after confirmation
$subscriber->setUnconfirmedData($subscriberData);
$subscriber->setExpr('updated_at', 'NOW()');
$unconfirmedData = $this->subscriberSaveController->filterOutReservedColumns($subscriberData);
$unconfirmedData = json_encode($unconfirmedData);
$subscriber->setUnconfirmedData($unconfirmedData ?: null);
}
// restore trashed subscriber
if ($subscriber->deletedAt !== null) {
$subscriber->setExpr('deleted_at', 'NULL');
if ($subscriber->getDeletedAt()) {
$subscriber->setDeletedAt(null);
}
// set status depending on signup confirmation setting
if ($subscriber->status !== Subscriber::STATUS_SUBSCRIBED) {
if ($subscriber->getStatus() !== SubscriberEntity::STATUS_SUBSCRIBED) {
if ($signupConfirmationEnabled === true) {
$subscriber->set('status', Subscriber::STATUS_UNCONFIRMED);
$subscriber->setStatus(SubscriberEntity::STATUS_UNCONFIRMED);
} 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()) {
// link subscriber to segments
SubscriberSegment::subscribeToSegments($subscriber, $segmentIds);
$subscriberModel = Subscriber::findOne($subscriber->getId());
if ($subscriberModel) {
$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->newSubscriberNotificationMailer->send($subscriber, Segment::whereIn('id', $segmentIds)->findMany());
$this->welcomeScheduler->scheduleSubscriberWelcomeNotification(
$subscriber->id,
$segmentIds
);
}
$this->welcomeScheduler->scheduleSubscriberWelcomeNotification(
$subscriber->getId(),
$segmentIds
);
}
return $subscriber;