<?php
namespace FlexApp\EventSubscriber;
use Doctrine\ORM\EntityManagerInterface;
use FlexApp\Entity\InvitationEmailDeliveryStats;
use FlexApp\Repository\InvitationEmailDeliveryStatsRepository;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use WebBundle\Repository\BuyOrderRepository;
use WebBundle\Repository\UserRepository;
class EmailClickSubscriber implements EventSubscriberInterface
{
private UserRepository $userRepository;
private BuyOrderRepository $buyOrderRepository;
private InvitationEmailDeliveryStatsRepository $invitationEmailDeliveryStatsRepository;
private EntityManagerInterface $entityManager;
public function __construct(UserRepository $userRepository, BuyOrderRepository $buyOrderRepository, InvitationEmailDeliveryStatsRepository $invitationEmailDeliveryStatsRepository, EntityManagerInterface $entityManager)
{
$this->userRepository = $userRepository;
$this->buyOrderRepository = $buyOrderRepository;
$this->invitationEmailDeliveryStatsRepository = $invitationEmailDeliveryStatsRepository;
$this->entityManager = $entityManager;
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => ['onKernelRequest', 2048],
];
}
public function onKernelRequest(RequestEvent $event)
{
if (!$event->isMainRequest()) {
return;
}
$request = $event->getRequest();
if ((!str_contains($request->getRequestUri(), 'login_check_link'))) {
return;
}
if (!str_contains($request->getRequestUri(), 'leave_review%2Fshow')) {
return;
}
$email = $request->query->get('user');
$user = $this->userRepository->findOneBy(['email' => $email]);
if (!$user) {
return;
}
$redirectUrl = $request->query->get('redirect_url');
if (!is_string($redirectUrl) || $redirectUrl === '') {
return;
}
$decoded = rawurldecode($redirectUrl);
$path = parse_url($decoded, PHP_URL_PATH) ?? '';
$orderId = null;
if (preg_match('#/leave_review/show/(\d+)(?:$|[/?])#', $path, $m)) {
$orderId = (int) $m[1];
}
$order = $this->buyOrderRepository->findOneBy(['id' => $orderId, 'user' => $user]);
if (!$order) {
return;
}
$invitationEmailDeliveryStats = $this->invitationEmailDeliveryStatsRepository->findOneBy(['order' => $order]);
if (!$invitationEmailDeliveryStats) {
$invitationEmailDeliveryStats = new InvitationEmailDeliveryStats($order);
}
$invitationEmailDeliveryStats->setLinkIsClicked(true);
$this->entityManager->persist($invitationEmailDeliveryStats);
$this->entityManager->flush();
}
}