diff --git a/lib/Subscribers/SubscriberActions.php b/lib/Subscribers/SubscriberActions.php index 1192a1192a..7179adb531 100644 --- a/lib/Subscribers/SubscriberActions.php +++ b/lib/Subscribers/SubscriberActions.php @@ -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;