Commit 1985732a authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Page Contact: désormais soumise à authentification ; l'adresse d'assistance...

Page Contact: désormais soumise à authentification ; l'adresse d'assistance est celle issue des Variables importées.
parent c6740e89
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -25,6 +25,13 @@ use Doctrine\ORM\Mapping\Driver\XmlDriver;
use UnicaenApp\Service\EntityManagerAwareInitializer;

return array(
    'bjyauthorize' => [
        'guards' => [
            'BjyAuthorize\Guard\Controller' => [
                ['controller' => 'Application\Controller\Index', 'action' => 'contact', 'roles' => ['user']],
            ],
        ],
    ],
    'doctrine'     => [
        /**
         * Génération du mapping à partir de la bdd, exemple :
@@ -86,6 +93,17 @@ return array(
                    ],
                ],
            ],
            'contact'          => [
//                'type'     => 'Zend\Mvc\Router\Http\Literal',
                'options'  => [
//                    'route'    => '/contact',
                    'defaults' => [
                        'controller' => 'Application\Controller\Index',
//                        'action'     => 'contact',
                    ],
                ],
                'priority' => 9999,
            ],
            /*'lhome' => [
                'type' => 'Segment',
                'options' => [
+17 −1
Original line number Diff line number Diff line
@@ -3,7 +3,9 @@
namespace Application\Controller\Factory;

use Application\Controller\IndexController;
use Application\Service\Etablissement\EtablissementService;
use Application\Service\These\TheseService;
use Application\Service\Variable\VariableService;
use Zend\Mvc\Controller\ControllerManager;

class IndexControllerFactory
@@ -16,14 +18,28 @@ class IndexControllerFactory
     */
    public function __invoke(ControllerManager $controllerManager)
    {
        $sl = $controllerManager->getServiceLocator();

        /**
         * @var TheseService $theseService
         */
        $theseService = $controllerManager->getServiceLocator()->get('TheseService');
        $theseService = $sl->get('TheseService');

        $controller = new IndexController();
        $controller->setTheseService($theseService);

        /**
         * @var EtablissementService $etablissementService
         */
        $etablissementService = $sl->get('EtablissementService');
        $controller->setEtablissementService($etablissementService);

        /**
         * @var VariableService $variableService
         */
        $variableService = $sl->get('VariableService');
        $controller->setVariableService($variableService);

        return $controller;
    }
}
+42 −1
Original line number Diff line number Diff line
@@ -2,15 +2,20 @@

namespace Application\Controller;

use Application\Entity\Db\These;
use Application\Entity\Db\Variable;
use Application\Service\Etablissement\EtablissementServiceAwareTrait;
use Application\Service\These\TheseServiceAwareTrait;
use Application\Service\Variable\VariableServiceAwareTrait;
use UnicaenApp\Exception\RuntimeException;
use Zend\Authentication\AuthenticationServiceInterface;
use Zend\Http\Response;
use Zend\Validator\EmailAddress as EmailAddressValidator;
use Zend\View\Model\ViewModel;

class IndexController extends AbstractController
{
    use VariableServiceAwareTrait;
    use EtablissementServiceAwareTrait;
    use TheseServiceAwareTrait;

    public function pretty_print(array $array, $level = 0) {
@@ -155,4 +160,40 @@ EOS

        return $vm;
    }

    /**
     * Remplacement de la page de contact de unicaen/app par une autre, soumise à authentification,
     * on l'adresse de contact dépend de l'établissement de l'utilisateur authentifié.
     *
     * @return array
     */
    public function contactAction()
    {
        $userWrapper = $this->userContextService->getIdentityUserWrapper();
        $etablissement = $this->etablissementService->getRepository()->findOneForUserWrapper($userWrapper);
        if ($etablissement === null) {
            throw new RuntimeException(
                "Anomalie: établissement introuvable pour l'utilisateur '{$userWrapper->getUsername()}'.");
        }

        $repo = $this->variableService->getRepository();
        $variable = $repo->findByCodeAndEtab(Variable::CODE_EMAIL_ASSISTANCE, $etablissement);
        if ($variable === null) {
            throw new RuntimeException(
                "Anomalie: aucune adresse d'assistance trouvée dans les Variables pour l'établissement '$etablissement'.");
        }

        $contact = $variable->getValeur();

        $v = new EmailAddressValidator();
        if (!$v->isValid($contact)) {
            throw new RuntimeException(
                "Anomalie: l'adresse d'assistance trouvée dans les Variables n'est pas valide: $contact");
        }

        return [
            'etablissement' => $etablissement,
            'contact' => $contact,
        ];
    }
}
 No newline at end of file
+20 −1
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@
namespace Application\Entity\Db\Repository;

use Application\Entity\Db\Etablissement;
use Application\Entity\UserWrapper;
use Doctrine\ORM\NonUniqueResultException;
use UnicaenApp\Exception\RuntimeException;

@@ -112,7 +113,7 @@ class EtablissementRepository extends DefaultEntityRepository
     * Recherche un établissement par son domaine DNS.
     *
     * @param string $domaine Ex: "unicaen.fr"
     * @return Etablissement
     * @return Etablissement|null
     */
    public function findOneByDomaine($domaine)
    {
@@ -130,6 +131,24 @@ class EtablissementRepository extends DefaultEntityRepository
        return $etab;
    }

    /**
     * Tente de trouver l'établissement auquel appartient un utilisateur.
     *
     * @param UserWrapper $userWrapper Utilisateur
     * @return Etablissement|null
     */
    public function findOneForUserWrapper(UserWrapper $userWrapper)
    {
        $domaine = $userWrapper->getDomainFromEppn() ?: $userWrapper->getDomainFromEmail();
        if (! $domaine) {
            throw new RuntimeException("Cas imprévu: aucun domaine exploitable.");
        }

        $etablissement = $this->findOneByDomaine($domaine);

        return $etablissement;
    }

    /**
     * Recherche un établissement par son source_code.
     *
+8 −0
Original line number Diff line number Diff line
@@ -248,6 +248,14 @@ class UserContextService extends BaseUserContextService
        return $individu;
    }

    /**
     * @return UserWrapper
     */
    public function getIdentityUserWrapper()
    {
        return $this->createUserWrapperFromIdentity();
    }

    /**
     * @return UserWrapper
     */
Loading