This commit is part of a task to replace Paris with Doctrine in the class ConfirmationEmailMailer. Specifically, it removes two calls to Subscriber::setError() inside ConfirmationEmailMailer::sendConfirmationEmail(). setError() was used to define an error message that was used only in one of the instances where sendConfirmationEmail() is called (API::subscribeToLists()). setError() was replaced with code that throws an exception when there is an error. Thus it was necessary to change all the places where ConfirmationEmailMailer::sendConfirmationEmail() is called to handle the exception. In some cases, there are some oddities as sendConfirmationEmail() can return false or throw an exception in case of an error and calling code must account for both. I decided to settle with this approach as refactoring the rest of this method to use exceptions instead of returning false seemed outside of the scope of this task. [MAILPOET-3815]
128 lines
4.5 KiB
PHP
128 lines
4.5 KiB
PHP
<?php
|
|
|
|
namespace MailPoet\Subscribers;
|
|
|
|
use MailPoet\Entities\SubscriberEntity;
|
|
use MailPoet\Models\Segment;
|
|
use MailPoet\Models\Subscriber;
|
|
use MailPoet\Newsletter\Scheduler\WelcomeScheduler;
|
|
use MailPoet\Segments\SegmentsRepository;
|
|
use MailPoet\Settings\SettingsController;
|
|
use MailPoet\Util\Helpers;
|
|
|
|
class SubscriberActions {
|
|
|
|
/** @var SettingsController */
|
|
private $settings;
|
|
|
|
/** @var NewSubscriberNotificationMailer */
|
|
private $newSubscriberNotificationMailer;
|
|
|
|
/** @var ConfirmationEmailMailer */
|
|
private $confirmationEmailMailer;
|
|
|
|
/** @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,
|
|
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 = []): SubscriberEntity {
|
|
// filter out keys from the subscriber_data array
|
|
// that should not be editable when subscribing
|
|
$subscriberData = $this->subscriberSaveController->filterOutReservedColumns($subscriberData);
|
|
|
|
$signupConfirmationEnabled = (bool)$this->settings->get(
|
|
'signup_confirmation.enabled'
|
|
);
|
|
|
|
$subscriberData['subscribed_ip'] = Helpers::getIP();
|
|
|
|
$subscriber = $this->subscribersRepository->findOneBy(['email' => $subscriberData['email']]);
|
|
if (!$subscriber && !isset($subscriberData['source'])) {
|
|
$subscriberData['source'] = Source::FORM;
|
|
}
|
|
|
|
if (!$subscriber || !$signupConfirmationEnabled) {
|
|
// create new subscriber or update if no confirmation is required
|
|
$subscriber = $this->subscriberSaveController->createOrUpdate($subscriberData, $subscriber);
|
|
} else {
|
|
// store subscriber data to be updated after confirmation
|
|
$unconfirmedData = $this->subscriberSaveController->filterOutReservedColumns($subscriberData);
|
|
$unconfirmedData = json_encode($unconfirmedData);
|
|
$subscriber->setUnconfirmedData($unconfirmedData ?: null);
|
|
}
|
|
|
|
// Update custom fields
|
|
$this->subscriberSaveController->updateCustomFields($subscriberData, $subscriber);
|
|
|
|
// restore trashed subscriber
|
|
if ($subscriber->getDeletedAt()) {
|
|
$subscriber->setDeletedAt(null);
|
|
}
|
|
|
|
// set status depending on signup confirmation setting
|
|
if ($subscriber->getStatus() !== SubscriberEntity::STATUS_SUBSCRIBED) {
|
|
if ($signupConfirmationEnabled === true) {
|
|
$subscriber->setStatus(SubscriberEntity::STATUS_UNCONFIRMED);
|
|
} else {
|
|
$subscriber->setStatus(SubscriberEntity::STATUS_SUBSCRIBED);
|
|
}
|
|
}
|
|
|
|
$this->subscribersRepository->flush();
|
|
// link subscriber to segments
|
|
$segments = $this->segmentsRepository->findBy(['id' => $segmentIds]);
|
|
$this->subscriberSegmentRepository->subscribeToSegments($subscriber, $segments);
|
|
|
|
try {
|
|
$this->confirmationEmailMailer->sendConfirmationEmailOnce($subscriber);
|
|
} catch (\Exception $e) {
|
|
// ignore errors
|
|
}
|
|
|
|
$subscriberModel = Subscriber::findOne($subscriber->getId());
|
|
|
|
// We want to send the notification on subscribe only when signupConfirmation is disabled
|
|
if ($signupConfirmationEnabled === false && $subscriber->getStatus() === SubscriberEntity::STATUS_SUBSCRIBED && $subscriberModel) {
|
|
$this->newSubscriberNotificationMailer->send($subscriberModel, Segment::whereIn('id', $segmentIds)->findMany());
|
|
|
|
$this->welcomeScheduler->scheduleSubscriberWelcomeNotification(
|
|
$subscriber->getId(),
|
|
$segmentIds
|
|
);
|
|
}
|
|
|
|
return $subscriber;
|
|
}
|
|
}
|