Automatically execute body renderer when posting an email in Chill

+ adaptation of services which already uses body renderer
This commit is contained in:
Julien Fastré 2024-10-10 14:06:00 +02:00
parent 3d53e7da65
commit 1313b6f138
Signed by: julienfastre
GPG Key ID: BDE2190974723FCB
3 changed files with 15 additions and 6 deletions

View File

@ -12,9 +12,11 @@ declare(strict_types=1);
namespace Chill\MainBundle\Service\Mailer; namespace Chill\MainBundle\Service\Mailer;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\Mailer\Envelope; use Symfony\Component\Mailer\Envelope;
use Symfony\Component\Mailer\MailerInterface; use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Address; use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\BodyRendererInterface;
use Symfony\Component\Mime\Email; use Symfony\Component\Mime\Email;
use Symfony\Component\Mime\RawMessage; use Symfony\Component\Mime\RawMessage;
@ -22,7 +24,7 @@ class ChillMailer implements MailerInterface
{ {
private string $prefix = '[Chill] '; private string $prefix = '[Chill] ';
public function __construct(private readonly MailerInterface $initial, private readonly LoggerInterface $chillLogger) {} public function __construct(private readonly MailerInterface $initial, private readonly LoggerInterface $chillLogger, private readonly BodyRendererInterface $bodyRenderer) {}
public function send(RawMessage $message, ?Envelope $envelope = null): void public function send(RawMessage $message, ?Envelope $envelope = null): void
{ {
@ -30,6 +32,10 @@ class ChillMailer implements MailerInterface
$message->subject($this->prefix.$message->getSubject()); $message->subject($this->prefix.$message->getSubject());
} }
if ($message instanceof TemplatedEmail) {
$this->bodyRenderer->render($message);
}
$this->chillLogger->info('chill email sent', [ $this->chillLogger->info('chill email sent', [
'to' => array_map(static fn (Address $address) => $address->getAddress(), $message->getTo()), 'to' => array_map(static fn (Address $address) => $address->getAddress(), $message->getTo()),
'subject' => $message->getSubject(), 'subject' => $message->getSubject(),

View File

@ -14,6 +14,8 @@ namespace Chill\MainBundle\Tests\Workflow\Messenger;
use Chill\MainBundle\Entity\User; use Chill\MainBundle\Entity\User;
use Chill\MainBundle\Entity\Workflow\EntityWorkflow; use Chill\MainBundle\Entity\Workflow\EntityWorkflow;
use Chill\MainBundle\Repository\Workflow\EntityWorkflowRepository; use Chill\MainBundle\Repository\Workflow\EntityWorkflowRepository;
use Chill\MainBundle\Workflow\EntityWorkflowHandlerInterface;
use Chill\MainBundle\Workflow\EntityWorkflowManager;
use Chill\MainBundle\Workflow\Messenger\PostSendExternalMessage; use Chill\MainBundle\Workflow\Messenger\PostSendExternalMessage;
use Chill\MainBundle\Workflow\Messenger\PostSendExternalMessageHandler; use Chill\MainBundle\Workflow\Messenger\PostSendExternalMessageHandler;
use Chill\MainBundle\Workflow\WorkflowTransitionContextDTO; use Chill\MainBundle\Workflow\WorkflowTransitionContextDTO;
@ -25,6 +27,7 @@ use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\Mailer\MailerInterface; use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Address; use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\BodyRendererInterface; use Symfony\Component\Mime\BodyRendererInterface;
use Symfony\Component\Workflow\Registry;
/** /**
* @internal * @internal
@ -50,10 +53,12 @@ class PostSendExternalMessageHandlerTest extends TestCase
$mailer->send(Argument::that($this->buildCheckAddressCallback('3party@example.com')))->shouldBeCalledOnce(); $mailer->send(Argument::that($this->buildCheckAddressCallback('3party@example.com')))->shouldBeCalledOnce();
$mailer->send(Argument::that($this->buildCheckAddressCallback('external@example.com')))->shouldBeCalledOnce(); $mailer->send(Argument::that($this->buildCheckAddressCallback('external@example.com')))->shouldBeCalledOnce();
$bodyRenderer = $this->prophesize(BodyRendererInterface::class); $workflowHandler = $this->prophesize(EntityWorkflowHandlerInterface::class);
$bodyRenderer->render(Argument::type(TemplatedEmail::class))->shouldBeCalledTimes(2); $workflowHandler->getEntityTitle($entityWorkflow, Argument::any())->willReturn('title');
$workflowManager = $this->prophesize(EntityWorkflowManager::class);
$workflowManager->getHandler($entityWorkflow)->willReturn($workflowHandler->reveal());
$handler = new PostSendExternalMessageHandler($repository->reveal(), $mailer->reveal(), $bodyRenderer->reveal()); $handler = new PostSendExternalMessageHandler($repository->reveal(), $mailer->reveal(), $workflowManager->reveal());
$handler(new PostSendExternalMessage(1, 'fr')); $handler(new PostSendExternalMessage(1, 'fr'));

View File

@ -25,7 +25,6 @@ final readonly class PostSendExternalMessageHandler implements MessageHandlerInt
public function __construct( public function __construct(
private EntityWorkflowRepository $entityWorkflowRepository, private EntityWorkflowRepository $entityWorkflowRepository,
private MailerInterface $mailer, private MailerInterface $mailer,
private BodyRendererInterface $bodyRenderer,
private EntityWorkflowManager $workflowManager, private EntityWorkflowManager $workflowManager,
) {} ) {}
@ -56,7 +55,6 @@ final readonly class PostSendExternalMessageHandler implements MessageHandlerInt
'lang' => $message->lang, 'lang' => $message->lang,
]); ]);
$this->bodyRenderer->render($email);
$this->mailer->send($email); $this->mailer->send($email);
} }
} }