<?php
namespace App\Service\Subscribers;
use App\Message\ReadService;
use App\Repository\ServiceRepository;
use App\Repository\UserRepository;
use App\Service\Email\EmailService;
use App\Util\UserRole;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Messenger\Event\WorkerMessageFailedEvent;
use Symfony\Contracts\Translation\TranslatorInterface;
class FailedMessageQueueSubscriber implements EventSubscriberInterface
{
use UserRole;
private $emailService;
private $userRepository;
private $translator;
private $serviceRepository;
public function __construct(
EmailService $emailService,
UserRepository $userRepository,
TranslatorInterface $translator,
ServiceRepository $serviceRepository
) {
$this->emailService = $emailService;
$this->userRepository = $userRepository;
$this->translator = $translator;
$this->serviceRepository = $serviceRepository;
}
public static function getSubscribedEvents(): array
{
return [
WorkerMessageFailedEvent::class => ['notify'],
];
}
public function notify(WorkerMessageFailedEvent $event)
{
if ($event->willRetry()) {
return;
}
if (get_class($event->getEnvelope()->getMessage()) === ReadService::class){
$superAdmins = $this->userRepository->findUsersByrole($this->roleSuperAdmin);
$subject = $this->translator->trans('email.failed-read.subject');
$serviceId = $event->getEnvelope()->getMessage()->getServiceId();
$service = $this->serviceRepository->findById($serviceId);
foreach ($superAdmins as $superAdmin) {
if ($superAdmin->getEmail()) {
$this->emailService->send($superAdmin->getEmail(), $subject, 'emails/failed-read.html.twig', ['serviceName' => $service->getName()]);
}
}
}
}
}