Commit 73608050 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Déclenchement d'événements TokenController::EVENT_TOKEN_* permettant de se...

Déclenchement d'événements TokenController::EVENT_TOKEN_* permettant de se brancher avant/après les opérations majeures
parent 79e487de
Loading
Loading
Loading
Loading
+78 −3
Original line number Diff line number Diff line
@@ -12,6 +12,9 @@ use UnicaenAuthToken\Entity\Db\AbstractUserToken;
use UnicaenAuthToken\Form\UserTokenForm;
use UnicaenAuthToken\Service\TokenServiceAwareTrait;
use UnicaenAuthToken\Service\TokenServiceException;
use Zend\EventManager\EventManagerInterface;
use Zend\EventManager\ListenerAggregateInterface;
use Zend\EventManager\ListenerAggregateTrait;
use Zend\Http\Response;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\Mvc\Plugin\FlashMessenger\FlashMessenger;
@@ -30,6 +33,17 @@ class TokenController extends AbstractActionController
    const PROLONG_SPEC = '+1 week';
    const PROLONG_SPEC_TOSTRING = '1 semaine';

    const EVENT_TOKEN_CREATE_BEFORE_SAVE = 'EVENT_TOKEN_CREATE_BEFORE_SAVE';
    const EVENT_TOKEN_CREATE_AFTER_SAVE = 'EVENT_TOKEN_CREATE_AFTER_SAVE';
    const EVENT_TOKEN_MODIFY_BEFORE_SAVE = 'EVENT_TOKEN_MODIFY_BEFORE_SAVE';
    const EVENT_TOKEN_MODIFY_AFTER_SAVE = 'EVENT_TOKEN_MODIFY_AFTER_SAVE';
    const EVENT_TOKEN_DELETE_BEFORE = 'EVENT_TOKEN_DELETE_BEFORE';
    const EVENT_TOKEN_DELETE_AFTER = 'EVENT_TOKEN_DELETE_AFTER';
    const EVENT_TOKEN_PROLONGATE_BEFORE_SAVE = 'EVENT_TOKEN_PROLONGATE_BEFORE_SAVE';
    const EVENT_TOKEN_PROLONGATE_AFTER_SAVE = 'EVENT_TOKEN_PROLONGATE_AFTER_SAVE';
    const EVENT_TOKEN_SEND_BEFORE = 'EVENT_TOKEN_SEND_BEFORE';
    const EVENT_TOKEN_SEND_AFTER = 'EVENT_TOKEN_SEND_AFTER';

    /**
     * @var UserTokenForm
     */
@@ -99,10 +113,13 @@ class TokenController extends AbstractActionController
        $this->form->bind($userToken);

        if ($this->getRequest()->isPost()) {
            $this->form->setData($this->getRequest()->getPost());
            $data = $this->getRequest()->getPost();
            $this->form->setData($data);
            if ($this->form->isValid()) {
                $userToken = $this->form->getObject();
                try {
                    $this->triggerEvent(static::EVENT_TOKEN_CREATE_BEFORE_SAVE, ['userToken' => $userToken, 'data' => $data]);

                    $this->tokenService->saveUserToken($userToken);

                    $this->flashMessenger()->addSuccessMessage(sprintf(
@@ -111,6 +128,11 @@ class TokenController extends AbstractActionController
                        $userToken->getExpiredOnToString()
                    ));

                    $response = $this->triggerEvent(static::EVENT_TOKEN_CREATE_AFTER_SAVE, ['userToken' => $userToken, 'data' => $data]);
                    if ($response instanceof Response) {
                        return $response;
                    }

                    $redirectCallback = $this->redirectResponse;

                    return $redirectCallback('unicaen-auth-token/token');
@@ -143,10 +165,13 @@ class TokenController extends AbstractActionController
        $this->form->bind($userToken);

        if ($this->getRequest()->isPost()) {
            $this->form->setData($this->getRequest()->getPost());
            $data = $this->getRequest()->getPost();
            $this->form->setData($data);
            if ($this->form->isValid()) {
                $userToken = $this->form->getObject();
                try {
                    $this->triggerEvent(static::EVENT_TOKEN_MODIFY_BEFORE_SAVE, ['userToken' => $userToken, 'data' => $data]);

                    $this->tokenService->saveUserToken($userToken);

                    $this->flashMessenger()->addSuccessMessage(sprintf(
@@ -154,6 +179,11 @@ class TokenController extends AbstractActionController
                        $userToken->getUserId()
                    ));

                    $response = $this->triggerEvent(static::EVENT_TOKEN_MODIFY_AFTER_SAVE, ['userToken' => $userToken, 'data' => $data]);
                    if ($response instanceof Response) {
                        return $response;
                    }

                    $redirectCallback = $this->redirectResponse;

                    return $redirectCallback('unicaen-auth-token/token');
@@ -183,10 +213,18 @@ class TokenController extends AbstractActionController
    {
        $userToken = $this->getRequestedUserToken();
        try {
            $this->triggerEvent(static::EVENT_TOKEN_DELETE_BEFORE, ['userToken' => $userToken]);

            $this->tokenService->deleteUserToken($userToken);

            $this->flashMessenger()->addSuccessMessage(
                "Le jeton de l'utilisateur {$userToken->getUserId()} a été supprimé avec succès.");
                "Le jeton de l'utilisateur {$userToken->getUserId()} a été supprimé avec succès."
            );

            $response = $this->triggerEvent(static::EVENT_TOKEN_DELETE_AFTER, ['userToken' => $userToken]);
            if ($response instanceof Response) {
                return $response;
            }
        } catch (TokenServiceException $e) {
            throw new RuntimeException("Impossible de prolonger le jeton utilisateur spécifié.");
        }
@@ -201,6 +239,8 @@ class TokenController extends AbstractActionController
        $userToken = $this->getRequestedUserToken();
        $userToken->prolongate();
        try {
            $this->triggerEvent(static::EVENT_TOKEN_PROLONGATE_BEFORE_SAVE, ['userToken' => $userToken]);

            $this->tokenService->saveUserToken($userToken);

            $this->flashMessenger()->addSuccessMessage(sprintf(
@@ -208,6 +248,11 @@ class TokenController extends AbstractActionController
                $userToken->getUserId(),
                $userToken->getExpiredOnToString()
            ));

            $response = $this->triggerEvent(static::EVENT_TOKEN_PROLONGATE_AFTER_SAVE, ['userToken' => $userToken]);
            if ($response instanceof Response) {
                return $response;
            }
        } catch (TokenServiceException $e) {
            throw new RuntimeException("Impossible de prolonger le jeton utilisateur spécifié.");
        }
@@ -221,12 +266,19 @@ class TokenController extends AbstractActionController
    {
        $userToken = $this->getRequestedUserToken();
        try {
            $this->triggerEvent(static::EVENT_TOKEN_SEND_BEFORE, ['userToken' => $userToken]);

            $message = $this->tokenService->sendUserToken($userToken);

            $this->flashMessenger()->addSuccessMessage(sprintf(
                "Le jeton utilisateur a été envoyé avec succès à %s.",
                $message->getTo()->rewind()->getEmail()
            ));

            $response = $this->triggerEvent(static::EVENT_TOKEN_SEND_AFTER, ['userToken' => $userToken, 'message' => $message]);
            if ($response instanceof Response) {
                return $response;
            }
        } catch (TokenServiceException $e) {
            throw new RuntimeException("Erreur rencontrée lors de l'envoi du jeton utilisateur.");
        }
@@ -236,6 +288,29 @@ class TokenController extends AbstractActionController
        return $redirectCallback('unicaen-auth-token/token');
    }

    protected function triggerEvent(string $eventName, array $params): ?Response
    {
        $eventManager = $this->events;
        $h = spl_object_hash($eventManager);
        $responseCollection = $eventManager->triggerUntil(function ($result) {
            return $result instanceof Response;
        }, $eventName, $this, $params);

        if ($responseCollection->stopped()) {
            if (($last = $responseCollection->last()) instanceof Response) {
                return $last;
            }
            throw new InvalidArgumentException(sprintf(
                "Événement '%s' stoppé sans résultat de type '%s' ('%s' reçu à la place).",
                $eventName,
                Response::class,
                is_object($last) ? get_class($last) : gettype($last)
            ));
        }

        return null;
    }

    /**
     * @return AbstractUserToken
     */