<?php
namespace App\EventSubscriber;
use ApiPlatform\Core\EventListener\EventPriorities;
use App\Entity\BaseUser;
use App\Entity\Pharmacy;
use App\Repository\BaseUserRepository;
use App\Services\BaseUserService;
use ExpoSDK\Expo;
use ExpoSDK\ExpoMessage;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\Email;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Security\Core\Security;
final class PharmacySubscriber implements EventSubscriberInterface
{
private MailerInterface $mailer;
private BaseUserRepository $baseUserRepository;
private Security $security;
private BaseUserService $baseUserService;
public function __construct(MailerInterface $mailer, BaseUserRepository $baseUserRepository, Security $security, BaseUserService $baseUserService)
{
$this->mailer = $mailer;
$this->baseUserRepository = $baseUserRepository;
$this->security = $security;
$this->baseUserService = $baseUserService;
}
public static function getSubscribedEvents()
{
return [
KernelEvents::VIEW => ['create', EventPriorities::POST_WRITE],
];
}
public function create(ViewEvent $event): void
{
$pharmacy = $event->getControllerResult();
$request = $event->getRequest();
$method = $request->getMethod();
if (
!$pharmacy instanceof Pharmacy
|| Request::METHOD_POST !== $method
|| $request->get('_route') !== 'api_pharmacies_post_collection'
) {
return;
}
/** Check si ça a été créé par un admin ou non */
if (!$this->security->isGranted('ROLE_ADMIN')) {
/**
* MAIL:Pharmacy
*/
$email = (new TemplatedEmail())
->from(new Address('noreply@ores.com', 'ORES'))
->to($pharmacy->getEmail())
->subject('Inscription sur ORES BFC')
->htmlTemplate('mails/pharmacy/create.html.twig')
->context([
'pharmacy' => $pharmacy
])
;
$this->mailer->send($email);
/** Envoi les mails aux admins */
$admins = $this->baseUserRepository->findByRole('ROLE_ADMIN');
/**
* MAIL:Admin
*/
foreach ($admins as $admin) {
$email = (new TemplatedEmail())
->from(new Address('noreply@ores.com', 'ORES'))
->to($admin->getEmail(), 'secretariat@urpspharmaciens-bfc.com', 'contact@urps-pharmaciens-bfc.com', 'kevin.akyos@gmail.com')
->subject('Nouveau propriétaire d’officine - ORES BFC')
->htmlTemplate('mails/base_user/admin_create_pharmacy.html.twig')
->context([
'admin' => $admin
])
;
$this->mailer->send($email);
}
/**
* PUSH:Admin
*/
$message = (new ExpoMessage([
'title' => 'Propriétaire d’officine en attente de validation',
'body' => 'Vous pouvez consulter la demande sur l’application.',
]))
->setChannelId('default')
->setBadge(0)
->playSound()
;
if ($devices = $this->baseUserService->getDevicesTokenFromRole('ROLE_ADMIN')) {
(new Expo)->send($message)->to($devices)->push();
}
} else {
/** Todo: mails quand c'est créé par un admin ? */
}
}
}