src/Controller/EmailTrackingController.php line 57

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\DropEmailLog;
  4. use App\Entity\Panier;
  5. use App\Entity\Ref;
  6. use App\Repository\AlbumParentNotificationRepository;
  7. use App\Repository\DropEmailLogRepository;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  10. use Symfony\Component\HttpFoundation\RedirectResponse;
  11. use Symfony\Component\HttpFoundation\Response;
  12. use Symfony\Component\Routing\Annotation\Route;
  13. class EmailTrackingController extends AbstractController
  14. {
  15.     /**
  16.      * @Route("/email-tracking/{id}", name="email_tracking_pixel")
  17.      */
  18.     public function trackEmailOpen(Panier $panierEntityManagerInterface $em): Response
  19.     {
  20.         $statutOuvert $em->getRepository(Ref::class)->findOneBy(['code' => 'PANIER_EMAIL_OUVERT']);
  21.         if ($statutOuvert) {
  22.             $panier->setStatut($statutOuvert);
  23.             $em->flush();
  24.         }
  25.         return $this->transparentPixelResponse();
  26.     }
  27.     /**
  28.      * @Route("/drop-email-tracking/{trackingToken}", name="drop_email_tracking_pixel", methods={"GET"})
  29.      */
  30.     public function trackDropEmailOpen(
  31.         string $trackingToken,
  32.         DropEmailLogRepository $repo,
  33.         EntityManagerInterface $em
  34.     ): Response {
  35.         $log $repo->findByTrackingToken($trackingToken);
  36.         if ($log !== null) {
  37.             if ($log->getOpenedAt() === null) {
  38.                 $log->setOpenedAt(new \DateTimeImmutable());
  39.             }
  40.             $log->incrementOpenCount();
  41.             $em->flush();
  42.         }
  43.         return $this->transparentPixelResponse();
  44.     }
  45.     /**
  46.      * Pixel de suivi ouverture email "album prĂȘt" (parents).
  47.      *
  48.      * @Route("/album-email-tracking/{trackingToken}", name="album_email_tracking_pixel", methods={"GET"})
  49.      */
  50.     public function trackAlbumEmailOpen(
  51.         string $trackingToken,
  52.         AlbumParentNotificationRepository $repo,
  53.         EntityManagerInterface $em
  54.     ): Response {
  55.         $n $repo->findByEmailTrackingToken($trackingToken);
  56.         if ($n !== null) {
  57.             if ($n->getEmailOpenedAt() === null) {
  58.                 $n->setEmailOpenedAt(new \DateTimeImmutable());
  59.             }
  60.             $n->incrementEmailOpenCount();
  61.             $em->flush();
  62.         }
  63.         return $this->transparentPixelResponse();
  64.     }
  65.     /**
  66.      * Clic sur le CTA (lien drop) : enregistre le clic puis redirige vers le magic link.
  67.      *
  68.      * @Route("/drop-email-click/{trackingToken}", name="drop_email_tracking_click", methods={"GET"})
  69.      */
  70.     public function trackDropEmailClick(
  71.         string $trackingToken,
  72.         DropEmailLogRepository $repo,
  73.         EntityManagerInterface $em
  74.     ): Response {
  75.         $log $repo->findByTrackingToken($trackingToken);
  76.         $redirectUrl '/';
  77.         if ($log !== null) {
  78.             if ($log->getFirstClickedAt() === null) {
  79.                 $log->setFirstClickedAt(new \DateTimeImmutable());
  80.             }
  81.             $log->incrementClickCount();
  82.             $em->flush();
  83.             $redirectUrl $log->getMagicLinkUrl() ?? '/';
  84.         }
  85.         return new RedirectResponse($redirectUrl302);
  86.     }
  87.     private function transparentPixelResponse(): Response
  88.     {
  89.         $response = new Response(base64_decode('R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'));
  90.         $response->headers->set('Content-Type''image/gif');
  91.         $response->headers->set('Content-Length''42');
  92.         $response->headers->set('Cache-Control''private, no-cache, no-store, must-revalidate');
  93.         $response->headers->set('Pragma''no-cache');
  94.         return $response;
  95.     }