src/EventSubscriber/AlertSubscriber.php line 117

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use ApiPlatform\Core\EventListener\EventPriorities;
  4. use App\Api\Dto\DeviceTokenInput;
  5. use App\Entity\Alert;
  6. use App\Entity\BaseUser;
  7. use App\Repository\BaseUserRepository;
  8. use App\Services\BaseUserService;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use ExpoSDK\Expo;
  11. use ExpoSDK\ExpoMessage;
  12. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  13. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent;
  16. use Symfony\Component\HttpKernel\Event\ViewEvent;
  17. use Symfony\Component\HttpKernel\KernelEvents;
  18. use Symfony\Component\Mime\Address;
  19. use Symfony\Component\Mime\Email;
  20. use Symfony\Component\Mailer\MailerInterface;
  21. use Symfony\Component\Security\Core\Security;
  22. final class AlertSubscriber implements EventSubscriberInterface
  23. {
  24.     private MailerInterface $mailer;
  25.     private BaseUserRepository $baseUserRepository;
  26.     private Security $security;
  27.     private BaseUserService $baseUserService;
  28.     private EntityManagerInterface $em;
  29.     public function __construct(MailerInterface $mailerBaseUserRepository $baseUserRepositorySecurity $securityBaseUserService $baseUserServiceEntityManagerInterface $em)
  30.     {
  31.         $this->mailer $mailer;
  32.         $this->baseUserRepository $baseUserRepository;
  33.         $this->security $security;
  34.         $this->baseUserService $baseUserService;
  35.         $this->em $em;
  36.     }
  37.     public static function getSubscribedEvents()
  38.     {
  39.         return [
  40.             KernelEvents::VIEW => [
  41.                 ['create'EventPriorities::POST_WRITE],
  42.                 ['delete'EventPriorities::POST_WRITE],
  43.             ],
  44.         ];
  45.     }
  46.     public function create(ViewEvent $event): void
  47.     {
  48.         $alert $event->getControllerResult();
  49.         $request $event->getRequest();
  50.         $method $request->getMethod();
  51.         $createdBy $this->security->getUser();
  52.         $admins $this->baseUserRepository->findByRole('ROLE_ADMIN');
  53.         if (
  54.             !$alert instanceof Alert
  55.             || Request::METHOD_POST !== $method
  56.             || $request->get('_route') !== 'api_alerts_post_collection'
  57.         ) {
  58.             return;
  59.         }
  60.         if ($this->security->isGranted("ROLE_ADMIN")) {
  61.             /**
  62.              * Mail non cohérent car l'alerte n'est pas reliée à une pharmacie
  63.              */
  64.             $this->sendMailCreateByAdmin($alert->getEmail(), $alert);
  65.         } else {
  66.             $this->sendMailCreate($createdBy$alert);
  67.             $this->sendMailCreateForAdmin(array_map(fn (BaseUser $baseUser) => $baseUser->getEmail(), $admins), $alert);
  68.         }
  69.         $this->sendPushCreate($this->baseUserService->getDevicesTokenFromRole('ROLE_ADMIN'));
  70.         $baseUsersSolidarity $this->baseUserRepository->findBy(['isSolidarity' => true]);
  71.         $mails = [];
  72.         $pushs = [];
  73.         foreach ($baseUsersSolidarity as $baseUserSolidarity) {
  74.             if ($baseUserSolidarity === $createdBy) continue;
  75.             switch ($baseUserSolidarity->getNotificationType()) {
  76.                 case BaseUser::NOTIFICATION_MAIL:
  77.                     $mails[] = $baseUserSolidarity;
  78.                     break;
  79.                 case BaseUser::NOTIFICATION_PUSH:
  80.                     if ($d $baseUserSolidarity->getDevicesTokensExpo()) {
  81.                         $pushs[] = $d;
  82.                     }
  83.                     break;
  84.                 case BaseUser::NOTIFICATION_PUSH_MAIL:
  85.                     $mails[] = $baseUserSolidarity;
  86.                     if ($d $baseUserSolidarity->getDevicesTokensExpo()) {
  87.                         $pushs[] = $d;
  88.                     }
  89.                     break;
  90.             }
  91.         }
  92.         $dateCreatedAt = new \DateTimeImmutable($alert->getCreatedAt()->format('Y-m-d'));
  93.         $dateEnd $dateCreatedAt->modify("+10 day");
  94.         if (!$alert->getDateEndAt()) {
  95.             $alert->setDateEndAt($dateEnd);
  96.         }
  97.         $this->em->flush();
  98.         $this->sendMailCreateSolidarity($mails$alert);
  99.         $this->sendPushCreate(array_merge(...$pushs));
  100.     }
  101.     public function delete(ViewEvent $event): void
  102.     {
  103.         $alert $event->getControllerResult();
  104.         $method $event->getRequest()->getMethod();
  105.         if (!$alert instanceof Alert || Request::METHOD_DELETE !== $method) {
  106.             return;
  107.         }
  108.         $this->sendMailRemove($alert->getEmail(), $alert);
  109.     }
  110.     public function sendMailRemove($toAlert $alert)
  111.     {
  112.         /**
  113.          * MAIL:BaseUser
  114.          */
  115.         $email = (new TemplatedEmail())
  116.             ->from(new Address('noreply@ores.com''ORES'))
  117.             ->to($to)
  118.             ->subject('Suppression de votre alerte - ORES BFC')
  119.             ->htmlTemplate('mails/alert/remove.html.twig')
  120.             ->context([
  121.                 'alert' => $alert,
  122.             ])
  123.         ;
  124.         $this->mailer->send($email);
  125.     }
  126.     public function sendMailCreateByAdmin($toAlert $alert)
  127.     {
  128.         /**
  129.          * MAIL:BaseUser
  130.          */
  131.         $email = (new TemplatedEmail())
  132.             ->from(new Address('noreply@ores.com''ORES'))
  133.             ->to($to)
  134.             ->subject('Une nouvelle alerte a été créée pour vous - ORES BFC')
  135.             ->htmlTemplate('mails/alert/create_by_admin.html.twig')
  136.             ->context([
  137.                 'alert' => $alert,
  138.             ])
  139.         ;
  140.         $this->mailer->send($email);
  141.     }
  142.     public function sendMailCreate(BaseUser $baseUserAlert $alert)
  143.     {
  144.         /**
  145.          * MAIL:BaseUser
  146.          */
  147.         $email = (new TemplatedEmail())
  148.             ->from(new Address('noreply@ores.com''ORES'))
  149.             ->to($baseUser->getEmail())
  150.             ->subject('Création d’une offre - ORES BFC')
  151.             ->htmlTemplate('mails/alert/create.html.twig')
  152.             ->context([
  153.                 'alert' => $alert,
  154.                 'user' => $baseUser,
  155.             ])
  156.         ;
  157.         $this->mailer->send($email);
  158.     }
  159.     public function sendMailCreateSolidarity(array $baseUsersAlert $alert)
  160.     {
  161.         $tos array_map(fn (BaseUser $baseUser) => $baseUser->getEmail(), $baseUsers);
  162.         foreach ($tos as $to) {
  163.             /**
  164.              * MAIL:BaseUser
  165.              */
  166.             $email = (new TemplatedEmail())
  167.                 ->from(new Address('noreply@ores.com''ORES'))
  168.                 ->to($to)
  169.                 ->subject('Nouvelle alerte - ORES BFC')
  170.                 ->htmlTemplate('mails/alert/create_solidarity.html.twig')
  171.                 ->context([
  172.                     'alert' => $alert,
  173.                 ])
  174.             ;
  175.             $this->mailer->send($email);
  176.         }
  177.     }
  178.     public function sendMailCreateForAdmin(array $adminsAlert $alert)
  179.     {
  180.         /**
  181.          * MAIL:Admin
  182.          */
  183.         $email = (new TemplatedEmail())
  184.             ->from(new Address('noreply@ores.com''ORES'))
  185.             ->to(...$admins)
  186.             ->subject('Nouvelle alerte - ORES BFC')
  187.             ->htmlTemplate('mails/alert/create_admin.html.twig')
  188.             ->context([
  189.                 'alert' => $alert,
  190.             ])
  191.         ;
  192.         $this->mailer->send($email);
  193.     }
  194.     public function sendPushCreate(?array $tos)
  195.     {
  196.         /**
  197.          * PUSH:BaseUser PUSH:Admin
  198.          */
  199.         $message = (new ExpoMessage([
  200.             'title' => 'Nouvelle alerte',
  201.             'body' => 'Vous pouvez la consulter directement sur l’application.',
  202.         ]))
  203.             ->setChannelId('default')
  204.             ->setBadge(0)
  205.             ->playSound()
  206.         ;
  207.         if (!empty($tos)) {
  208.             return (new Expo)->send($message)->to($tos)->push();
  209.         }
  210.     }
  211. }