src/Controller/HomeController.php line 91

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