<?php
namespace Entrepreneurs\Bundle\AppBundle\Controller;
use Entrepreneurs\Bundle\AppBundle\Propel\SentEmailMailjetTrack;
use Entrepreneurs\Bundle\AppBundle\Propel\SentEmailMailjetTrackQuery;
use Entrepreneurs\Bundle\AppBundle\Propel\SentEmailQuery;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class ApiController extends AbstractController
{
#[Route('/api/mail/webhook/{hash}', name: 'api_mails_webhook')]
public function webhook(Request $request, string $hash, string $webhookHash): Response
{
if ($hash !== $webhookHash) {
return new JsonResponse(['error' => 'Accès non autorisé'], Response::HTTP_FORBIDDEN);
}
$content = $request->getContent();
$event = json_decode($content, true);
if ($event) {
$messageId = $event['CustomID'] ?? null;
$eventType = $event['event'] ?? null;
if (in_array($eventType, ['sent', 'open', 'click', 'bounce'])) {
$sentMail = SentEmailQuery::create()->filterByMessageId($messageId)->findOne();
if ($sentMail) {
$sentMailJetTrack = SentEmailMailjetTrackQuery::create()
->select('id')
->filterBySentEmailId($sentMail->getId())
->filterByMailjetEventType($eventType)
->findOne()
;
$date = new \DateTime();
if (!$sentMailJetTrack) {
$sentMailJetTrack = new SentEmailMailjetTrack();
$sentMailJetTrack->setSentEmailId($sentMail->getId());
$sentMailJetTrack->setMailjetEventType($eventType);
$sentMailJetTrack->setDate($date);
$sentMailJetTrack->setRecipient($event['email']);
$sentMailJetTrack->setTargetLinkUrl($event['url'] ?? null);
$sentMailJetTrack->setMessageId($messageId);
$sentMailJetTrack->setFailReason($event['error'] ?? null);
$sentMailJetTrack->save();
$sentMail->setLastStatus($sentMail->describeEvent($eventType, $date));
$sentMail->save();
}
}
}
}
return new JsonResponse(['status' => 'success']);
}
}