<?php
namespace App\Controller;
use App\Entity\AccountingFirm;
use App\Entity\EmailBlacklist;
use App\Entity\RgpdContact;
use App\Repository\AccountingFirmRepository;
use App\Repository\AuthorizedDomainRepository;
use App\Services\WidgetMailing;
use Doctrine\ORM\EntityManagerInterface;
use Qferrer\Mjml\Twig\MjmlExtension;
use Response;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Routing\Annotation\Route;
use Twig\Environment;
class WidgetRGPDController extends AbstractController
{
protected MjmlExtension $mjmlRenderer;
protected Environment $twig;
public function __construct(MailerInterface $mailer, MjmlExtension $mjmlRenderer, Environment $twig)
{
$this->mjmlRenderer = $mjmlRenderer;
$this->twig = $twig;
}
#[Route('/check-rgpd', name: 'w_rgpd_check')]
public function ctrl_checkRgpd(Request $request, AccountingFirmRepository $repository, string $prefix = null): JsonResponse
{
$token = $request->query->get('token');
$host = $request->get('host');
if ($token && $host) {
$accountingFirm = $repository->findOneBy(['rgpdToken' => $token]);
$isAuthorized = false;
if ($accountingFirm && in_array($host, $accountingFirm->getListAuthorizedDomains())) {
$isAuthorized = true;
}
$url = $isAuthorized ? $accountingFirm->getRgpdWidgetUrl() : null;
} else {
$accountingFirm = $repository->findOneBy(['host' => $host]);
$url = $accountingFirm ? $prefix . $this->generateUrl('w_rgpd_get') : null;
}
return $this->json($url);
}
#[Route('/widget-rgpd', name: 'w_rgpd_get')]
public function ctrl_widgetRgpd(Request $request, AccountingFirmRepository $repository, AuthorizedDomainRepository $domains)
{
$token = $request->query->get('token');
$host = $request->get('host');
if ($host != "preview") {
$accountingFirm = $repository->findOneBy(['host' => $host]);
if (is_null($accountingFirm)) {
$domains = $domains->findBy(['name' => $host]);
if (is_null($domains)) {
throw new NotFoundHttpException();
}
foreach ($domains as $dom) {
$tmp_ac = $dom->getAccountingFirm();
if ($tmp_ac->getRgpdToken() == $token) {
$accountingFirm = $tmp_ac;
break;
}
}
}
if (is_null($accountingFirm)) {
throw new NotFoundHttpException();
}
}
return $this->render('widget_rgpd/content.html.twig', [
'cabinet' => $accountingFirm,
]);
}
#[Route('/embed', name: 'w_rgpd_embed')]
public function embed()
{
$root = $this->getParameter('kernel.project_dir');
$path = $root . '/public/widgets/rgpd/widget_rgpd.js';
return new BinaryFileResponse($path);
}
#[Route('/{filename}.{format}', name: 'w_rgpd_files')]
public function rgpd_files(string $filename, string $format)
{
$allowed = array('png', 'jpg', 'jpeg', 'gif', 'js', 'svg', 'eot', 'ttf', 'woff');
if (in_array($format, $allowed)) {
$root = $this->getParameter('kernel.project_dir');
$path = $root . '/public/rgpd/' . $filename . '.' . $format;
//dd(file_exists($path), $path, $request->getRequestFormat());
return new BinaryFileResponse($path);
}
return false;
}
#[Route('/send', name: 'rgpd_send_form')]
public function rgpd_send(Request $request, EntityManagerInterface $em, AccountingFirmRepository $accountingFirmRepository, WidgetMailing $mailing)
{
$email = $request->get('email');
$tel = $request->get('tel');
$name = $request->get('name');
$idCabinet = $request->get('cabinet');
$cabinet = $accountingFirmRepository->findById($idCabinet);
if (!empty($email) && !empty($name) && !empty($tel) && !empty($cabinet)) {
// Vérifier si l'email est dans la blacklist
$blacklistRepo = $em->getRepository(EmailBlacklist::class);
if ($blacklistRepo->isEmailBlacklisted($email)) {
// Incrémenter le compteur de tentatives
$blacklistedEmail = $blacklistRepo->findByEmail($email);
if ($blacklistedEmail) {
$blacklistedEmail->incrementBlockCount();
$em->persist($blacklistedEmail);
$em->flush();
}
return new JsonResponse(['status' => 'error', 'message' => 'Votre email est dans notre liste noire. Impossible d\'envoyer le message.'], 403);
}
$rgpdContact = new RgpdContact;
$rgpdContact->setEmail($email);
$rgpdContact->setPhone($tel);
$rgpdContact->setName($name);
$rgpdContact->setAccountingFirm($cabinet);
$rgpdContact->updateTimestamps();
$em->persist($rgpdContact);
$em->flush();
//send mail
$mailing->sendRgpdClient($cabinet, [ //Envoie au client
'name' => $name,
'email' => $email,
]);
if ($cabinet->isRgpdExpertExterneUse()) { // si le cabinet utilise son propre expert
$mailing->sendRgpdAgenceExpertExterne($cabinet, [ // envoie à lagence.expert
'name' => $name,
'email' => $email,
'tel' => $tel,
]);
$mailing->sendRgpdExpertExterne($cabinet, [ //envoie à l'expert du cabinet
'name' => $name,
'email' => $email,
'tel' => $tel,
]);
} else { //si c'est un partenaire de lagence.expert
$mailing->sendRgpdAgenceExpertInterne($cabinet, [ // envoie à lagence.expert
'name' => $name,
'email' => $email,
'tel' => $tel,
]);
$mailing->sendRgpdExpertInterne($cabinet, [ // envoie a partenaire de lagence.expert
'name' => $name,
'email' => $email,
'tel' => $tel,
]);
$mailing->sendRgpdCabinetInterne($cabinet, [ // envoie au cabinet concerné
'name' => $name,
'email' => $email,
'tel' => $tel,
]);
}
return new JsonResponse('success');
}
return new JsonResponse('error');
}
}