src/Controller/HomeController.php line 81

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