src/FlexApp/EventSubscriber/EmailClickSubscriber.php line 36

Open in your IDE?
  1. <?php
  2. namespace FlexApp\EventSubscriber;
  3. use Doctrine\ORM\EntityManagerInterface;
  4. use FlexApp\Entity\InvitationEmailDeliveryStats;
  5. use FlexApp\Repository\InvitationEmailDeliveryStatsRepository;
  6. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  7. use Symfony\Component\HttpKernel\Event\RequestEvent;
  8. use Symfony\Component\HttpKernel\KernelEvents;
  9. use WebBundle\Repository\BuyOrderRepository;
  10. use WebBundle\Repository\UserRepository;
  11. class EmailClickSubscriber implements EventSubscriberInterface
  12. {
  13.     private UserRepository $userRepository;
  14.     private BuyOrderRepository $buyOrderRepository;
  15.     private InvitationEmailDeliveryStatsRepository $invitationEmailDeliveryStatsRepository;
  16.     private EntityManagerInterface $entityManager;
  17.     public function __construct(UserRepository $userRepositoryBuyOrderRepository $buyOrderRepositoryInvitationEmailDeliveryStatsRepository $invitationEmailDeliveryStatsRepositoryEntityManagerInterface $entityManager)
  18.     {
  19.         $this->userRepository $userRepository;
  20.         $this->buyOrderRepository $buyOrderRepository;
  21.         $this->invitationEmailDeliveryStatsRepository $invitationEmailDeliveryStatsRepository;
  22.         $this->entityManager $entityManager;
  23.     }
  24.     public static function getSubscribedEvents(): array
  25.     {
  26.         return [
  27.             KernelEvents::REQUEST => ['onKernelRequest'2048],
  28.         ];
  29.     }
  30.     public function onKernelRequest(RequestEvent $event)
  31.     {
  32.         if (!$event->isMainRequest()) {
  33.             return;
  34.         }
  35.         $request $event->getRequest();
  36.         if ((!str_contains($request->getRequestUri(), 'login_check_link'))) {
  37.             return;
  38.         }
  39.         if (!str_contains($request->getRequestUri(), 'leave_review%2Fshow')) {
  40.             return;
  41.         }
  42.         $email $request->query->get('user');
  43.         $user $this->userRepository->findOneBy(['email' => $email]);
  44.         if (!$user) {
  45.             return;
  46.         }
  47.         $redirectUrl $request->query->get('redirect_url');
  48.         if (!is_string($redirectUrl) || $redirectUrl === '') {
  49.             return;
  50.         }
  51.         $decoded rawurldecode($redirectUrl);
  52.         $path parse_url($decodedPHP_URL_PATH) ?? '';
  53.         $orderId null;
  54.         if (preg_match('#/leave_review/show/(\d+)(?:$|[/?])#'$path$m)) {
  55.             $orderId = (int) $m[1];
  56.         }
  57.         $order $this->buyOrderRepository->findOneBy(['id' => $orderId'user' => $user]);
  58.         if (!$order) {
  59.             return;
  60.         }
  61.         $invitationEmailDeliveryStats $this->invitationEmailDeliveryStatsRepository->findOneBy(['order' => $order]);
  62.         if (!$invitationEmailDeliveryStats) {
  63.             $invitationEmailDeliveryStats = new InvitationEmailDeliveryStats($order);
  64.         }
  65.         $invitationEmailDeliveryStats->setLinkIsClicked(true);
  66.         $this->entityManager->persist($invitationEmailDeliveryStats);
  67.         $this->entityManager->flush();
  68.     }
  69. }