custom/plugins/CrswCleverReachOfficial/src/Subscriber/Automation/NewsletterSubscriber.php line 97

Open in your IDE?
  1. <?php /** @noinspection PhpUndefinedClassInspection */
  2. namespace Crsw\CleverReachOfficial\Subscriber\Automation;
  3. use Crsw\CleverReachOfficial\Components\EventHandlers\DoubleOptInHandler;
  4. use Crsw\CleverReachOfficial\Components\EventHandlers\RecipientHandler;
  5. use Crsw\CleverReachOfficial\Components\Utility\Bootstrap;
  6. use Crsw\CleverReachOfficial\Components\Utility\Initializer;
  7. use Crsw\CleverReachOfficial\Core\BusinessLogic\DoubleOptIn\DTO\DoiData;
  8. use Crsw\CleverReachOfficial\Core\BusinessLogic\Form\Exceptions\FailedToRetriveFormException;
  9. use Crsw\CleverReachOfficial\Core\BusinessLogic\Receiver\DTO\Receiver;
  10. use Crsw\CleverReachOfficial\Core\Infrastructure\Exceptions\BaseException;
  11. use Crsw\CleverReachOfficial\Core\Infrastructure\Logger\Logger;
  12. use Crsw\CleverReachOfficial\Core\Infrastructure\ORM\Exceptions\QueryFilterInvalidParamException;
  13. use Crsw\CleverReachOfficial\Core\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException;
  14. use Crsw\CleverReachOfficial\Entity\Customer\Repositories\SubscriberRepository;
  15. use Crsw\CleverReachOfficial\Service\BusinessLogic\DoubleOptIn\DoubleOptInRecordService;
  16. use DateTime;
  17. use Shopware\Core\Checkout\Customer\Event\CustomerRegisterEvent;
  18. use Shopware\Core\Checkout\Customer\Event\GuestCustomerRegisterEvent;
  19. use Shopware\Core\System\SalesChannel\SalesChannelEntity;
  20. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  21. use Symfony\Component\HttpFoundation\RequestStack;
  22. /**
  23.  * Class NewsletterSubscriber
  24.  *
  25.  * @package Crsw\CleverReachOfficial\Subscriber\Automation
  26.  */
  27. class NewsletterSubscriber implements EventSubscriberInterface
  28. {
  29.     /**
  30.      * @var RequestStack
  31.      */
  32.     private $requestStack;
  33.     /**
  34.      * @var SubscriberRepository
  35.      */
  36.     private $subscriberRepository;
  37.     /**
  38.      * @var DoubleOptInRecordService
  39.      */
  40.     private $doiRecordService;
  41.     /**
  42.      * @var DoubleOptInHandler
  43.      */
  44.     private $handler;
  45.     /**
  46.      * @var RecipientHandler
  47.      */
  48.     private $recipientHandler;
  49.     /**
  50.      * NewsletterSubscriber constructor.
  51.      *
  52.      * @param Initializer $initializer
  53.      * @param RequestStack $requestStack
  54.      * @param SubscriberRepository $subscriberRepository
  55.      * @param DoubleOptInRecordService $doiRecordService
  56.      * @param DoubleOptInHandler $handler
  57.      * @param RecipientHandler $recipientHandler
  58.      */
  59.     public function __construct(
  60.         Initializer $initializer,
  61.         RequestStack $requestStack,
  62.         SubscriberRepository $subscriberRepository,
  63.         DoubleOptInRecordService $doiRecordService,
  64.         DoubleOptInHandler $handler,
  65.         RecipientHandler $recipientHandler
  66.     ) {
  67.         Bootstrap::register();
  68.         $initializer->registerServices();
  69.         $this->requestStack $requestStack;
  70.         $this->subscriberRepository $subscriberRepository;
  71.         $this->doiRecordService $doiRecordService;
  72.         $this->handler $handler;
  73.         $this->recipientHandler $recipientHandler;
  74.     }
  75.     /**
  76.      * @inheritDoc
  77.      */
  78.     public static function getSubscribedEvents(): array
  79.     {
  80.         return [
  81.             CustomerRegisterEvent::class => 'onSubscribe',
  82.             GuestCustomerRegisterEvent::class => 'onSubscribe'
  83.         ];
  84.     }
  85.     /**
  86.      * Handles newsletter subscription.
  87.      *
  88.      * @param CustomerRegisterEvent $event
  89.      */
  90.     public function onSubscribe(CustomerRegisterEvent $event): void
  91.     {
  92.         $request $this->requestStack->getCurrentRequest();
  93.         if (!$request) {
  94.             return;
  95.         }
  96.         $customer $event->getCustomer();
  97.         $newsletter $request->get('option');
  98.         $subscriber $this->subscriberRepository->getByEmail($customer->getEmail());
  99.         if ($newsletter !== 'direct' || $subscriber) {
  100.             return;
  101.         }
  102.         if ($this->isCleverReachDoiEnabled($event)) {
  103.             try {
  104.                 $this->sendCleverReachDoi($customer->getEmail(), $event->getSalesChannelId());
  105.             } catch (BaseException $e) {
  106.                 Logger::logError('Failed to send double opt in email because: ' $e->getMessage(), 'Integration');
  107.             }
  108.             return;
  109.         }
  110.         $this->createSubscriber($customer->getEmail(), $event->getSalesChannelContext()->getSalesChannel());
  111.     }
  112.     /**
  113.      * @param CustomerRegisterEvent $event
  114.      *
  115.      * @return bool
  116.      */
  117.     private function isCleverReachDoiEnabled(CustomerRegisterEvent $event): bool
  118.     {
  119.         $salesChannelId $event->getSalesChannelId();
  120.         try {
  121.             $doiRecord $this->doiRecordService->findBySalesChannelId($salesChannelId);
  122.             return $doiRecord && $doiRecord->isStatus();
  123.         } catch (BaseException $e) {
  124.             return false;
  125.         }
  126.     }
  127.     /**
  128.      * @param string $email
  129.      * @param string $salesChannelId
  130.      *
  131.      * @throws FailedToRetriveFormException
  132.      * @throws QueryFilterInvalidParamException
  133.      * @throws RepositoryNotRegisteredException
  134.      */
  135.     private function sendCleverReachDoi(string $emailstring $salesChannelId): void
  136.     {
  137.         $data = new DoiData($_SERVER['REMOTE_ADDR'], $_SERVER['HTTP_REFERER'], $_SERVER['HTTP_USER_AGENT']);
  138.         $this->handler->sendDoubleOptInEmail($email$data$salesChannelId);
  139.     }
  140.     /**
  141.      * @param string $email
  142.      * @param SalesChannelEntity $salesChannelEntity
  143.      */
  144.     private function createSubscriber(string $emailSalesChannelEntity $salesChannelEntity): void
  145.     {
  146.         $receiver = new Receiver();
  147.         $receiver->setEmail($email);
  148.         $receiver->setRegistered(new DateTime());
  149.         $receiver->setActivated(new DateTime());
  150.         $receiver->setShop($salesChannelEntity->getName());
  151.         $this->subscriberRepository->create($receiver);
  152.         $this->recipientHandler->recipientSubscribedEvent($email);
  153.     }
  154. }