Skip to content
Snippets Groups Projects
Commit d7e49377 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Envoi du token par mail : retrait de l'injection du MailerService dans le...

Envoi du token par mail : retrait de l'injection du MailerService dans le TokenService car ça pouvait créer une boucle infinie de dépendances et ce n'était pas une bonne idée de toute façon (TokenService n'a pas vocation à envoyer des mails). C'est TokenController qui envoie le mail désormais.
parent 680c4e5a
No related branches found
No related tags found
No related merge requests found
Pipeline #30216 passed
......@@ -3,22 +3,20 @@
namespace UnicaenAuthToken\Controller;
use InvalidArgumentException;
use Laminas\Http\Response;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\Mvc\Plugin\FlashMessenger\FlashMessenger;
use Laminas\View\Model\ViewModel;
use RuntimeException;
use UnexpectedValueException;
use UnicaenApp\Mvc\RedirectResponse;
use UnicaenApp\Service\Mailer\MailerServiceAwareTrait;
use UnicaenAuth\Entity\Db\UserInterface;
use UnicaenAuth\Service\Traits\UserServiceAwareTrait;
use UnicaenAuthToken\Entity\Db\AbstractUserToken;
use UnicaenAuthToken\Form\UserTokenForm;
use UnicaenAuthToken\Service\TokenServiceAwareTrait;
use UnicaenAuthToken\Service\TokenServiceException;
use Laminas\EventManager\EventManagerInterface;
use Laminas\EventManager\ListenerAggregateInterface;
use Laminas\EventManager\ListenerAggregateTrait;
use Laminas\Http\Response;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\Mvc\Plugin\FlashMessenger\FlashMessenger;
use Laminas\View\Model\ViewModel;
/**
* Class TokenController
......@@ -29,6 +27,7 @@ class TokenController extends AbstractActionController
{
use TokenServiceAwareTrait;
use UserServiceAwareTrait;
use MailerServiceAwareTrait;
const PROLONG_SPEC = '+1 week';
const PROLONG_SPEC_TOSTRING = '1 semaine';
......@@ -268,7 +267,15 @@ class TokenController extends AbstractActionController
try {
$this->triggerEvent(static::EVENT_TOKEN_SEND_BEFORE, ['userToken' => $userToken]);
$message = $this->tokenService->sendUserToken($userToken);
$message = $this->tokenService->createUserTokenMail($userToken);
try {
$message = $this->mailerService->send($message);
} catch (\Exception $e) {
throw new TokenServiceException("L'envoi du token par mail a échoué", null, $e);
}
$userToken->setSentOn(new \DateTime('now'));
$this->tokenService->saveUserToken($userToken);
$this->flashMessenger()->addSuccessMessage(sprintf(
"Le jeton utilisateur a été envoyé avec succès à %s.",
......
......@@ -4,12 +4,17 @@ namespace UnicaenAuthToken\Controller;
use Interop\Container\ContainerInterface;
use UnicaenApp\Mvc\RedirectResponse;
use UnicaenApp\Service\Mailer\MailerService;
use UnicaenAuth\Service\User as UserService;
use UnicaenAuthToken\Form\UserTokenForm;
use UnicaenAuthToken\Service\TokenService;
class TokenControllerFactory
{
/**
* @throws \Psr\Container\NotFoundExceptionInterface
* @throws \Psr\Container\ContainerExceptionInterface
*/
public function __invoke(ContainerInterface $container): TokenController
{
$controller = new TokenController();
......@@ -28,6 +33,9 @@ class TokenControllerFactory
$redirectResponse = $container->get(RedirectResponse::class);
$controller->setRedirectResponse($redirectResponse);
$mailerService = $container->get(MailerService::class);
$controller->setMailerService($mailerService);
return $controller;
}
}
\ No newline at end of file
......@@ -7,16 +7,18 @@ use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\ORMException;
use Exception;
use Ramsey\Uuid\Uuid;
use UnicaenApp\Controller\Plugin\AppInfos;
use UnicaenApp\Service\Mailer\MailerServiceAwareTrait;
use UnicaenAuthToken\Entity\Db\AbstractUserToken;
use UnicaenAuthToken\Options\ModuleOptionsAwareTrait;
use Laminas\Mail\Exception\ExceptionInterface as MailException;
use Laminas\Mail\Message;
use Laminas\Mime\Message as MimeMessage;
use Laminas\Mime\Mime;
use Laminas\Mime\Part;
use Laminas\Router\RouteInterface;
use Laminas\Uri\Uri;
use Laminas\View\Renderer\PhpRenderer;
use Ramsey\Uuid\Uuid;
use UnicaenApp\Controller\Plugin\AppInfos;
use UnicaenAuthToken\Entity\Db\AbstractUserToken;
use UnicaenAuthToken\Options\ModuleOptionsAwareTrait;
/**
* @method AppInfos appInfos()
......@@ -24,7 +26,6 @@ use Laminas\View\Renderer\PhpRenderer;
class TokenService
{
use ModuleOptionsAwareTrait;
use MailerServiceAwareTrait;
const PASSWORD_RESET_TOKEN_SEP = '-';
const PASSWORD_RESET_TOKEN_DATE_FORMAT = 'YmdHis';
......@@ -210,6 +211,50 @@ class TokenService
return $message;
}
/**
* @throws \UnicaenAuthToken\Service\TokenServiceException Si échec d'envoi du mail ou d'enregistrement de la date d'envoi
*/
public function createUserTokenMail(AbstractUserToken $userToken, string $partial = 'unicaen-auth-token/token/partial/mail'): Message
{
if ($userToken->getUser()->getEmail() === null) {
throw new \InvalidArgumentException("Le propriétaire du jeton n'a pas d'adresse mail");
}
$this->injectLogInUriInUserTokens([$userToken]);
$html = $this->phpRenderer->render($partial, ['userToken' => $userToken]);
$part = new Part($html);
$part->type = Mime::TYPE_HTML;
$part->charset = 'UTF-8';
$body = new MimeMessage();
$body->addPart($part);
$mail = (new Message())
->setEncoding('UTF-8')
->setSubject("Un jeton d'authentification vous a été attribué")
->setBody($body);
$mail->setTo($userToken->getUser()->getEmail());
return $mail;
}
public function createNewMessage($htmlBody, $subject)
{
$html = $htmlBody;
$part = new Part($html);
$part->type = Mime::TYPE_HTML;
$part->charset = 'UTF-8';
$body = new MimeMessage();
$body->addPart($part);
return (new Message())
->setEncoding('UTF-8')
// ->setFrom($from)
->setSubject($subject)
->setBody($body);
}
/**
* Génération d'un token.
*
......
......@@ -3,12 +3,15 @@
namespace UnicaenAuthToken\Service;
use Interop\Container\ContainerInterface;
use UnicaenApp\Service\Mailer\MailerService;
use UnicaenAuthToken\Options\ModuleOptions;
use Laminas\Router\RouteInterface;
use UnicaenAuthToken\Options\ModuleOptions;
class TokenServiceFactory
{
/**
* @throws \Psr\Container\NotFoundExceptionInterface
* @throws \Psr\Container\ContainerExceptionInterface
*/
public function __invoke(ContainerInterface $container): TokenService
{
$service = new TokenService();
......@@ -28,9 +31,6 @@ class TokenServiceFactory
$viewRenderer = $container->get('ViewRenderer');
$service->setPhpRenderer($viewRenderer);
$mailerService = $container->get(MailerService::class);
$service->setMailerService($mailerService);
return $service;
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment