<?php
namespace App\EventSubscriber;
use ApiPlatform\Core\EventListener\EventPriorities;
use App\Entity\BaseUser;
use App\Entity\User;
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;
final class UserSubscriber implements EventSubscriberInterface
{
private MailerInterface $mailer;
private BaseUserService $baseUserService;
private BaseUserRepository $baseUserRepository;
public function __construct(MailerInterface $mailer, BaseUserService $baseUserService, BaseUserRepository $baseUserRepository)
{
$this->mailer = $mailer;
$this->baseUserService = $baseUserService;
$this->baseUserRepository = $baseUserRepository;
}
public static function getSubscribedEvents()
{
return [
KernelEvents::VIEW => ['create', EventPriorities::POST_WRITE],
];
}
public function create(ViewEvent $event): void
{
$admins = $this->baseUserRepository->findByRole('ROLE_ADMIN');
$user = $event->getControllerResult();
$request = $event->getRequest();
$method = $request->getMethod();
if (
!$user instanceof User
|| Request::METHOD_POST !== $method
|| $request->get('_route') !== 'api_users_post_collection'
) {
return;
}
/**
* MAIL:User
*/
$email = (new TemplatedEmail())
->from(new Address('noreply@ores.com', 'ORES'))
->to($user->getEmail())
->subject('Inscription sur ORES BFC')
->htmlTemplate('mails/user/create.html.twig')
->context([
'user' => $user
])
;
$this->mailer->send($email);
$this->sendMailCreateForAdmin(array_map(fn (BaseUser $baseUser) => $baseUser->getEmail(), $admins));
/**
* PUSH:Admin
*/
$message = (new ExpoMessage([
'title' => 'Un nouvel utilisateur s’est inscrit sur ORES BFC.',
'body' => 'Vous pouvez le consulter sur l’application.',
]))
->setChannelId('default')
->setBadge(0)
->playSound()
;
if ($devices = $this->baseUserService->getDevicesTokenFromRole('ROLE_ADMIN')) {
(new Expo)->send($message)->to($devices)->push();
}
}
public function sendMailCreateForAdmin(array $admins)
{
/**
* MAIL:Admin
*/
$email = (new TemplatedEmail())
->from(new Address('noreply@ores.com', 'ORES'))
->to(...$admins)
->subject('Nouvel utilisateur - ORES BFC')
->htmlTemplate('mails/user/create_admin.html.twig')
->context([])
;
$this->mailer->send($email);
}
}