<?php
namespace App\Controller;
use App\Entity\DropEmailLog;
use App\Entity\Panier;
use App\Entity\Ref;
use App\Repository\AlbumParentNotificationRepository;
use App\Repository\DropEmailLogRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class EmailTrackingController extends AbstractController
{
/**
* @Route("/email-tracking/{id}", name="email_tracking_pixel")
*/
public function trackEmailOpen(Panier $panier, EntityManagerInterface $em): Response
{
$statutOuvert = $em->getRepository(Ref::class)->findOneBy(['code' => 'PANIER_EMAIL_OUVERT']);
if ($statutOuvert) {
$panier->setStatut($statutOuvert);
$em->flush();
}
return $this->transparentPixelResponse();
}
/**
* @Route("/drop-email-tracking/{trackingToken}", name="drop_email_tracking_pixel", methods={"GET"})
*/
public function trackDropEmailOpen(
string $trackingToken,
DropEmailLogRepository $repo,
EntityManagerInterface $em
): Response {
$log = $repo->findByTrackingToken($trackingToken);
if ($log !== null) {
if ($log->getOpenedAt() === null) {
$log->setOpenedAt(new \DateTimeImmutable());
}
$log->incrementOpenCount();
$em->flush();
}
return $this->transparentPixelResponse();
}
/**
* Pixel de suivi ouverture email "album prĂȘt" (parents).
*
* @Route("/album-email-tracking/{trackingToken}", name="album_email_tracking_pixel", methods={"GET"})
*/
public function trackAlbumEmailOpen(
string $trackingToken,
AlbumParentNotificationRepository $repo,
EntityManagerInterface $em
): Response {
$n = $repo->findByEmailTrackingToken($trackingToken);
if ($n !== null) {
if ($n->getEmailOpenedAt() === null) {
$n->setEmailOpenedAt(new \DateTimeImmutable());
}
$n->incrementEmailOpenCount();
$em->flush();
}
return $this->transparentPixelResponse();
}
/**
* Clic sur le CTA (lien drop) : enregistre le clic puis redirige vers le magic link.
*
* @Route("/drop-email-click/{trackingToken}", name="drop_email_tracking_click", methods={"GET"})
*/
public function trackDropEmailClick(
string $trackingToken,
DropEmailLogRepository $repo,
EntityManagerInterface $em
): Response {
$log = $repo->findByTrackingToken($trackingToken);
$redirectUrl = '/';
if ($log !== null) {
if ($log->getFirstClickedAt() === null) {
$log->setFirstClickedAt(new \DateTimeImmutable());
}
$log->incrementClickCount();
$em->flush();
$redirectUrl = $log->getMagicLinkUrl() ?? '/';
}
return new RedirectResponse($redirectUrl, 302);
}
private function transparentPixelResponse(): Response
{
$response = new Response(base64_decode('R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'));
$response->headers->set('Content-Type', 'image/gif');
$response->headers->set('Content-Length', '42');
$response->headers->set('Cache-Control', 'private, no-cache, no-store, must-revalidate');
$response->headers->set('Pragma', 'no-cache');
return $response;
}
}