src/Controller/HomeController.php line 46

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Contenu;
  4. use App\Entity\Niveau;
  5. use App\Entity\Profil;
  6. use App\Entity\Univers;
  7. use App\Entity\User;
  8. use App\Form\LoginType;
  9. use App\Repository\ContenuRepository;
  10. use App\Service\Email;
  11. use App\Service\NiveauService;
  12. use App\Service\Search;
  13. use Doctrine\ORM\EntityManagerInterface;
  14. use Exception;
  15. use Knp\Component\Pager\PaginatorInterface;
  16. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  17. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  18. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  19. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  20. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  21. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  22. use Symfony\Component\Form\Extension\Core\Type\TextareaType;
  23. use Symfony\Component\HttpFoundation\Request;
  24. use Symfony\Component\HttpFoundation\Response;
  25. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  26. use Symfony\Component\RateLimiter\RateLimiterFactory;
  27. use Symfony\Component\Routing\Annotation\Route;
  28. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  29. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  30. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  31. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  32. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  33. use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
  34. use Symfony\Contracts\Translation\TranslatorInterface;
  35. class HomeController extends AbstractController
  36. {
  37.     /**
  38.      * @Route("/", name="home")
  39.      * @param SessionInterface $session
  40.      * @param ContenuRepository $contenuRepository
  41.      * @return Response
  42.      */
  43.     public function index(SessionInterface $sessionContenuRepository $contenuRepository)
  44.     {
  45.         $user $this->getUser();
  46.         $profil = ($user instanceof User) ? $session->get('profil'$user->getProfil()) : null;
  47.         $em $this->getDoctrine()->getManager();
  48.         $contenusALaUne $em->getRepository(Contenu::class)->getPin($user);
  49.         $videoALaUne $em->getRepository(Contenu::class)->getPinVideo($user);
  50.         $derniersContenus $contenuRepository->getByProfilNiveau($usernull10nullfalsetrue'article'$contenusALaUne);
  51.         $nextContenus $contenuRepository->getByProfilNiveau($usernull1010);
  52.         $hasMore count($nextContenus) > 0;
  53.         $urlBarVideo $em->getRepository(Niveau::class)->findOneBy(['name' => 'Bar à vidéos''type' => 'video']);
  54.         return $this->render('home/index.html.twig', [
  55.             'pin' => $contenusALaUne,
  56.             'pin2' => $videoALaUne $videoALaUne[0] : null,
  57.             'derniers_contenus' => $derniersContenus,
  58.             'home' => true,
  59.             'has_more' => $hasMore,
  60.             'niveauBarVideo' => $urlBarVideo
  61.         ]);
  62.     }
  63.     /**
  64.      * @param SessionInterface $session
  65.      * @param NiveauService $niveauService
  66.      * @return Response
  67.      */
  68.     public function navbar(SessionInterface $sessionNiveauService $niveauService)
  69.     {
  70.         $em $this->getDoctrine()->getManager();
  71.         $stack $this->get('request_stack');
  72.         $masterRequest $stack->getMasterRequest();
  73.         $user $this->getUser();
  74.         //$profil = ($user instanceof User) ? $session->get('profil', $user->getProfil()) : null;
  75.         $em->getConfiguration()->addCustomHydrationMode('tree''Gedmo\Tree\Hydrator\ORM\TreeObjectHydrator');
  76.         $niveaux $em->getRepository(Niveau::class)->createQueryBuilder('n')
  77.             ->select('n')
  78.             ->leftJoin('n.univers''u')
  79.             ->andWhere('u.id = :uid')
  80.             ->setParameter('uid'$this->getUser()->getUnivers())
  81.             ->addOrderBy('n.root, n.lft''ASC')
  82.             ->andWhere('n.root = 1')
  83.             ->andWhere('n.parent IS NOT NULL')
  84.             ->getQuery()
  85.             ->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNStrue)
  86.             ->getResult('tree');
  87.         $path $masterRequest->getPathInfo();
  88.         //$path = str_replace(['article', 'produit', 'formation'], '', $path);
  89.         $path trim($path'/');
  90.         return $this->render('navbar.html.twig', [
  91.             'niveaux' => $niveaux,
  92.             'path' => $path,
  93.             'empty' => $niveauService->getNiveaux($this->getUser(), $niveaux)
  94.         ]);
  95.     }
  96.     /**
  97.      * @Route("/login", name="login", methods="GET|POST")
  98.      * @param AuthenticationUtils $authenticationUtils
  99.      * @return Response
  100.      */
  101.     public function login(AuthenticationUtils $authenticationUtilsParameterBagInterface $parameterBag)
  102.     {
  103.         $form $this->createForm(LoginType::class);
  104.         $error $authenticationUtils->getLastAuthenticationError();
  105.         $lastUsername $authenticationUtils->getLastUsername();
  106.         return $this->render('home/login.html.twig', [
  107.             'form' => $form->createView(),
  108.             'last_username' => $lastUsername,
  109.             'error' => $error,
  110.             'urlSaml' => 'https://' $parameterBag->get('SAML_AUTH_HOST') . '/saml/login'
  111.         ]);
  112.     }
  113.     /**
  114.      * @Route("/premiere-connexion/{hash}", name="first_login", methods="GET")
  115.      * @param Request $request
  116.      * @param SessionInterface $session
  117.      * @param TokenStorageInterface $tokenStorage
  118.      * @param EventDispatcherInterface $eventDispatcher
  119.      * @param string $hash
  120.      * @return \Symfony\Component\HttpFoundation\RedirectResponse
  121.      */
  122.     public function first_login(Request $requestSessionInterface $sessionTokenStorageInterface $tokenStorageEventDispatcherInterface $eventDispatcherstring $hash)
  123.     {
  124.         $user $this->getDoctrine()->getManager()->getRepository(User::class)->findOneBy([
  125.             'password' => '$argon2i' base64_decode($hash),
  126.         ]);
  127.         if ($user) {
  128.             $token = new UsernamePasswordToken($usernull'main'$user->getRoles());
  129.             $tokenStorage->setToken($token);
  130.             $session->set('_security_main'serialize($token));
  131.             $event = new InteractiveLoginEvent($request$token);
  132.             $eventDispatcher->dispatch($event'security.interactive_login');
  133.         }
  134.         return $this->redirectToRoute('home');
  135.     }
  136.     /**
  137.      * @Route("/sso/{hash}", name="sso", methods="GET")
  138.      * @param Request $request
  139.      * @param SessionInterface $session
  140.      * @param TokenStorageInterface $tokenStorage
  141.      * @param EventDispatcherInterface $eventDispatcher
  142.      * @param string $hash
  143.      * @return \Symfony\Component\HttpFoundation\RedirectResponse
  144.      * @throws \Doctrine\ORM\NonUniqueResultException
  145.      */
  146.     public function sso(Request $requestSessionInterface $sessionTokenStorageInterface $tokenStorageEventDispatcherInterface $eventDispatcherstring $hash)
  147.     {
  148.         $user $this->getDoctrine()->getManager()->getRepository(User::class)->createQueryBuilder('u')
  149.             ->andWhere('SHA2(u.email, 256) = :hash')
  150.             ->andWhere('u.isActive = 1')
  151.             ->setParameter('hash'$hash)
  152.             ->getQuery()
  153.             ->getOneOrNullResult();
  154.         if ($user) {
  155.             $token = new UsernamePasswordToken($usernull'main'$user->getRoles());
  156.             $tokenStorage->setToken($token);
  157.             $session->set('_security_main'serialize($token));
  158.             $event = new InteractiveLoginEvent($request$token);
  159.             $eventDispatcher->dispatch($event'security.interactive_login');
  160.         }
  161.         return $this->redirectToRoute('home');
  162.     }
  163.     /**
  164.      * @Route("/deconnexion", name="logout")
  165.      * @return Response
  166.      */
  167.     public function logout()
  168.     {
  169.         return $this->render('home/login.html.twig');
  170.     }
  171.     /**
  172.      * @Route("/recherche", name="search", methods={"GET"})
  173.      * @param Request $request
  174.      * @param Search $searchService
  175.      * @param PaginatorInterface $paginator
  176.      * @return Response
  177.      * @throws Exception
  178.      */
  179.     public function search(Request $requestSearch $searchServicePaginatorInterface $paginator)
  180.     {
  181.         $keywordSearch $request->query->get('search'null);
  182.         $resultats $searchService->getResultats($this->getUser(), $keywordSearch$request->getLocale());
  183.         $qty $request->query->getInt('qty'10);
  184.         $paginatorArticle $paginator->paginate($resultats['contenu']['articles'], $request->query->getInt('page_article'1), $qty, ['pageParameterName' => 'page_article']);
  185.         $paginatorProduct $paginator->paginate($resultats['contenu']['products'], $request->query->getInt('page_produit'1), $qty, ['pageParameterName' => 'page_produit']);
  186.         $paginatorVideo $paginator->paginate($resultats['contenu']['videos'], $request->query->getInt('page_video'1), $qty, ['pageParameterName' => 'page_video']);
  187.         $paginatorArticle->setCustomParameters(['align' => 'center']);
  188.         $paginatorProduct->setCustomParameters(['align' => 'center']);
  189.         $paginatorVideo->setCustomParameters(['align' => 'center']);
  190.         $paginatorArticle->setParam('active''nav-article-tab');
  191.         $paginatorProduct->setParam('active''nav-product-tab');
  192.         $paginatorVideo->setParam('active''nav-video-tab');
  193.         return $this->render('search/search.html.twig', [
  194.             'paginatorArticle' => $paginatorArticle,
  195.             'paginatorProduct' => $paginatorProduct,
  196.             'paginatorVideo' => $paginatorVideo,
  197.             'qty' => $qty,
  198.             'search' => $keywordSearch,
  199.             'resultats' => $resultats
  200.         ]);
  201.     }
  202.     /**
  203.      * @Route("/switch-role", name="switch_profil", methods={"GET","POST"})
  204.      * @param Request $request
  205.      * @param SessionInterface $session
  206.      * @return Response
  207.      */
  208.     public function switchRole(Request $requestSessionInterface $sessionEntityManagerInterface $em)
  209.     {
  210.         /** @var User $user */
  211.         $user $this->getUser();
  212.         $univers $em->getRepository(Univers::class)->findAll();
  213.         $form $this->createFormBuilder($user, ['action' => $this->generateUrl('switch_profil'),])
  214.             ->add('univers'EntityType::class, [
  215.                 'class' => Univers::class,
  216.                 'choices' => [
  217.                     $univers[2],
  218.                     $univers[1],
  219.                     $univers[4],
  220.                     $univers[3],
  221.                     $univers[5],
  222.                     $univers[0]
  223.                 ],
  224.                 'data' => $user->getUnivers() ?? $user->getPreferedUnivers(),
  225. //                'placeholder' => 'all.univers',
  226.                 'expanded' => false,
  227.                 'multiple' => false,
  228.                 'attr' => [
  229.                     'class' => 'select2',
  230.                     'data-parent' => '',
  231.                 ]
  232.             ])->getForm();;
  233.         $form->handleRequest($request);
  234.         if ($form->isSubmitted()) {
  235.             if ($user->getProfil()->getEntite()->getCanSwitch()) {
  236.                 $univers $form->get('univers')->getData();
  237.                 $user->setUnivers($univers);
  238.                 $em->persist($user);
  239.                 $em->flush();
  240.             }
  241.             return $this->redirect($request->headers->get('referer'$this->generateUrl('home')));
  242.         }
  243.         return $this->render('user/switch_role.html.twig', [
  244.             'user' => $user,
  245.             'form' => $form->createView(),
  246.         ]);
  247.     }
  248.     /**
  249.      * @Route("/mot-de-passe-oublie", name="forgot_password")
  250.      * @param Request $request
  251.      * @param UserPasswordEncoderInterface $passwordEncoder
  252.      * @param TranslatorInterface $translator
  253.      * @param Email $emailService
  254.      * @return \Symfony\Component\HttpFoundation\RedirectResponse|Response
  255.      */
  256.     public function forgotPassword(Request $requestUserPasswordEncoderInterface $passwordEncoderTranslatorInterface $translatorEmail $emailService)
  257.     {
  258.         $form $this->createFormBuilder(null, [
  259.             'action' => $this->generateUrl('forgot_password')
  260.         ])
  261.             ->add('email'EmailType::class, [
  262.                 'required' => true
  263.             ])
  264.             ->getForm();
  265.         $form->handleRequest($request);
  266.         if ($form->isSubmitted() && $form->isValid()) {
  267.             $em $this->getDoctrine()->getManager();
  268.             $user $em->getRepository(User::class)->findOneBy(['email' => $form->getData()['email']]);
  269.             if ($user) {
  270.                 $tempPassword User::generatePassword();
  271.                 $password $passwordEncoder->encodePassword($user$tempPassword);
  272.                 $user->setPassword($password);
  273.                 $user->setIsTemporaryPassword(true);
  274.                 $em->persist($user);
  275.                 $em->flush();
  276.                 $subject $translator->trans('email.forgot_password.subject');
  277.                 $template $this->getParameter('MC_TEMPLATE_LOST_PASSWORD');
  278.                 $emailService->send($subject, [
  279.                     'USER_FIRSTNAME' => $user->getFirstname(),
  280.                     'USER_LASTNAME' => $user->getLastname(),
  281.                     'USER_LOGIN' => $tempPassword,
  282.                     'USER_EMAIL' => $user->getEmail(),
  283.                     'URL_LOGIN' => $this->generateUrl('login', [], UrlGeneratorInterface::ABSOLUTE_URL),
  284.                     'URL' => $this->generateUrl('login', [], UrlGeneratorInterface::ABSOLUTE_URL)
  285.                 ], $user$template);
  286.                 $this->addFlash('success''flash.login.password_sent');
  287.             } else {
  288.                 $this->addFlash('danger''flash.user.not_found');
  289.             }
  290.             return $this->redirectToRoute('home');
  291.         }
  292.         return $this->render('home/forgot_password.html.twig', ['form' => $form->createView()]);
  293.     }
  294.     /**
  295.      * @Route("/assistance", name="help_customer", methods={"GET", "POST"})
  296.      * @param Request $request
  297.      * @param Email $emailService
  298.      * @param TranslatorInterface $translator
  299.      * @return Response
  300.      */
  301.     public function assistance(
  302.         Request $request,
  303.         Email $emailService,
  304.         TranslatorInterface $translator,
  305.         RateLimiterFactory $assistanceFormSubmitLimiter
  306.     ) {
  307.         $user $this->getUser();
  308.         $typeAssist = (!$user) ? [
  309.             'assistance.metier' => 'M',
  310.             'assistance.technique' => 'T'
  311.         ] : [
  312.             'assistance.metier' => 'M',
  313.             'assistance.technique' => 'T',
  314.         ];
  315.         $form $this->createFormBuilder(null, [
  316.             'action' => $this->generateUrl('help_customer'),
  317.             'label' => false
  318.         ])->getForm();
  319.         if (!$user) {
  320.             $form->add('email'EmailType::class, [
  321.                 'required' => true,
  322.                 'label' => 'user.email'
  323.             ]);
  324.         }
  325.         $form->add('type'ChoiceType::class, [
  326.             'label' => 'assistance.type',
  327.             'choices' => $typeAssist,
  328.             'required' => true
  329.         ])
  330.             ->add('question'TextareaType::class, [
  331.                 'required' => true,
  332.                 'label' => 'assistance.question',
  333.             ]);
  334.         $form->handleRequest($request);
  335.         if ($form->isSubmitted() && $form->isValid()) {
  336.             // Rate limiter pour l'assistance
  337.             $limiter $assistanceFormSubmitLimiter->create($request->getClientIp());
  338.             if (false === $limiter->consume()->isAccepted()) {
  339.                 // On fait semblant que ça a marché pour qu'un attaquant potentiel soit content de lui
  340.                 $this->addFlash('success'$translator->trans('flash.assistance.sent'));
  341.                 $referer $request->headers->get('referer');
  342.                 return $this->redirect($referer);
  343.             }
  344.             $ask_type $form->get('type')->getData();
  345.             $ask_question $form->get('question')->getData();
  346.             $ask_email $this->getUser() ? $this->getUser()->getEmail() : $form->get('email')->getData();
  347.             if ($ask_type == 'M' && ($emailAdress $this->getParameter('EMAIL_ASSISTANCE_METIER')) && ($template $this->getParameter('MC_TEMPLATE_ASSISTANCE_METIER'))) {
  348.                 // Mail assistance métier
  349.                 $subject $translator->trans('email.assistance_metier.subject');
  350.                 $vars = [
  351.                     'USER_FIRSTNAME' => $user $user->getFirstName() : 'Inconnu',
  352.                     'USER_LASTNAME' => $user $user->getLastName() : ' ',
  353.                     'USER_TEXT' => $ask_question,
  354.                     'USER_EMAIL' => $ask_email,
  355.                 ];
  356.                 if ($emailService->send($subject$vars$emailAdress$template)) {
  357.                     $this->addFlash('success'$translator->trans('flash.assistance.sent'));
  358.                 }
  359.             } elseif ($ask_type == 'F' && ($emailAdress $this->getParameter('EMAIL_ASSISTANCE_FINANCIERE')) && ($template $this->getParameter('MC_TEMPLATE_ASSISTANCE_FINANCIERE'))) {
  360.                 // Mail assistance financière
  361.                 $subject $translator->trans('email.assistance_financiere.subject');
  362.                 $vars = [
  363.                     'USER_FIRSTNAME' => $user $user->getFirstName() : 'Inconnu',
  364.                     'USER_LASTNAME' => $user $user->getLastName() : ' ',
  365.                     'USER_TEXT' => $ask_question,
  366.                     'USER_EMAIL' => $ask_email,
  367.                 ];
  368.                 if ($emailService->send($subject$vars$emailAdress$template)) {
  369.                     $this->addFlash('success'$translator->trans('flash.assistance.sent'));
  370.                 }
  371.             } elseif ($emailAdress $this->getParameter('EMAIL_ASSISTANCE_TECHNIQUE')) {
  372.                 $subject $translator->trans('email.assistance_technique.subject');
  373.                 if ($emailService->send($subject, [], $emailAdressnull$ask_email ' demande : ' "\r\n" $ask_question)) {
  374.                     $this->addFlash('success'$translator->trans('flash.assistance.sent'));
  375.                 }
  376.             }
  377.             $referer $request->headers->get('referer');
  378.             return $this->redirect($referer);
  379.         }
  380.         return $this->render('home/help_customer.html.twig', ['form' => $form->createView()]);
  381.     }
  382.     /**
  383.      * @Route("/load/home/articles/{page}", name="load_article", defaults={"page" : 1})
  384.      * @param Request $request
  385.      * @param SessionInterface $session
  386.      * @param ContenuRepository $contenuRepository
  387.      * @param int $page
  388.      * @return Response
  389.      */
  390.     public function load(Request $requestSessionInterface $sessionContenuRepository $contenuRepository$page 1)
  391.     {
  392.         /** @param Profil $profil */
  393.         $profil $session->get('profil'$this->getUser()->getProfil());
  394.         $next $contenuRepository->getByProfilNiveau($this->getUser(), null1010 * ($page 1), falsetrue'article');
  395.         $nextContenus $contenuRepository->getByProfilNiveau($this->getUser(), null1010 $pagefalsetrue'article');
  396.         $hasMore count($nextContenus) > 0;
  397.         return $this->render('home/next_contenus.html.twig', [
  398.             'derniers_contenus' => $next,
  399.             'home' => true,
  400.             'page' => $page,
  401.             'sum' => $request->get('sum'0),
  402.             'has_more' => $hasMore,
  403.         ]);
  404.     }
  405.     /**
  406.      * @Route("/change_locale/{locale}", name="change_locale")
  407.      */
  408.     public function changeLocale($localeRequest $request)
  409.     {
  410.         // On stocke la langue dans la session
  411.         $request->getSession()->set('_locale'$locale);
  412.         // On revient sur la page précédente
  413.         return $this->redirect($request->get('referer'));
  414.     }
  415. }