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
Loading
Loading
Loading
Loading
Loading
+15 −8
Original line number Diff line number Diff line
@@ -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.",
+8 −0
Original line number Diff line number Diff line
@@ -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
+51 −6
Original line number Diff line number Diff line
@@ -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.
     *
+5 −5
Original line number Diff line number Diff line
@@ -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