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); $subscriberModel = Subscriber::findOne($subscriber->getId()); if ($subscriberModel) { $this->confirmationEmailMailer->sendConfirmationEmailOnce($subscriberModel); } if ($subscriber->getStatus() === SubscriberEntity::STATUS_SUBSCRIBED && $subscriberModel) { $this->newSubscriberNotificationMailer->send($subscriberModel, Segment::whereIn('id', $segmentIds)->findMany()); $this->welcomeScheduler->scheduleSubscriberWelcomeNotification( $subscriber->getId(), $segmentIds ); } return $subscriber; } }