src/Controller/EtablissementController.php line 532

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Contribution;
  4. use App\Entity\Etablissement;
  5. use App\Entity\Formation;
  6. use App\Entity\Log;
  7. use App\Entity\Message;
  8. use App\Entity\Topic;
  9. use App\Entity\Tutelle;
  10. use App\Service\ContributionService;
  11. use App\Service\EtablissementService;
  12. use App\Service\FileUploader;
  13. use App\Service\LogService;
  14. use App\Service\MessageService;
  15. use App\Service\OngletService;
  16. use App\Service\TopicService;
  17. use App\Service\TutelleService;
  18. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  19. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  20. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  21. use Symfony\Component\Security\Core\Exception\AccessDeniedException;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  24. use Symfony\Component\Routing\Annotation\Route;
  25. use Symfony\Component\Serializer\SerializerInterface;
  26. use Symfony\Component\Validator\Constraints\File;
  27. use Symfony\Component\Validator\Constraints\Image;
  28. use Symfony\Component\Validator\Constraints\NotBlank;
  29. use Symfony\Component\Validator\Validation;
  30. class EtablissementController extends AbstractController
  31. {
  32.   /**
  33.    * @Route("/tutelle/{id}", name="tutelle_view",
  34.    *   requirements={ "id"="^[0-9]*$" },
  35.    *   defaults={ "id"="" }
  36.    * )
  37.    * @Security("is_granted('ROLE_CHEF') or is_granted('ROLE_TUTELLE')",
  38.    *   message="Vous devez être connecté pour accéder à cette page")
  39.    */
  40.   public function viewTutelle($idRequest $requestOngletService $ongletService,
  41.                               FileUploader $fileUploaderTopicService $topic_serviceLogService $logServiceContributionService $contributionServiceMessageService $messageService)
  42.   {
  43.     $user $this->getUser();
  44.     $etablissement $user->getEtablissement() ?? null;
  45.     $tutelle null;
  46.     if (!empty($id)) {
  47.       if ($this->isGranted('ROLE_ADMIN'))
  48.         $tutelle $this->getDoctrine()->getRepository(Tutelle::class)->find($id) ?? null;
  49.       else {
  50. //          return $this->redirectToRoute('tutelle_view', ['id' => $id]);
  51.       }
  52.     }
  53.     else {
  54.       $tutelle =
  55.         ($etablissement $etablissement->getTutelle() : null) ??
  56.         ($user $user->getTutelle() : null) ??
  57.         null;
  58.     }
  59.     if ($tutelle === null) {
  60.       return $this->redirectToRoute('etablissement_view');
  61.     }
  62.     // Contribution Sidebar ////////////////////////////////////////////////////////////////////////////////////////////
  63.       $contribution_panel $contributionService->getConsulteesEtConseillees($user$tutelle$etablissement244);
  64.     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  65.     if ($request->isMethod('POST') && $user) {
  66.       $em $this->getDoctrine()->getManager();
  67.       $form_data $request->headers->get('Content-Type') === 'application/json' ?
  68.         json_decode($request->getContent(), true) : $request->request->all();
  69.       $validator Validation::createValidator();
  70.       //dump($request->request->all());
  71.       //dump($request->files->all());
  72.       switch ($form_data['submit_action']) {
  73.         case 'message_add':
  74.           $message_text $form_data['message'] ?? null;
  75.           if ($validator->validate($message_text, [new NotBlank()])->has(0)) {
  76.             $message_error 'Ce champ ne peut être vide.';
  77.             break;
  78.           }
  79.           $message = new Message();
  80.           $message->setText($message_text);
  81.           $message->setPublishDate(new \DateTime('now'));
  82.           $message->setLikes([]);
  83.           $message->setApplys([]);
  84.           $message->setReports([]);
  85.           $message->setActive(true);
  86.           $message->setTutelle($tutelle);
  87.           $message->setUser($user);
  88.           $em->persist($message);
  89.           $em->flush();
  90.           $messageService->algoliaMaj($message);
  91.           if ($request->files->has('file')) {
  92.             if ($validator->validate($request->files->get('file'), [new File(['maxSize' => '16384k'])])->has(0)) {
  93.               $message_error 'Le fichier est invalide ou supérieur à 16 Mo.';
  94.               break;
  95.             }
  96.             $file $request->files->get('file');
  97.             $upload_result $fileUploader->uploadFile($file$message->getId(), 'message');
  98.             if (!$upload_result['error']) {
  99.               $message->setFile($upload_result['fileName']);
  100.               $em->persist($message);
  101.               $em->flush();
  102.             }
  103.             else {
  104.               $message_error 'Une erreur inattendue est survenue.';
  105.               $em->remove($message);
  106.               $em->flush();
  107.               break;
  108.             }
  109.           }
  110.           return $this->redirectToRoute('tutelle_view', ['id' => $id]);
  111.         case 'file_upload':
  112.           if ($request->files->has('file') && !$validator->validate($request->files->get('file'), new File(['maxSize' => '16384k']))->has(0)) {
  113.             $file $request->files->get('file');
  114.             $upload_result $fileUploader->uploadFile($file$tutelle->getId(), 'tutelle');
  115.             //dump($upload_result);
  116.             if (!$upload_result['error']) {
  117.               $tutelle_files $tutelle->getFiles() ?? [];
  118.               $tutelle_files[] = $upload_result['fileName'];
  119.               $tutelle->setFiles(array_values($tutelle_files));
  120.               $em->persist($tutelle);
  121.               $em->flush();
  122.             }
  123.           }
  124.           return $this->redirectToRoute('tutelle_view', ['id' => $id]);
  125.         case 'file_remove':
  126.           $tutelle_files $tutelle->getFiles() ?? [];
  127.           if ($fileUploader->deleteFile($form_data['file_name'], $tutelle->getId(), 'tutelle')) {
  128.             $tutelle->setFilesarray_values(array_filter(
  129.               $tutelle_files,
  130.               function($val) use(&$form_data) {return $form_data['file_name'] !== $val;}))
  131.             );
  132.             $em->persist($tutelle);
  133.             $em->flush();
  134.           }
  135.           return $this->redirectToRoute('tutelle_view', ['id' => $id]);
  136.         case 'message_like':
  137.           $res_array = ['success' => false'error' => null];
  138.           $message_id $form_data['message_id'] ?? null;
  139.           if ($message_id != null && is_numeric($message_id)) {
  140.             $message $this->getDoctrine()->getRepository(Message::class)->find(intval($message_id));
  141.             $likes $message->getLikes();
  142.             if (( $key array_search($user->getId(), $likes) ) === false) {
  143.               $likes[] = $user->getId();
  144.               $message->setLikes($likes);
  145.               $em->persist($message);
  146.               $em->flush();
  147.               $res_array['success'] = true;
  148.               $res_array['action'] = 'message_like';
  149.               $res_array['value'] = count($likes);
  150.             }
  151.             else {
  152.               unset($likes[$key]);
  153.               $message->setLikes(array_values($likes));
  154.               $em->persist($message);
  155.               $em->flush();
  156.               $res_array['success'] = true;
  157.               $res_array['action'] = 'message_unlike';
  158.               $res_array['value'] = count($likes);
  159.             }
  160.           }
  161.           else {
  162.             $res_array['error'] = 'Le message n\'existe pas';
  163.           }
  164.           return $this->json($res_array);
  165.         case 'message_report':
  166.           $res_array = ['success' => false'error' => null];
  167.           $message_id $form_data['message_id'] ?? null;
  168.           if ($message_id != null && is_numeric($message_id)) {
  169.             $message $this->getDoctrine()->getRepository(Message::class)->find(intval($message_id));
  170.             $reports $message->getReports();
  171.             if (( $key array_search($user->getId(), $reports) ) === false) {
  172.               $reports[] = $user->getId();
  173.               $message->setReports($reports);
  174.               $em->persist($message);
  175.               $em->flush();
  176.               $res_array['success'] = true;
  177.               $res_array['action'] = 'message_report';
  178.             }
  179.             else {
  180.               unset($reports[$key]);
  181.               $message->setReports(array_values($reports));
  182.               $em->persist($message);
  183.               $em->flush();
  184.               $res_array['success'] = true;
  185.               $res_array['action'] = 'message_unreport';
  186.             }
  187.           }
  188.           else {
  189.             $res_array['error'] = 'Le message n\'existe pas';
  190.           }
  191.           return $this->json($res_array);
  192.       }
  193.     }
  194.     return $this->render('tutelle/view.html.twig', [
  195.       'onglets' => $ongletService->getOnglets(),                    // Onglets
  196.       'etablissement' => $etablissement,                            // School of the user
  197.       'user' => $user,                                              // Connected User
  198.       'tutelle' => $tutelle,                                        // Tutelle of the user
  199.       'contribution_panel' => $contribution_panel,                  // Contributions to show on the sidebar
  200.       'forum_panel' => $topic_service->recupereLesQuelquesDerniersSujetsDeTousLesForums(3) ?? [],
  201.       'errors' => [                                                 // List of form errors
  202.         'message' => $message_error ?? null,
  203.       ],
  204.     ]);
  205.   }
  206.   /**
  207.    * @Route("/etablissement", name="etablissement_view")
  208.    * @IsGranted("ROLE_USER", message="Vous devez être connecté pour accéder à cette page")
  209.    */
  210.   public function viewEtablissement(Request $requestOngletService $ongletServiceTopicService $topic_service,
  211.                                     LogService $logServiceContributionService $contributionServiceMessageService $messageService)
  212.   {
  213.     $user $this->getUser();
  214.     $etablissement $user->getEtablissement();
  215.     if (empty($etablissement) && $request->isMethod('GET')) {
  216.       if ($user->getTutelle())
  217.         return $this->redirectToRoute('tutelle_view');
  218.       else
  219.         throw new AccessDeniedException(
  220.           'Vous n\'êtes associé à aucun Etablissement/Tutelle'
  221.         );
  222.     }
  223.     // Contribution Sidebar ////////////////////////////////////////////////////////////////////////////////////////////
  224.       $contribution_panel $contributionService->getConsulteesEtConseillees($usernull$etablissement244);
  225.     $contributions_of_etablissement = [];
  226.     if ($etablissement) {
  227.       $raw_data array_map(
  228.         function ($user) {
  229.           return $user->getContributions()->toArray();
  230.         },
  231.         $etablissement->getUsers()->toArray()
  232.       );
  233.       array_walk_recursive(
  234.         $raw_data,
  235.         function ($c) use (&$contributions_of_etablissement) {
  236.           $contributions_of_etablissement[] = $c;
  237.         }
  238.       );
  239.     }
  240.     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  241.     $topics_of_etablissement $this
  242.         ->getDoctrine()
  243.         ->getRepository(Topic::class)
  244.         ->findTopicByEtablissement($etablissement->getId()) ?? 0;
  245.     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  246.     if ($request->isMethod('POST') && $user) {
  247.       $em $this->getDoctrine()->getManager();
  248.       $form_data $request->headers->get('Content-Type') === 'application/json' ?
  249.         json_decode($request->getContent(), true) : $request->request->all();
  250.       switch ($form_data['submit_action']) {
  251.         case 'message':
  252.           if (empty($etablissement)) break;
  253.           $message_text $form_data['message'] ?? null;
  254.           if ($message_text != null) {
  255.             $message = new Message();
  256.             $message->setText($message_text);
  257.             $message->setPublishDate(new \DateTime('now'));
  258.             $message->setLikes([]);
  259.             $message->setApplys([]);
  260.             $message->setReports([]);
  261.             $message->setActive(true);
  262.             $message->setEtablissement($etablissement);
  263.             $message->setUser($user);
  264.             $em->persist($message);
  265.             $em->flush();
  266.             $messageService->algoliaMaj($message);
  267.             return $this->redirectToRoute('etablissement_view');
  268.           }
  269.           else $messageError 'Ce champ ne peut être vide.';
  270.           break;
  271.         case 'message_like':
  272.           $res_array = ['success' => false'error' => null];
  273.           $message_id $form_data['message_id'] ?? null;
  274.           if ($message_id != null && is_numeric($message_id)) {
  275.             $message $this->getDoctrine()->getRepository(Message::class)->find(intval($message_id));
  276.             $likes $message->getLikes();
  277.             if (( $key array_search($user->getId(), $likes) ) === false) {
  278.               $likes[] = $user->getId();
  279.               $message->setLikes($likes);
  280.               $em->persist($message);
  281.               $em->flush();
  282.               $res_array['success'] = true;
  283.               $res_array['action'] = 'message_like';
  284.               $res_array['value'] = count($likes);
  285.             }
  286.             else {
  287.               unset($likes[$key]);
  288.               $message->setLikes(array_values($likes));
  289.               $em->persist($message);
  290.               $em->flush();
  291.               $res_array['success'] = true;
  292.               $res_array['action'] = 'message_unlike';
  293.               $res_array['value'] = count($likes);
  294.             }
  295.           }
  296.           else {
  297.             $res_array['error'] = 'Le message n\'existe pas';
  298.           }
  299.           return $this->json($res_array);
  300.         case 'message_report':
  301.           $res_array = ['success' => false'error' => null];
  302.           $message_id $form_data['message_id'] ?? null;
  303.           if ($message_id != null && is_numeric($message_id)) {
  304.             $message $this->getDoctrine()->getRepository(Message::class)->find(intval($message_id));
  305.             $reports $message->getReports();
  306.             if (( $key array_search($user->getId(), $reports) ) === false) {
  307.               $reports[] = $user->getId();
  308.               $message->setReports($reports);
  309.               $em->persist($message);
  310.               $em->flush();
  311.               $res_array['success'] = true;
  312.               $res_array['action'] = 'message_report';
  313.             }
  314.             else {
  315.               unset($reports[$key]);
  316.               $message->setReports(array_values($reports));
  317.               $em->persist($message);
  318.               $em->flush();
  319.               $res_array['success'] = true;
  320.               $res_array['action'] = 'message_unreport';
  321.             }
  322.           }
  323.           else {
  324.             $res_array['error'] = 'Le message n\'existe pas';
  325.           }
  326.           return $this->json($res_array);
  327.       }
  328.     }
  329.   $formations $this->getDoctrine()->getRepository(Formation::class)->findAll();
  330.     return $this->render('etablissement/view.html.twig', [
  331.       'onglets' => $ongletService->getOnglets(),                    // Onglets
  332.       'etablissement' => $etablissement,                            // School of the user
  333.       'user' => $user,                                              // Connected User
  334.       'stats' => [
  335.         'contributions' => count($contributions_of_etablissement),
  336.         'participations' => count($topics_of_etablissement),
  337.       ],
  338.       'contribution_panel' => $contribution_panel,                  // Contributions to show on the sidebar
  339.       'forum_panel' => $topic_service->recupereLesQuelquesDerniersSujetsDeTousLesForums(3) ?? [],
  340.       'errors' => [                                                 // List of form errors
  341.         'message' => $messageError ?? null,
  342.       ],
  343.         'formations' => $formations
  344.     ]);
  345.   }
  346.     /**
  347.      * @Route("/etablissement/{id}", name="etablissement_view_id", requirements={"id"="\d+"})
  348.      * @IsGranted("ROLE_ADMIN", message="Cet espace n'est accessible qu'à un administrateur")
  349.      */
  350.     public function viewEtablissementById($idRequest $requestOngletService $ongletServiceTopicService $topic_serviceMessageService $messageService)
  351.     {
  352.         $user $this->getUser();
  353.         $etablissement $this->getDoctrine()->getRepository(Etablissement::class)->findOneBy(['id' => $id]);
  354.         if (empty($etablissement)) throw new NotFoundHttpException();
  355.         // Contribution Sidebar ////////////////////////////////////////////////////////////////////////////////////////////
  356.         $last_created_contributions $this->getDoctrine()->getRepository(Contribution::class)
  357.                 ->findBy(['status'=>'Accepté'], ['creation_date'=>'DESC']) ?? [];
  358.         $last_viewed_by_user $this->getDoctrine()->getRepository(Log::class)
  359.                 ->findBy(['user'=>$user'action'=>'view'], ['date'=>'DESC']) ?? [];
  360.         $last_viewed_by_user array_map(
  361.             function($log) {return $log->getContribution();},
  362.             $last_viewed_by_user
  363.         );
  364.         $contributions_of_etablissement = [];
  365.         $raw_data array_map(
  366.             function($user) { return $user->getContributions()->toArray(); },
  367.             $etablissement->getUsers()->toArray()
  368.         );
  369.         array_walk_recursive(
  370.             $raw_data,
  371.             function($c) use (&$contributions_of_etablissement) { $contributions_of_etablissement[] = $c; }
  372.         );
  373.         $contribution_panel = [
  374.             'last_viewed' => array_slice($last_viewed_by_user02),
  375.             'adviced' => array_slice($contributions_of_etablissement02),
  376.             'last_added' => array_slice($last_created_contributions04)
  377.         ];
  378.         if (count($contribution_panel['last_viewed']) === 1)
  379.             $contribution_panel['last_viewed'][] = array_shift($contribution_panel['last_added']);
  380.         if (count($contribution_panel['adviced']) === 1)
  381.             $contribution_panel['adviced'][] = array_shift($contribution_panel['last_added']);
  382.         //dump($last_created_contributions);
  383.         //dump($last_viewed_by_user);
  384.         //dump($contributions_of_etablissement);
  385.         //dump($contribution_panel);
  386.         ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  387.         if ($request->isMethod('POST') && !empty($request->request->all()) && $etablissement && $user) {
  388.             $em $this->getDoctrine()->getManager();
  389.             $form_data $request->request;
  390.             //dump($request->request->all());
  391.             switch ($form_data->get('submit_action')) {
  392.                 case 'message':
  393.                     $message_text $form_data->get('message') ?? null;
  394.                     if ($message_text != null) {
  395.                         $message = new Message();
  396.                         $message->setText($message_text);
  397.                         $message->setPublishDate(new \DateTime('now'));
  398.                         $message->setLikes([]);
  399.                         $message->setApplys([]);
  400.                         $message->setReports([]);
  401.                         $message->setActive(true);
  402.                         $message->setEtablissement($etablissement);
  403.                         $message->setUser($user);
  404.                         $em->persist($message);
  405.                         $em->flush();
  406.                         $messageService->algoliaMaj($message);
  407.                         return $this->redirectToRoute('etablissement_view_id', ['id' => $id]);
  408.                     }
  409.                     else $messageError 'Ce champ ne peut être vide.';
  410.                     break;
  411.                 case 'message_like':
  412.                     $message_id $form_data->get('message_id') ?? null;
  413.                     if ($message_id != null && is_numeric($message_id)) {
  414.                         $message $this->getDoctrine()->getRepository(Message::class)->find(intval($message_id));
  415.                         $likes $message->getLikes();
  416.                         if (array_search($user->getId(), $likes) === false) {
  417.                             $likes[] = $user->getId();
  418.                             $message->setLikes($likes);
  419.                             $em->persist($message);
  420.                             $em->flush();
  421.                         }
  422.                     }
  423.                     break;
  424.                 case 'message_report':
  425.                     $message_id $form_data->get('message_id') ?? null;
  426.                     if ($message_id != null && is_numeric($message_id)) {
  427.                         $message $this->getDoctrine()->getRepository(Message::class)->find(intval($message_id));
  428.                         $reports $message->getReports();
  429.                         if (array_search($user->getId(), $reports) === false) {
  430.                             $reports[] = $user->getId();
  431.                             $message->setReports($reports);
  432.                             $em->persist($message);
  433.                             $em->flush();
  434.                         }
  435.                     }
  436.                     break;
  437.             }
  438.         }
  439.         return $this->render('etablissement/view.html.twig', [
  440.             'onglets' => $ongletService->getOnglets(),                    // Onglets
  441.             'etablissement' => $etablissement,                            // School of the user
  442.             'user' => $user,                                              // Connected User
  443.             'contribution_panel' => $contribution_panel,                  // Contributions to show on the sidebar
  444.             'forum_panel' => $topic_service->recupereLesQuelquesDerniersSujetsDeTousLesForums(3) ?? [],
  445.             'errors' => [                                                 // List of form errors
  446.                 'message' => $messageError ?? null,
  447.             ],
  448.         ]);
  449.     }
  450.     /**
  451.    * @Route("/etablissements/{departement}", name="etablissements", defaults={"departement"=""}, requirements={"departement"="^[0-9a-zA-Z]*$"})
  452.    */
  453.     public function etablissements($departementRequest $requestOngletService $ongletServiceEtablissementService $etablissementService)
  454.     {
  455.         $etablissements = [];
  456.         $methode strtolower($request->getMethod());
  457.         if ($methode === 'post') {
  458.             $donnees $request->request->all();
  459.             $departement $donnees['departement'] ?? '';
  460.             return $this->redirectToRoute('etablissements', ['departement' => $departement]);
  461.         }
  462.         if ($departement) {
  463.             $etablissements $etablissementService->findByDepartement($departement);
  464.         }
  465.         else {
  466.             $etablissements $etablissementService->getRepository()->findBy([], ['name' => 'asc']);
  467.         }
  468.         return $this->render('etablissement/recherche.html.twig', [
  469.           'onglets' => $ongletService->getOnglets(),
  470.           'etablissements' => $etablissements,
  471.           'departement' => $departement,
  472.         ]);
  473.     }
  474.     /**
  475.    * @Route("/tutelles", name="tutelles", defaults={}, requirements={})
  476.    */
  477.     public function tutelles(Request $requestOngletService $ongletServiceTutelleService $tutelleService)
  478.     {
  479.         $tutelles $tutelleService->getRepository()->findBy([], ['name' => 'asc']);
  480.         return $this->render('about_us/tutelles.html.twig', [
  481.           'onglets' => $ongletService->getOnglets(),
  482.           'tutelles' => $tutelles
  483.         ]);
  484.     }
  485. }