<?php
namespace App\EventSubscriber\Messaging;
use App\Entity\Messaging\Conversation;
use App\Entity\Messaging\Message;
use App\Entity\User;
use App\Event\Messaging\MessageCreatedEvent;
use App\EventSubscriber\AbstractEmailSubscriber;
use App\Manager\ConversationManager;
use App\Manager\Mailer;
use App\Manager\MailTypeInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Twig\Environment;
class MessageSubscriber extends AbstractEmailSubscriber
{
use MailerTeamTrait;
public function __construct(
Mailer $mailer,
Environment $templating,
TranslatorInterface $translator,
protected readonly ConversationManager $conversationManager
) {
parent::__construct($mailer, $templating, $translator);
}
public function onMessageCreated(MessageCreatedEvent $event): void
{
$message = $event->getMessage();
$conversation = $message->getConversation();
if (!$conversation instanceof Conversation || !$conversation->getUser() instanceof User) {
throw new \LogicException();
}
if (Message::SCP_TYPE === $message->getType()) {
$this->notifyCustomer($message, $conversation);
} else {
$this->notifyTeam($message, $conversation);
}
}
public static function getSubscribedEvents(): array
{
return [
MessageCreatedEvent::class => 'onMessageCreated',
];
}
protected function notifyCustomer(Message $message, Conversation $conversation): void
{
$user = $conversation->getUser();
$subject = $this->transEmail('conversation.new_message.subject');
$messageBody = $this->templating->render('email/messaging/new_message.html.twig', [
'customer' => $conversation->getUser(),
'conversation' => $conversation,
'isSCPInitConversation' => $this->conversationManager->isSCPInitConversation($conversation),
'message' => $message,
]);
$to = $user->getEmail();
$this->mailer->sendMail([$to], $subject, $messageBody, MailTypeInterface::MESSAGING_CONVERSATION_NEW_MESSAGE_CUSTOMER);
}
protected function notifyTeam(Message $message, Conversation $conversation): void
{
$subject = $this->transEmail('conversation.new_message_customer.subject');
$messageBody = $this->templating->render('email/messaging/new_message_customer.html.twig', [
'customer' => $conversation->getUser(),
'contrat' => $conversation->getContractNumbers(),
'conversation' => $conversation,
'message' => $message,
]);
$this->sendEmailToTeam(
$this->mailer,
$conversation->getTeam(),
$messageBody,
$subject,
MailTypeInterface::MESSAGING_CONVERSATION_NEW_MESSAGE_TEAM
);
}
}