src/Controller/HomeController.php line 88

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Knp\Snappy\Pdf;
  4. use App\Entity\User;
  5. use App\Entity\Media;
  6. use App\Service\Mail;
  7. use App\Entity\Newsletter;
  8. use App\Entity\Contributor;
  9. use App\Entity\Instance;
  10. use App\Entity\ContributorConfig;
  11. use App\Service\SiteConfig;
  12. use App\Form\NewsletterType;
  13. use App\Form\ContributorType;
  14. use App\Repository\UserRepository;
  15. use App\Service\ItmConnectApiService;
  16. use App\Repository\BlogPostRepository;
  17. use App\Repository\NewsletterRepository;
  18. use Doctrine\ORM\EntityManagerInterface;
  19. use App\Repository\ContactConfigRepository;
  20. use Symfony\Component\HttpFoundation\Request;
  21. use App\Repository\BlogPostCategoryRepository;
  22. use App\Repository\Criteria1ItemRepository;
  23. use App\Repository\Criteria1Repository;
  24. use App\Repository\Criteria2ItemRepository;
  25. use App\Repository\Criteria2Repository;
  26. use App\Repository\Criteria3ItemRepository;
  27. use App\Repository\Criteria3Repository;
  28. use App\Service\ldapV2NettoService;
  29. use Psr\Log\LoggerInterface;
  30. use Symfony\Component\HttpFoundation\Response;
  31. use Symfony\Component\Routing\RouterInterface;
  32. use Symfony\Component\Routing\Annotation\Route;
  33. use Symfony\Component\HttpFoundation\JsonResponse;
  34. use Symfony\Component\HttpKernel\Profiler\Profiler;
  35. use Symfony\Component\HttpFoundation\RedirectResponse;
  36. use Symfony\Component\String\Slugger\SluggerInterface;
  37. use Symfony\Contracts\Translation\TranslatorInterface;
  38. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  39. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  40. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  41. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  42. use Symfony\Contracts\HttpClient\HttpClientInterface;
  43. use App\Repository\SiteConfigRepository;
  44. class HomeController extends AbstractController
  45. {
  46.     /**
  47.      * HomeController constructor.
  48.      * @param BlogPostRepository $blogPostRepository
  49.      * @param BlogPostCategoryRepository $blogPostCategoryRepository
  50.      */
  51.     public function __construct(
  52.         private BlogPostRepository $blogPostRepository,
  53.         private BlogPostCategoryRepository $blogPostCategoryRepository,
  54.         private Pdf $pdf,
  55.         private EntityManagerInterface $entityManager,
  56.         private SluggerInterface $slugger,
  57.         private RouterInterface $router,
  58.         private TranslatorInterface $translator,
  59.         private UserRepository $userRepository,
  60.         private UserPasswordHasherInterface $userPasswordHasher,
  61.         private ItmConnectApiService $itmconnect,
  62.         private UrlGeneratorInterface $urlGenerator,
  63.         private Mail $mail,
  64.         private SiteConfig $config,
  65.         private EntityManagerInterface $em,
  66.         private ContactConfigRepository $contactConfigRepo,
  67.         private HttpClientInterface $client,
  68.         private Criteria1ItemRepository $criteria1ItemRepository,
  69.         private Criteria2ItemRepository $criteria2ItemRepository,
  70.         private Criteria3ItemRepository $criteria3ItemRepository,
  71.         private LoggerInterface $logger,
  72.         private ldapV2NettoService $ldapV2NettoService,
  73.         private SiteConfigRepository $siteConfigRepository,
  74.     ) {
  75.         $generalSiteConfig $this->siteConfigRepository->findOneBy([]);
  76.         $isInstanceActive $generalSiteConfig $generalSiteConfig->isInstanceActive() : true;
  77.         if($isInstanceActive) {
  78.             $this->config->getConfig();
  79.             $this->config->getCustomization();
  80.         }
  81.     }
  82.     /**
  83.      * @Route("/", name="home")
  84.      */
  85.     public function home(?Profiler $profilerRequest $request): Response
  86.     {
  87.         if (!$this->getUser() && !$this->config->isPublicFrontOffice()) {
  88.             return $this->redirectToRoute('app_login');
  89.         }
  90.         $user $this->getUser();
  91.         $session $request->getSession();
  92.         
  93.         if ($user && $user->getInstances()->count() > 0) {
  94.             $selectedInstanceId $session->get('selected_instance_id');
  95.             
  96.             if ($user->getInstances()->count() === && !$selectedInstanceId) {
  97.                 $instance $user->getInstances()->first();
  98.                 $session->set('selected_instance_id'$instance->getId());
  99.                 $this->config->getConfig();
  100.                 $this->config->getCustomization();
  101.                 $selectedInstanceId $instance->getId();
  102.             }
  103.             
  104.             if (!$selectedInstanceId) {
  105.                 // Get the last selected instance from session to pre-select it
  106.                 $lastSelectedInstanceId $session->get('last_selected_instance_id');
  107.                 
  108.                 return $this->render('home/partials/select_instance.html.twig', [
  109.                     'instances' => $user->getInstances(),
  110.                     'selected_instance_id' => $lastSelectedInstanceId,
  111.                 ]);
  112.             }
  113.         }
  114.         return $this->render('home/index.html.twig'$this->homeData($profiler$request));
  115.     }
  116.     /**
  117.      * @Route("/select-instance", name="select_instance", methods={"POST"})
  118.      */
  119.     public function selectInstance(Request $request): Response
  120.     {
  121.         $instanceId $request->request->get('instance_id');
  122.         $session $request->getSession();
  123.         $session->set('selected_instance_id'$instanceId);
  124.         
  125.         return $this->redirectToRoute('home');
  126.     }
  127.     /**
  128.      * @Route("/clear-instance", name="clear_instance")
  129.      */
  130.     public function clearInstance(Request $request): Response
  131.     {
  132.         $session $request->getSession();
  133.         $currentInstanceId $session->get('selected_instance_id');
  134.         
  135.         if ($currentInstanceId) {
  136.             $session->set('last_selected_instance_id'$currentInstanceId);
  137.         }
  138.         
  139.         $session->remove('selected_instance_id');
  140.         return $this->redirectToRoute('home');
  141.     }
  142.     #[Route("/fr")]
  143.     public function fr()
  144.     {
  145.         return $this->redirectToRoute('home');
  146.     }
  147.     #[Route("/fr/admin")]
  148.     public function frAdmin()
  149.     {
  150.         return $this->redirectToRoute('home');
  151.     }
  152.     /**
  153.      * @Route("/api/oauth2/", name="oauth2_api")
  154.      */
  155.     public function apiLogin(Request $request): Response
  156.     {
  157.         /** @var User $user */
  158.         $user $this->getUser();
  159.         // Manually authenticate the user
  160.         $token = new UsernamePasswordToken($usernull'main'$user->getRoles());
  161.         $this->get('security.token_storage')->setToken($token);
  162.         $this->get('session')->set('_security_main'serialize($token));
  163.         return $this->redirectToRoute('home');
  164.     }
  165.     /**
  166.      * @Route("/api/logout/", name="oauth2_logout")
  167.      * @throws \Doctrine\DBAL\Exception
  168.      */
  169.     public function apiLogout(Request $request): Response
  170.     {
  171.         /** @var User $user */
  172.         $user $this->getUser();
  173.         if ($user) {
  174.             $conn $this->em->getConnection();
  175.             $sqlToken "select identifier from oauth2_access_token where oauth2_access_token.user_identifier = :identifier";
  176.             $stmtToken $conn->prepare($sqlToken);
  177.             $results $stmtToken->executeQuery(['identifier' => $user->getUserIdentifier()]);
  178.             $token $results->fetchAssociative();
  179.             if ($token) {
  180.                 // Delete refresh token
  181.                 $sqlDeleteRefreshToken "delete from oauth2_refresh_token where oauth2_refresh_token.access_token = :token";
  182.                 $stmtDeleteRefreshToken $conn->prepare($sqlDeleteRefreshToken);
  183.                 $stmtDeleteRefreshToken->executeQuery(['token' => $token['identifier']]);
  184.                 // Delete access token
  185.                 $sqlDeleteToken "delete from oauth2_access_token where oauth2_access_token.user_identifier = :identifier";
  186.                 $stmtDeleteToken $conn->prepare($sqlDeleteToken);
  187.                 $stmtDeleteToken->executeQuery(['identifier' => $user->getUserIdentifier()]);
  188.             }
  189.         }
  190.         return $this->json([
  191.             'message' => 'You successfully logged out',
  192.         ]);
  193.     }
  194.     /**
  195.      * @Route("/acceptCgu", name="accept_cgu", methods={"GET"})
  196.      */
  197.     public function acceptCgu(Request $request): JsonResponse
  198.     {
  199.         $user $this->getUser();
  200.         if (!$user) {
  201.             return new JsonResponse(['success' => false]);
  202.         }
  203.         $user->setAcceptCgu(true);
  204.         $this->em->persist($user);
  205.         $this->em->flush();
  206.         return new JsonResponse(['success' => true]);
  207.     }
  208.     /**
  209.      * @Route("/itmconnect", name="itmconnect")
  210.      */
  211.     public function ItmConnect(Request $request): Response
  212.     {
  213.         return $this->redirect($this->itmconnect->buildAuthorizeUrl());
  214.     }
  215.     /**
  216.      * @Route("/authorization-code/callback", name="callback")
  217.      */
  218.     public function callback(Request $request)
  219.     {
  220.         $data $this->itmconnect->authorizeUser();
  221.         $token $data['token'];
  222.         $refresh_token $data['refresh_token'];
  223.         if (!$token) {
  224.             return $this->redirectToRoute('home');
  225.         }
  226.         if (property_exists($token'email')) {
  227.             $email $token->email;
  228.         } else {
  229.             $email $token->preferred_username;
  230.         }
  231.         $user $this->userRepository->findOneBy(['email' => $email]);
  232.         if (!$user) {
  233.             $user = new User();
  234.             $roles = [];
  235.             if ($token->typeUtilisateur == 'Amont') {
  236.                 $roles[] = "ROLE_AMONT";
  237.             } elseif ($token->typeUtilisateur == 'adherent') {
  238.                 $roles[] = "ROLE_ADHERENT";
  239.             } else {
  240.                 $roles[] = "ROLE_COLLAB";
  241.             }
  242.             if (property_exists($token'profil')) {
  243.                 if ($token->profil == "responsable_im"$roles[] = "ROLE_RESPONSABLE";
  244.                 if ($token->profil == "dirigeant_im"$roles[] = "ROLE_DIRIGEANT";
  245.                 if ($token->profil == "collaborateur_im") {
  246.                     if (array_key_exists('ROLE_COLLAB'$roles)) {
  247.                         $roles[] = "ROLE_COLLAB";
  248.                     }
  249.                 }
  250.             }
  251.             $user->setRoles($roles);
  252.             $user->setEmail($email);
  253.             $hash $this->userPasswordHasher->hashPassword($user$token->session_state);
  254.             $user->setPassword($hash);
  255.             $user->setRefreshToken($refresh_token);
  256.             $user->setIsItmConnect($hash);
  257.             $this->userRepository->addAllPreferences($user);
  258.         } else {
  259.             $user->setRefreshToken($refresh_token);
  260.         }
  261.         // ft/440_web_service_netto
  262.         if (property_exists($token'codeConsoFiliale')) {
  263.             $codesConsoFiliale $token->codeConsoFiliale;
  264.             $this->ldapV2NettoService->retreiveCriteriasForUser($user$codesConsoFiliale);
  265.         } else {
  266.             $this->logger->warning("No codeConsoFiliale can be found in the itmConnect WS");
  267.         }
  268.         $em $this->getDoctrine()->getManager();
  269.         $em->persist($user);
  270.         $em->flush();
  271.         // Manually authenticate the user
  272.         $token = new UsernamePasswordToken($usernull'main'$user->getRoles());
  273.         $this->get('security.token_storage')->setToken($token);
  274.         $this->get('session')->set('_security_main'serialize($token));
  275.         $session $request->getSession();
  276.         $url $this->urlGenerator->generate('home');
  277.         if ($session->get('customReferrer'))
  278.             $url $session->get('customReferrer');
  279.         $session->remove('customReferrer');
  280.         // ft/567_password_user_memorisation_time
  281.         sleep(5);
  282.         return new RedirectResponse($url);
  283.     }
  284.     /**
  285.      * @Route("/contributor", name="contributor")
  286.      */
  287.     public function addContributor(Request $request)
  288.     {
  289.         $contributor = new Contributor();
  290.         if ($this->getUser())
  291.             $contributor->setUser($this->getUser());
  292.         $message $this->translator->trans('contributor.flash-message.add-contributor.done');
  293.         if ($this->config->getConfirmationMessage() != null)
  294.             $message $this->config->getConfirmationMessage();
  295.         $form $this->createForm(ContributorType::class, $contributor);
  296.         $form->handleRequest($request);
  297.         if ($request->getMethod() == 'POST' && $form->isSubmitted() && $form->isValid()) {
  298.             $contributor $form->getData();
  299.             // Set the labels to save it into the contribution
  300.             $contributorConfig $this->entityManager->getRepository(ContributorConfig::class)->findOneBy([]);
  301.             $contributor->setLabel1($contributorConfig->getFieldLabel());
  302.             $contributor->setLabel2($contributorConfig->getField2Label());
  303.             $contributor->setLabel3($contributorConfig->getField3Label());
  304.             $contributor->setLabel4($contributorConfig->getField4Label());
  305.             $contributor->setLabel5($contributorConfig->getField5Label());
  306.             $contributor->setLabel6($contributorConfig->getField6Label());
  307.             $contributor->setLabel7($contributorConfig->getField7Label());
  308.             $contributor->setLabelTextarea($contributorConfig->getTextareaLabel());
  309.             $contributor->setLabelMedia($contributorConfig->getMediaLabel());
  310.             $generalSiteConfig $this->siteConfigRepository->findOneBy([]);
  311.             $isInstanceActive $generalSiteConfig $generalSiteConfig->isInstanceActive() : true;
  312.             if ($isInstanceActive) {
  313.                 $session $request->getSession();
  314.                 $instanceId $session->get('selected_instance_id');
  315.                 
  316.                 if ($instanceId) {
  317.                     $instance $this->entityManager->getRepository(Instance::class)->find($instanceId);
  318.                     if ($instance) {
  319.                         $contributor->setInstance($instance);
  320.                     }
  321.                 }
  322.             }
  323.             // On récupère les fichiers transmis
  324.             if ($form->has('media')) {
  325.                 $files $form->get('media')->getData();
  326.                 foreach ($files as $file) {
  327.                     $media = new Media();
  328.                     // generate a new filename
  329.                     $fileName pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME) . '-' md5(uniqid()) . '.' $file->guessExtension();
  330.                     $fileName preg_replace('/\s/i''_'$fileName);
  331.                     $media->setFilename($fileName);
  332.                     // set your uploads directory
  333.                     $uploadDir $this->getParameter('uploads_directory');
  334.                     if (!file_exists($uploadDir) && !is_dir($uploadDir)) {
  335.                         mkdir($uploadDir0775true);
  336.                     }
  337.                     $new_file $file->move($uploadDir$fileName);
  338.                     $media->setFile($new_file);
  339.                     $this->entityManager->persist($media);
  340.                     $contributor->addMedia($media);
  341.                 }
  342.             }
  343.             $this->entityManager->persist($contributor);
  344.             $this->entityManager->flush();
  345.             $this->addFlash('success'$message);
  346.             $subject "Nouveau contributeur";
  347.             $content "Un nouveau contributeur vient de s'inscrire sur le site.";
  348.             // ft/531_desable_mail_sendingblue 
  349.             // $this->mail->sendingblue_email($subject, $content, $this->config->getContributionTemplateId());
  350.         }
  351.         $referer $request->headers->get('referer');
  352.         if ($referer == null)
  353.             return $this->redirectToRoute('home');
  354.         $refererPathInfo $request::create($referer)->getPathInfo();
  355.         $routeInfos $this->router->match($refererPathInfo);
  356.         $route $routeInfos['_route'];
  357.         unset($routeInfos['_route']);
  358.         unset($routeInfos['_controller']);
  359.         return $this->redirectToRoute($route$routeInfos);
  360.     }
  361.     /**
  362.      * @Route("/subscribe-newsletter", name="subscribe_newsletter")
  363.      */
  364.     public function subscribeNewsletter(Request $requestNewsletterRepository $newsletterRepo)
  365.     {
  366.         $formEntity = new Newsletter();
  367.         $form $this->createForm(NewsletterType::class, $formEntity);
  368.         if ($request->isMethod('POST')) {
  369.             $form->handleRequest($request);
  370.             if ($form->isSubmitted() && $form->isValid()) {
  371.                 $formEntity $form->getData();
  372.                 if (!$newsletterRepo->findOneBy(['email' => $formEntity->getEmail()])) {
  373.                     $this->em->persist($formEntity);
  374.                     $this->em->flush();
  375.                 }
  376.                 $this->addFlash(
  377.                     'success_newsletter',
  378.                     $this->translator->trans('newsletter.flash-message.subscribe.done')
  379.                 );
  380.                 $referer $request->headers->get('referer');
  381.                 return $this->redirect($referer); // return to previous page
  382.             }
  383.         }
  384.         // if GET render full page with form
  385.         return $this->redirectToRoute('home');
  386.     }
  387.     private function homeData($profiler$request)
  388.     {
  389.         $preview $request->query->getInt('preview'0);
  390.         if ($preview && null !== $profiler) {
  391.             $profiler->disable();
  392.         }
  393.         $user $this->getUser();
  394.         if ($user) {
  395.             $slides $this->blogPostRepository->getSlidesForUser($user$request);
  396.             $categories $this->blogPostCategoryRepository->getBlogPostCategoryForUser($user$request);
  397.         } else {
  398.             $slides $this->blogPostRepository->getSlidesActiveAndPublic();
  399.             $categories $this->blogPostCategoryRepository->getBlogPostCategoryByIsPublic();
  400.         }
  401.             return [
  402.                 'slides' => $slides,
  403.                 'categories' => $categories,
  404.                 'preview' => $preview,
  405.             ];
  406.     }
  407. }