src/Controller/Api/DiscussionController.php line 49

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Api;
  3. use App\Entity\Discussion;
  4. use App\Entity\DiscussionMessage;
  5. use App\Repository\DiscussionClassMessageRepository;
  6. use App\Repository\DiscussionClassRepository;
  7. use App\Repository\DiscussionMessageRepository;
  8. use App\Repository\NotificationsRepository;
  9. use App\Repository\SchoolYearRepository;
  10. use App\Repository\StudentYearRepository;
  11. use App\Repository\SubjectRepository;
  12. use App\Repository\TheClassRepository;
  13. use App\Repository\UserRepository;
  14. use Doctrine\ORM\EntityManagerInterface;
  15. use Doctrine\ORM\NonUniqueResultException;
  16. use Doctrine\ORM\NoResultException;
  17. use JMS\Serializer\SerializationContext;
  18. use JMS\Serializer\SerializerInterface;
  19. use Knp\Component\Pager\PaginatorInterface;
  20. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  21. use Symfony\Component\HttpFoundation\JsonResponse;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\HttpFoundation\Response;
  24. use Symfony\Component\Mercure\HubInterface;
  25. use Symfony\Component\Mercure\Update;
  26. use Symfony\Component\Routing\Annotation\Route;
  27. use OpenApi\Annotations as OA;
  28. use App\Repository\DiscussionRepository;
  29. use App\Entity\Notifications;
  30. use App\Repository\DiscussionMessagesCountRepository;
  31. use App\Repository\UserYearRepository;
  32. use Twig\Environment;
  33. use Twig\Error\LoaderError;
  34. use Twig\Error\RuntimeError;
  35. use Twig\Error\SyntaxError;
  36. use App\Service\PushNotificationService;
  37. use GuzzleHttp\Psr7\Response as Psr7Response;
  38. class DiscussionController extends AbstractController
  39. {
  40.     /**
  41.      * @throws NonUniqueResultException
  42.      * @throws NoResultException
  43.      */
  44.     #[Route('/api/discussion'name'api_discussion_index')]
  45.     public function index(
  46.         StudentYearRepository $studentYearRepository,
  47.         SchoolYearRepository $schoolYearRepository,
  48.         SerializerInterface $serializer,
  49.         DiscussionMessageRepository $discussionMessageRepository,
  50.         DiscussionRepository $discussionRepository,
  51.         SubjectRepository $subjectRepository,
  52.         DiscussionClassRepository $discussionClassRepository,
  53.         DiscussionClassMessageRepository $discussionClassMessageRepository,
  54.         NotificationsRepository $notificationsRepository,
  55.         EntityManagerInterface $entityManager,
  56.         TheClassRepository $theClassRepository
  57.         DiscussionMessagesCountRepository $discussionMessagesCountRepository
  58.     ):Response
  59.     {
  60.         if (!$this->getUser()){
  61.             return new JsonResponse(
  62.                 $serializer->serialize(['message'=>"une erreur s'est produite! redemarez l'application et réessayez"],'json'),
  63.                 Response::HTTP_UNAUTHORIZED,['accept'=>'application/json'],
  64.                 true
  65.             );
  66.         }
  67.         $school $this->getUser()->getSchool();
  68.         $discussion $discussionRepository->findByDiscussion($this->getUser(),$school/*,(int)$from*/);
  69.         $chatWhit = [];
  70.         foreach ($discussion as  $value){
  71.             $unread $discussionMessageRepository->findBy(['discussion'=>$value,'messageFor'=>$this->getUser(),'isRead'=>false],[]);
  72.             $unreadCount count($unread);
  73.             //dd($unreadCount);
  74.             //dd($unreadCount);
  75.             $messageDiscussion $discussionMessageRepository->findBy(['discussion'=>$value],[]);
  76.             $messageCount count($messageDiscussion);
  77.             if( $messageCount 0){
  78.                 $lastMessage $messageDiscussion[$messageCount-1];
  79.             }else{
  80.                 $lastMessage '';
  81.             }
  82.            
  83.             //dd($lastMessage);
  84.             if ($value->getUserA() !== $this->getUser()){
  85.                 if($messageCount 0){
  86.                     if(!empty($lastMessage->getMessage())){
  87.                         $lastMessageValue $lastMessage->getMessage();
  88.                     }else{
  89.                         $lastMessageValue "fichier ou image";
  90.                     }
  91.                     if(empty($lastMessage->getMessage()) && empty($lastMessage->getFileName())){
  92.                         $lastMessageValue ' ';
  93.                     }
  94.                     
  95.                     $user = [
  96.                         'discussionId'=>$value->getId(),
  97.                         'updatedAt'=>$value->getUpdatedAt(),
  98.                         'time_of_last_message'=>$value->getUpdatedAt(),
  99.                         'unread_message_count'=>$unreadCount,
  100.                         'last_message'=>$lastMessageValue,
  101.                         'last_message_is_read'=>$lastMessage->isIsRead(),
  102.                         'user' => $value->getUserA(),
  103.                         'userType' => $value->getUserB()->getUserType(),
  104.                     ];
  105.                     $chatWhit[]=$user;
  106.                }
  107.             }elseif($value->getUserB() !== $this->getUser()){
  108.               
  109.                if($messageCount 0){ 
  110.                     if(!empty($lastMessage->getMessage())){
  111.                         $lastMessageValue $lastMessage->getMessage();
  112.                     }else{
  113.                         $lastMessageValue "fichier ou image";
  114.                     }
  115.                     $user = [
  116.                         'discussionId'=>$value->getId(),
  117.                         'updatedAt'=>$value->getUpdatedAt(),
  118.                         'time_of_last_message'=>$value->getUpdatedAt(),
  119.                         'unread_message_count'=>$unreadCount,
  120.                         'last_message'=>$lastMessageValue,
  121.                         'last_message_is_read'=>$lastMessage->isIsRead(),
  122.                         'user' => $value->getUserB(),
  123.                         'userType' => $value->getUserB()->getUserType(),
  124.                     ];
  125.                     $chatWhit[]=$user;
  126.                 }
  127.             }
  128.         }
  129.         //discussion group
  130.         $year $schoolYearRepository->findOneBy(['active'=>true],[]);
  131.         if ($this->getUser()->getUserType() == 'parent'){
  132.             $parentStudent $studentYearRepository->findParentStudents($this->getUser(),$this->getUser()->getSchool());
  133.             $studentsParentsClasses = [];
  134.             foreach ($parentStudent as $value){
  135.                 $studentsParentsClasses[]= $value->getClasse();
  136.             }
  137.             $classesDiscussions $discussionClassRepository->findDiscussionClass($studentsParentsClasses);
  138.             $groups = [];
  139.             if ($this->getUser()->getUserType() == 'parent'){
  140.                 foreach ($classesDiscussions as $value){
  141.                     $NotificationVerify $notificationsRepository->findOneBy(['user'=>$this->getUser(),'year'=>$year],[]);
  142.                     if (empty($NotificationVerify)){
  143.                         $addNotification = new Notifications();
  144.                         $addNotification->setUser($this->getUser());
  145.                         $addNotification->setYear($year);
  146.                         $entityManager->persist($addNotification);
  147.                         $entityManager->flush();
  148.                     }
  149.                     $messageCount $discussionClassMessageRepository->findBy(['discussion'=>$value],[]);
  150.                    // $messageLastCount = $notificationsRepository->findOneBy(['user'=>$this->getUser(),'year'=>$year],[]);
  151.                     //dd($messageCount);
  152.                     $messageGroupCount count($messageCount);
  153.                     
  154.                     //dd($messageGroupCount);
  155.                     if( $messageGroupCount 0){
  156.                         $lastMessage $messageCount[$messageGroupCount-1]->getMessage();
  157.                     }else{
  158.                         $lastMessage '';
  159.                     }
  160.                     //$unreadMessage = count($messageCount) - $messageLastCount->getMessageGroupLastConnexionCount();
  161.                     $messageCount $discussionMessagesCountRepository->findOneBy(['user'=>$this->getUser(),'Discussion'=>$value],[]);
  162.                     if(!$messageCount){
  163.                         //dd('here');
  164.                         $addDiscussionMessageCount = new \App\Entity\DiscussionMessagesCount();
  165.                         $addDiscussionMessageCount->setUser($this->getUser());
  166.                         $addDiscussionMessageCount->setDiscussion($value);
  167.                         $addDiscussionMessageCount->setMessageCount(0);
  168.                         $entityManager->persist($addDiscussionMessageCount);
  169.                         $entityManager->flush();
  170.                         $messageCount $addDiscussionMessageCount;
  171.                     }
  172.                     $lasMessageCount $messageCount->getMessageCount();
  173.                     $newMessageCount $discussionClassMessageRepository->findBy(['discussion'=>$value],[]);
  174.                     $totalNewMessageCount count($newMessageCount);
  175.                     
  176.                     $unreadMessageCount $totalNewMessageCount $lasMessageCount;
  177.                     
  178.                     $content=[
  179.                         'group'=>$value,
  180.                         'updatedAt'=>$value->getUpdatedAt(),
  181.                         'unreadMessage'=>$unreadMessageCount,
  182.                         'last_message' => $lastMessage
  183.                     ];
  184.                     $groups[]=$content;
  185.                 }
  186.             }
  187.             //dd($groups);
  188.         }elseif ($this->getUser()->getUserType()=="prof"){
  189.             $user $this->getUser();
  190.             $subject $subjectRepository->findBy(['prof'=>$user,'school'=>$user->getSchool()]);
  191.             $classes = [];
  192.             foreach ($subject as $value){
  193.                 if (!in_array($value->getClasse(), $classestrue)){
  194.                     $classes[] = $value->getClasse();
  195.                 }
  196.             }
  197.             $classesDiscussions $discussionClassRepository->findDiscussionClass($classes);
  198.             //dd($classesDiscussions);
  199.             $groups = [];
  200.             foreach ($classesDiscussions as $value){
  201.                 $NotificationVerify $notificationsRepository->findOneBy(['user'=>$this->getUser(),'year'=>$year],[]);
  202.                 if (empty($NotificationVerify)){
  203.                     $addNotification = new Notifications();
  204.                     $addNotification->setUser($this->getUser());
  205.                     $addNotification->setYear($year);
  206.                     $entityManager->persist($addNotification);
  207.                     $entityManager->flush();
  208.                 }
  209.                 //dd($NotificationVerify);
  210.                 $messageCount $discussionMessagesCountRepository->findOneBy(['user'=>$this->getUser(),'Discussion'=>$value],[]);
  211.                 if(!$messageCount){
  212.                     //dd('here');
  213.                     $addDiscussionMessageCount = new \App\Entity\DiscussionMessagesCount();
  214.                     $addDiscussionMessageCount->setUser($this->getUser());
  215.                     $addDiscussionMessageCount->setDiscussion($value);
  216.                     $addDiscussionMessageCount->setMessageCount(0);
  217.                     $entityManager->persist($addDiscussionMessageCount);
  218.                     $entityManager->flush();
  219.                     $messageCount $addDiscussionMessageCount;
  220.                 }
  221.                 $lasMessageCount $messageCount->getMessageCount();
  222.                 $newMessageCount $discussionClassMessageRepository->findBy(['discussion'=>$value],[]);
  223.                 $totalNewMessageCount count($newMessageCount);
  224.                 
  225.                 $unreadMessageCount $totalNewMessageCount $lasMessageCount;
  226.                 $content=[
  227.                     'group'=>$value,
  228.                     'updatedAt'=>$value->getUpdatedAt(),
  229.                     'unreadMessage'=>$unreadMessageCount
  230.                 ];
  231.                 $groups[]=$content;
  232.             }
  233.         }elseif ($this->getUser()->getUserType()=="admin"){
  234.             $classes $theClassRepository->findBy(['school'=>$school]);
  235.             $classesDiscussions $discussionClassRepository->findDiscussionClass($classes);
  236.             //dd($classesDiscussions);
  237.             $groups = [];
  238.             foreach ($classesDiscussions as $value){
  239.                 /*
  240.                 $NotificationVerify = $notificationsRepository->findOneBy(['user'=>$this->getUser(),'year'=>$year],[]);
  241.                 if (empty($NotificationVerify)){
  242.                     $addNotification = new Notifications();
  243.                     $addNotification->setUser($this->getUser());
  244.                     $addNotification->setYear($year);
  245.                     $entityManager->persist($addNotification);
  246.                     $entityManager->flush();
  247.                 }
  248.                  */
  249.                 $messageCount $discussionMessagesCountRepository->findOneBy(['user'=>$this->getUser(),'Discussion'=>$value],[]);
  250.                 if(!$messageCount){
  251.                     //dd('here');
  252.                     $addDiscussionMessageCount = new \App\Entity\DiscussionMessagesCount();
  253.                     $addDiscussionMessageCount->setUser($this->getUser());
  254.                     $addDiscussionMessageCount->setDiscussion($value);
  255.                     $addDiscussionMessageCount->setMessageCount(0);
  256.                     $entityManager->persist($addDiscussionMessageCount);
  257.                     $entityManager->flush();
  258.                     $messageCount $addDiscussionMessageCount;
  259.                 }
  260.                 $lasMessageCount $messageCount->getMessageCount();
  261.                 $newMessageCount $discussionClassMessageRepository->findBy(['discussion'=>$value],[]);
  262.                 $totalNewMessageCount count($newMessageCount);
  263.                 
  264.                 $unreadMessageCount $totalNewMessageCount $lasMessageCount;
  265.                 $content=[
  266.                     'group'=>$value,
  267.                     'updatedAt'=>$value->getUpdatedAt(),
  268.                     'unreadMessage'=>$unreadMessageCount
  269.                 ];
  270.                 $groups[]=$content;
  271.             }
  272.         }
  273.         $data = [
  274.             'discussions'=>$chatWhit,
  275.             'groups'=>$groups
  276.         ];
  277.         $context SerializationContext::create()->setGroups(["getDiscussion"]);
  278.         $jsonPost $serializer->serialize($data,'json',$context);
  279.         return new JsonResponse($jsonPost,Response::HTTP_OK,['accept'=>'application/json'],true);
  280.     }
  281.     /**
  282.      * discussion message hub subscribe
  283.      * @OA\Tag(name="Discussion")
  284.      */
  285.     #[Route(path'/api/discussion/{id}/message/user/mercure/hub'name'api_discussion_message_user_subscribe_mercure_hub'methods: ['GET'])]
  286.     public function getUserSubscribeLateMercureHub($id,SerializerInterface $serializerEnvironment $twigUserRepository $userRepository):JsonResponse
  287.     {
  288.         //https://flex.com/discussion/message/page/hub/'.$discussionEntity->getId()
  289.         $mercureHubSubscribeUrl "https://flex.com/discussion/message/page/hub/".$id;
  290.         try {
  291.             $result $twig->render('mercure/client_hub_url.html.twig', [
  292.                 'url' => $mercureHubSubscribeUrl
  293.             ]);
  294.         } catch (LoaderError|RuntimeError|SyntaxError $e) {
  295.         }
  296.         return new  JsonResponse($serializer->serialize([ 'mercure_client_hub_url'=>$result], 'json'),Response::HTTP_OK,['accept'=>'application/json'],true);
  297.     }
  298.     #[Route(path'api/discussion/new/whit/{id}/getId'name'api_discussion_Verify_get_id'methods: ['POST','GET'] )]
  299.     public function discussionGetId(
  300.         SchoolYearRepository $schoolYearRepository,
  301.         UserRepository $userRepository,
  302.         DiscussionRepository $discussionRepository,
  303.         $id,
  304.         EntityManagerInterface $entityManager
  305.     ):JsonResponse
  306.     {
  307.         $year $schoolYearRepository->findOneBy(['active'=>true]);
  308.         $user $this->getUser();
  309.         $discussionWhit $userRepository->find($id);
  310.         $discussionExist $discussionRepository->findOneBy(['userA'=>$user,'userB'=>$discussionWhit]);
  311.         $discussionExist2 $discussionRepository->findOneBy(['userA'=>$discussionWhit,'userB'=>$user]);
  312.         if ($discussionExist === null && $discussionExist2 === null){
  313.             $discussion = new Discussion();
  314.             $discussion->setUserA($user);
  315.             $discussion->setUserB($discussionWhit);
  316.             $discussion->setSchool($this->getUser()->getSchool());
  317.             $discussion->setYear($year);
  318.             $entityManager->persist($discussion);
  319.             $entityManager->flush();
  320.             $discussionEntity $discussion;
  321.         }else{
  322.             if ($discussionExist === null){
  323.                 $discussionEntity $discussionExist2;
  324.             }elseif ( $discussionExist2 === null){
  325.                 $discussionEntity $discussionExist;
  326.             }
  327.         }
  328.          return new JsonResponse(['discussionId'=>$discussionEntity->getId()]);
  329.     }
  330.     
  331.     /**
  332.      * @throws RuntimeError
  333.      * @throws SyntaxError
  334.      * @throws LoaderError
  335.      */
  336.     #[Route(path'api/discussion/new/whit/{id}/'name'api_discussion_new_'methods: ['POST','GET'] )]
  337.     public function discussionWith(
  338.         DiscussionMessageRepository $discussionMessageRepository,
  339.         HubInterface $hub,
  340.         SchoolYearRepository $schoolYearRepository,
  341.         SerializerInterface $serializer,
  342.                                     $id,
  343.         DiscussionRepository $discussionRepository,
  344.         UserRepository $userRepository,
  345.         EntityManagerInterface $entityManager,
  346.         NotificationsRepository $notificationsRepository,
  347.         Request $request,
  348.         Environment $twig,
  349.         PaginatorInterface  $paginator,
  350.         PushNotificationService $notification
  351.     ): Response
  352.     {
  353.         if (!$this->getUser()){
  354.             return new JsonResponse(null);
  355.         }
  356.         $year $schoolYearRepository->findOneBy(['active'=>true]);
  357.         $user $this->getUser();
  358.         $discussionWhit $userRepository->find($id);
  359.         $discussionExist $discussionRepository->findOneBy(['userA'=>$user,'userB'=>$discussionWhit]);
  360.         $discussionExist2 $discussionRepository->findOneBy(['userA'=>$discussionWhit,'userB'=>$user]);
  361.         if ($discussionExist === null && $discussionExist2 === null){
  362.             $discussion = new Discussion();
  363.             $discussion->setUserA($user);
  364.             $discussion->setUserB($discussionWhit);
  365.             $discussion->setSchool($this->getUser()->getSchool());
  366.             $discussion->setYear($year);
  367.             $entityManager->persist($discussion);
  368.             $entityManager->flush();
  369.             $discussionEntity $discussion;
  370.         }else{
  371.             if ($discussionExist === null){
  372.                 $discussionEntity $discussionExist2;
  373.             }elseif ( $discussionExist2 === null){
  374.                 $discussionEntity $discussionExist;
  375.             }
  376.         }
  377.         $msgFor $userRepository->find($id);
  378.         if ($request->isMethod('POST')){
  379.             $data $request->request->all();
  380.             $discussionMessage = new DiscussionMessage();
  381.             $discussionMessage->setMessageBy($user);
  382.             $discussionMessage->setMessageFor($msgFor);
  383.             $discussionMessage->setIsRead(false);
  384.             $discussionMessage->setMessage((string)$data['message']);
  385.             $discussionMessage->setDiscussion($discussionEntity);
  386.             if ($data['reply_for_message']!== null && $data['reply_for_message'] !== ''){
  387.                 $msgId = (int) $data['reply_for_message'];
  388.                 if ($msgId){
  389.                     $rpMessage $discussionMessageRepository->find($msgId);
  390.                     $discussionMessage->setReplyToMessage($rpMessage);
  391.                 }
  392.             }
  393.             $file $request->files->get('file');
  394.             
  395.             if ($file !== null) {
  396.                
  397.                 $mimeType $file->getMimeType();
  398.                 //return new JsonResponse(['resu' => $mimeType]);
  399.                 
  400.                 $authorizedMimeTypes = [
  401.                     'application/pdf',
  402.                     'image/png',
  403.                     'image/jpeg',
  404.                     'audio/x-caf'// mieux écrit
  405.                     'audio/caf',
  406.                     'application/octet-stream',
  407.                     "video/3gpp",
  408.                     "image" // cas spécial traité plus bas
  409.                 ];
  410.             
  411.                 if (in_array($mimeType$authorizedMimeTypestrue)) {
  412.             
  413.                     $originalExtension pathinfo($file->getClientOriginalName(), PATHINFO_EXTENSION);
  414.             
  415.                     // Cas spécial pour "application/octet-stream"
  416.                     if ($mimeType === 'application/octet-stream' OR $mimeType === "video/3gpp") {
  417.                         //  On convertit le fichier en mp3
  418.             
  419.                         // 1️ Créer un chemin temporaire
  420.                         $tempDir sys_get_temp_dir();
  421.                         $originalPath $file->getPathname();
  422.                         $mp3FileName md5(uniqid(''true)) . '.mp3';
  423.                         $mp3Path $tempDir DIRECTORY_SEPARATOR $mp3FileName;
  424.             
  425.                         //  Utiliser ffmpeg pour convertir en mp3
  426.                         $command "ffmpeg -i " escapeshellarg($originalPath) . " -codec:a libmp3lame -qscale:a 2 " escapeshellarg($mp3Path);
  427.                         exec($command$output$returnVar);
  428.             
  429.                         if ($returnVar !== 0) {
  430.                             return new JsonResponse(
  431.                                 $serializer->serialize(['status' => '500''error' => 'Erreur de conversion audio'], 'json'),
  432.                                 Response::HTTP_INTERNAL_SERVER_ERROR,
  433.                                 [],
  434.                                 true
  435.                             );
  436.                         }
  437.             
  438.                         //  Déplacer le fichier mp3 final
  439.                         $finalName md5(uniqid(''true)) . '.mp3';
  440.                         $destinationPath $this->getParameter('app.discussion.file.dir') . '/' $finalName;
  441.                         rename($mp3Path$destinationPath);
  442.             
  443.                         $discussionMessage->setFileName($finalName);
  444.             
  445.                     } else {
  446.                         // Cas normal : pas besoin de conversion
  447.                         $fileName md5(uniqid(''true)) . '.' $originalExtension;
  448.                         $file->move($this->getParameter('app.discussion.file.dir'), $fileName);
  449.                         $discussionMessage->setFileName($fileName);
  450.                     }
  451.             
  452.                 } else {
  453.                     return new JsonResponse(
  454.                         $serializer->serialize(['status' => '400'], 'json'),
  455.                         Response::HTTP_OK,
  456.                         [],
  457.                         true
  458.                     );
  459.                 }
  460.             }
  461.             
  462.             if (($file === null) && ($data['message'] === '')){
  463.                 return new JsonResponse(
  464.                     $serializer->serialize([ 'message'=>'file and message is empty, add file and message or one value'],'json'),
  465.                     Response::HTTP_BAD_REQUEST,[],
  466.                     true
  467.                 );
  468.             }
  469.             $entityManager->persist($discussionMessage);
  470.             $entityManager->flush();
  471.             $discussionEntity->setCreatedAt(new \DateTime());
  472.             $entityManager->flush();
  473.             // $messageFind = $discussionMessageRepository->find($discussionMessage->getId());
  474.             //if ($discussionMessage->getMessageBy() != $this->getUser()){
  475.                 $messageContent = [];
  476.                  $messageItem = [];
  477.                  $messageItem["_id"]=$discussionMessage->getId();
  478.                  $messageItem["text"]= $discussionMessage->getMessage();
  479.                  if (isset($fileName)) {
  480.                     $fileNameLower strtolower($fileName);
  481.                     
  482.                 
  483.                     if (preg_match('/\.(jpg|jpeg|png|gif|webp)$/'$fileNameLower)){
  484.                         $messageItem["image"] = $this->getParameter("base.url") . "/uploads/discussion/$fileName";
  485.                         $fileType "img";
  486.                     }elseif(preg_match('/\.pdf$/'$fileNameLower)){
  487.                         $messageItem["file"] = $this->getParameter("base.url") . "/uploads/discussion/$fileName"
  488.                         $messageItem["fileName"] = $this->getParameter("base.url") . "/uploads/discussion/$fileName";  
  489.                         $fileType "pdf";  
  490.                     } elseif(preg_match('/\.mp3$/'$fileNameLower)){
  491.                         $messageItem["audio"] = $this->getParameter("base.url") . "/uploads/discussion/$fileName";  
  492.                         $fileType "audio";   
  493.                     }
  494.                 }
  495.                 if(isset($finalName)){
  496.                     $messageItem["audio"] = $this->getParameter("base.url") . "/uploads/discussion/$finalName";            
  497.                 }
  498.                  
  499.                  $messageItem["createdAt"]= $discussionMessage->getCreatedAt();
  500.                  if ($discussionMessage->getMessageBy()->getUserType() == 'parent'){
  501.                     $userType 'parent';
  502.                  }elseif ($discussionMessage->getMessageBy()->getUserType() == 'prof'){
  503.                     $userType 'enseignent';
  504.                  }else{
  505.                     $userType "membre de l'administration";
  506.                  }
  507.                  $userName $discussionMessage->getMessageBy()->getFullName()." ~ ".$userType;
  508.                  $messageItem["user"]=[
  509.                     '_id'=> $discussionMessage->getMessageBy()->getId(),
  510.                     'name'=> $userName
  511.                  ];
  512.                  $rp $discussionMessage->getReplyToMessage();
  513.                  
  514.                  if($rp !== null){
  515.                     if($discussionMessage->getReplyToMessage()->getFileName()){
  516.                        $fName =  $discussionMessage->getReplyToMessage()->getFileName();
  517.                     }else { $fName null; }
  518.                     $messageItem["replyForMessage"] = [
  519.                        "_id" => $discussionMessage->getReplyToMessage()->getId(),
  520.                        "text" => $discussionMessage->getReplyToMessage()->getMessage(),
  521.                        "file" => $fName ,
  522.                        "_user" => [
  523.                             "_id" => $discussionMessage->getReplyToMessage()->getMessageBy()->getId(),
  524.                             "_name" => $discussionMessage->getReplyToMessage()->getMessageBy()->getFullName()
  525.                        ]
  526.                        //"file_type" => $fileType
  527.                     ];
  528.                 }
  529.             
  530.                  $messageContent[]=$messageItem;
  531.                 $update = new Update(
  532.                     'https://flex.com/discussion/message/page/hub/'.$discussionEntity->getId(),
  533.                     //$discussionMessage->getId()
  534.                     $serializer->serialize($messageContent,'json')
  535.                     //json_encode($messageContent)
  536.                 );
  537.                 $hub->publish($update);
  538.             //}
  539.             //on envoie la notification apres que Mercure ait envoye le message et que le message n'est pas encore lu
  540.             
  541.             if ($discussionMessage->isIsRead() == false) {
  542.                 
  543.                 $destinataire $discussionMessage->getMessageFor();
  544.                 $lang $destinataire->getLocalPhoneLang();
  545.                 $token $destinataire->getUserToken();
  546.                 $userId $destinataire->getId();
  547.                 $author $discussionMessage->getMessageBy();
  548.                 $route '/drawer/(tabs)/Calls';
  549.                 if ($author->getUserType() == 'parent') {
  550.                     $userType 'parent';
  551.                 } elseif ($author->getUserType() == 'prof') {
  552.                     $userType 'enseignant ~ ' $discussionMessage->getDiscussion()->getClasse()->getName();
  553.                 } else {
  554.                     $userType 'admin';
  555.                 }
  556.                 $title $destinataire->getFullName() . ' ~ '$userType;
  557.                 $message $discussionMessage->getMessage();
  558.                 $notification->sendNotification($token$title$message$route$userId);
  559.             } 
  560.             if (isset($fileName)){
  561.                 $fileName $fileName;  
  562.             }else{
  563.                 $fileName null;         
  564.             }
  565.             return new JsonResponse(
  566.                 $serializer->serialize(
  567.                 [
  568.                     'name'=>$title,
  569.                     'createdAt'=> $discussionMessage->getCreatedAt(),
  570.                     '_file'=> $fileName  ,
  571.                     'message'=>'message has been added',
  572.                     'status'=>200
  573.                 ],
  574.                 'json'),
  575.                 Response::HTTP_OK,[],
  576.                 true
  577.             );
  578.         }
  579.         $message $discussionMessageRepository->findByMessageFrom($discussionEntity);
  580.         $messageIsReadUpdate $discussionMessageRepository->findBy(['discussion'=>$discussionEntity,'isRead'=>false,'messageFor'=>$this->getUser()]);
  581.         foreach ($messageIsReadUpdate as $__value){
  582.             $__value->setIsRead(true);
  583.         }
  584.         $entityManager->flush();
  585.         $allMessageCount count($message);
  586.         $messageContent = [];
  587.         foreach ($message as $value){
  588.             $messageItem = [];
  589.             $messageItem["_id"]=$value->getId();
  590.             $messageItem["text"]= $value->getMessage();
  591.             $messageItem["_file"]= $value->getFileName();
  592.             $messageItem["createdAt"]= $value->getCreatedAt();
  593.             if ($value->getMessageBy()->getUserType() == 'parent'){
  594.                 $userType 'parent';
  595.             }elseif ($value->getMessageBy()->getUserType() == 'prof'){
  596.                 $userType 'enseignent';
  597.             }else{
  598.                 $userType "membre de l'administration";
  599.             }
  600.             $userName $value->getMessageBy()->getFullName()." ~ ".$userType;
  601.             $messageItem["user"]=[
  602.               '_id'=> $value->getMessageBy()->getId(),
  603.                'name'=> $userName
  604.             ];
  605.             if($value->getReplyToMessage()){
  606.                 $messageItem["replyForMessage"]= $value->getReplyToMessage()->getMessage();  
  607.             }
  608.             $rp $value->getReplyToMessage();
  609.                  
  610.             if($rp !== null){
  611.                 if($value->getReplyToMessage()->getFileName()){
  612.                        $fName =  $value->getReplyToMessage()->getFileName();
  613.                 }else { $fName null; }
  614.                 $messageItem["replyForMessage"] = [
  615.                     "_id" => $value->getReplyToMessage()->getId(),
  616.                     "text" => $value->getReplyToMessage()->getMessage(),
  617.                     "file" => $fName ,
  618.                     "_user" => [
  619.                         "_id" => $value->getReplyToMessage()->getMessageBy()->getId(),
  620.                         "_name" => $value->getReplyToMessage()->getMessageBy()->getFullName()
  621.                     ]
  622.                 ];
  623.             }
  624.             $messageContent[]=$messageItem;
  625.         }
  626.         $data $paginator->paginate($messageContent,
  627.         $request->query->getInt('page'1),1000);
  628.         $discussWith = [
  629.             "name" => $discussionWhit->getFullName(),
  630.             "user_type" => $discussionWhit->getUserType(),
  631.             'user_photo' => $discussionWhit->getPicture()
  632.         ];
  633.         $responseContent = [
  634.             "message" => $data->getItems(),
  635.             "_with"=> $discussWith,
  636.             "totalCount" => $data->getTotalItemCount(),
  637.             "nbPerPage"=>$data->getItemNumberPerPage(),
  638.             "CurrentPage" => $data->getCurrentPageNumber(),
  639.             "discussionId"=>$discussionEntity->getId()
  640.         ];
  641.         $jsonPost $serializer->serialize($responseContent,'json');
  642.         return new JsonResponse($jsonPost,Response::HTTP_OK,['accept'=>'application/json'],true);
  643.     }
  644.       /**
  645.      * discussion message delete
  646.      * @OA\Tag(name="Discussion")
  647.      */
  648.     #[Route(path'api/discussion/message/{id}/delete'name'api_discussion_message_delete'methods: ['GET'] )]
  649.     public function deleteMessage(DiscussionMessage $discussionMessageEntityManagerInterface $entityManagerInterfaceSerializerInterface $serializer):JsonResponse
  650.     {
  651.         
  652.         if (!$this->getUser()){
  653.             return new JsonResponse(
  654.                 $serializer->serialize(['message'=>'you must be logged'],'json'),
  655.                 Response::HTTP_UNAUTHORIZED,['accept'=>'application/json'],
  656.                 true
  657.             );
  658.         }
  659.         
  660.         $entityManagerInterface->remove($discussionMessage);
  661.         $entityManagerInterface->flush();
  662.         
  663.         return new JsonResponse(
  664.             $serializer->serialize(['message'=>'message deleted'],'json'),
  665.             Response::HTTP_OK,['accept'=>'application/json'],
  666.             true
  667.         );
  668.         
  669.     }
  670.     /**
  671.      * discussion contact
  672.      * @OA\Tag(name="Discussion")
  673.      */
  674.     #[Route(path'api/parent/discussion/contact/list'name'api_discussion_parent_contact_list'methods: ['GET'] )]
  675.     public function discussionParentList(
  676.         SubjectRepository $subjectRepository,
  677.         SchoolYearRepository $schoolYearRepository,
  678.         StudentYearRepository $studentYearRepository,
  679.         SerializerInterface $serializer
  680.     ):JsonResponse
  681.     {
  682.         $user $this->getUser();
  683.         $school $user->getSchool();
  684.         $year $schoolYearRepository->findOneBy(['active'=>true],[]);
  685.         $parentStudent $studentYearRepository->findParentStudents($user$school);
  686.         //$studentsIds = [];
  687.         $studentsClass = [];
  688.         foreach ($parentStudent as $value){
  689.             //$studentsIds[] = $value->getStudent();
  690.             $studentsClass[]=$value->getClasse();
  691.         }
  692.         $contactList = [];
  693.         foreach ($studentsClass as $value){
  694.             $_subject $subjectRepository->findBy(['school'=>$school,'classe'=>$value]);
  695.             $prof = [];
  696.             foreach ($_subject as $val){
  697.                 $prof[] = [
  698.                     'prof' => $val->getProf(),
  699.                     'subject' => $val
  700.                 ];
  701.             }
  702.             $data=[
  703.                 'class_name'=>$value->getName(),
  704.                 'user_infos'=>$prof
  705.             ];
  706.             $contactList[]=$data;
  707.         }
  708.         $context SerializationContext::create()->setGroups(["getDiscussion"]);
  709.         $jsonPost $serializer->serialize($contactList,'json',$context);
  710.         return new JsonResponse($jsonPost,Response::HTTP_OK,['accept'=>'application/json'],true);
  711.     }
  712.     /**
  713.      * discussion prof contact list
  714.      * @OA\Tag(name="Discussion")
  715.      */
  716.     #[Route(path'/api/prof/discussion/contact/list'name'api_discussion_prof_contact_list'methods: ['GET'] )]
  717.     public function profContactList(
  718.         SubjectRepository $subjectRepository,
  719.         SchoolYearRepository $schoolYearRepository,
  720.         StudentYearRepository $studentYearRepository,
  721.         SerializerInterface $serializer,
  722.         TheClassRepository $theClassRepository,
  723.         UserYearRepository $userYearRepository
  724.     ):JsonResponse
  725.     {
  726.         $user $this->getUser();
  727.         $subject $subjectRepository->findBy(['prof'=>$user,'school'=>$user->getSchool()]);
  728.         $classes = [];
  729.         if ($user->getUserType() === 'admin'){
  730.             $classes $theClassRepository->findBy(['school'=>$user->getSchool()]);
  731.             foreach ($classes as $value){
  732.                 if (!in_array($value$classestrue)){
  733.                     $classes[] = $value;
  734.                 }
  735.             }
  736.         }elseif ($user->getUserType() === 'prof'){
  737.            foreach ($subject as $value){
  738.                 if (!in_array($value->getClasse(), $classestrue)){
  739.                     $classes[] = $value->getClasse();
  740.                 }
  741.             }
  742.         }
  743.          $_users = [];
  744.         
  745.         $users $userYearRepository->findBy(['year'=>$schoolYearRepository->findOneBy(['active'=>true]),'school'=>$user->getSchool(),'userType'=>'prof'],[]);
  746.          $userInfos1 = [];
  747.         foreach ($users as $value){
  748.             $userDetails1 = [
  749.                 'userId'=> $value->getUser()->getId(),
  750.                 'userFullName'=> $value->getUser()->getFullName() ." ~ ".$value->getUser()->getPhone(),
  751.                 "last_request_ts"=> $value->getUser()->getLastRequestTs(),
  752.                 'userType'=>'prof',
  753.                 "phone"=>$value->getUser()->getPhone(),
  754.                 'userPhoto'=>$value->getUser()->getPicture(),
  755.                 'student'=>null
  756.             ];
  757.             $userInfos1[] = $userDetails1;
  758.         }
  759.         $userDetails1 = [
  760.             'classeName' => "enseignants",
  761.             'userInfos' => $userInfos1
  762.         ];
  763.         $_users[] = $userDetails1;
  764.         
  765.         
  766.         //dd($users);
  767.         
  768.         $year $schoolYearRepository->findOneBy(['active'=>true]);
  769.         foreach ($classes as $value){
  770.             //$className = $value->getName();
  771.             $studentsClass $studentYearRepository->findBy(['classe'=>$value,'school'=>$user->getSchool(),'year'=>$year],[]);
  772.             //$userInfos = ['classeName'=>$value->getName()];
  773.             $userInfos = [];
  774.             foreach ($studentsClass as $val){
  775.                 if($val && $val->getStudent() && $val->getStudent()->getParent() != null){
  776.                    
  777.                     $userDetails = [
  778.                         'userId'=> $val->getStudent()->getParent()?->getId(),
  779.                         'userFullName'=> $val->getStudent()->getParent()?->getFullName() ." ~ ".$val->getStudent()->getParent()?->getPhone(),
  780.                         "last_request_ts"=> $val->getStudent()->getParent()?->getLastRequestTs(),
  781.                         'userType'=>'parent',
  782.                         'phone'=>$val->getStudent()->getParent()?->getPhone(),
  783.                         'userPhoto'=>$val->getStudent()->getParent()?->getPicture(),
  784.                         'student'=>[
  785.                             'id'=> $val->getStudent()->getId(),
  786.                             'fullName'=> $val->getStudent()->getFullName(),
  787.                         ]
  788.                     ];
  789.                     $userInfos[] = $userDetails;
  790.                 }
  791.             }
  792.             $userDetails = [
  793.                 'classeName' => $value->getName(),
  794.                 'userInfos' => $userInfos
  795.             ];
  796.             $_users[] = $userDetails;
  797.         }
  798.         $context SerializationContext::create()->setGroups(["getDiscussion"]);
  799.         $jsonPost $serializer->serialize($_users,'json',$context);
  800.         return new JsonResponse($jsonPost,Response::HTTP_OK,['accept'=>'application/json'],true);
  801.     }
  802.      /**
  803.      * discussion contact
  804.      * @OA\Tag(name="Discussion")
  805.      */
  806.     #[Route(path'/api/discussion/contact'name'api_discussion_contact'methods: ['GET'] )]
  807.     public function contact(Request $requestPaginatorInterface $paginator,SubjectRepository $subjectRepositorySerializerInterface $serializerStudentYearRepository $studentYearRepositorySchoolYearRepository $schoolYearRepository):JsonResponse
  808.     {
  809.         if (!$this->getUser()){
  810.              return new JsonResponse(
  811.                  $serializer->serialize(['message'=>'you must be logged'],'json'),
  812.                  Response::HTTP_UNAUTHORIZED,['accept'=>'application/json'],
  813.                  true
  814.              );
  815.         }
  816.         if ($this->getUser()->getUserType() === (string)'parent'){
  817.             $user $this->getUser();
  818.             $year $schoolYearRepository->findOneBy(['active'=>true],[]);
  819.             $students $studentYearRepository->findBy(['year'=>$year]);
  820.             $parentStudentsClass = [];
  821.             foreach ($students as $value){
  822.                 if ($value->getStudent()->getParent() === $user){
  823.                     $parentStudentsClass[]=$value->getClasse();
  824.                 }
  825.             }
  826.             $prof = [];
  827.             foreach ($parentStudentsClass as $value){
  828.                 $subject $subjectRepository->findBy(['classe'=>$value]);
  829.                 $className $value->getName();
  830.                 $userInfos = [];
  831.                 foreach ($subject as $val){
  832.                    $subjectName $val->getName();
  833.                    $profId $val->getProf()->getId();
  834.                    $profName $val->getProf()->getFirstName(). ' '$val->getProf()->getLastName();
  835.                    $profDetails = [
  836.                      'userId' => $profId,
  837.                      "last_request_ts"=> $val->getProf()->getLastRequestTs(),
  838.                      'userFullName' => $profName,
  839.                      'subject'=>$subjectName,
  840.                      'userType' => 'teacher',
  841.                      'student' => null,
  842.                    ];
  843.                    $userInfos[]=$profDetails;
  844.                 }
  845.                 $details = [
  846.                     'classeName'=>$className,
  847.                     'userInfos'=>$userInfos,
  848.                 ];
  849.                 $prof[]=$details;
  850.             }
  851.             $jsonUser $serializer->serialize($prof,'json');
  852.             return new JsonResponse($jsonUser,Response::HTTP_OK,['accept'=>'application/json'],true);
  853.         }
  854.         if ($this->getUser()->getUserType() === (string)'prof'){
  855.            $user $this->getUser();
  856.            $subject $subjectRepository->findBy(['prof'=>$user]);
  857.            $classe = [];
  858.            foreach ($subject as $value){
  859.                if (!in_array($value->getClasse(), $classetrue)){
  860.                    $classe[] = $value->getClasse();
  861.                }
  862.            }
  863.            $year $schoolYearRepository->findOneBy(['active'=>true]);
  864.            $parent = [];
  865.            foreach ($classe as $value){
  866.                //$className = $value->getName();
  867.                $studentsClass $studentYearRepository->findBy(['classe'=>$value],[]);
  868.                //$userInfos = ['classeName'=>$value->getName()];
  869.                $userInfos = [];
  870.                foreach ($studentsClass as $val){
  871.                    $userDetails = [
  872.                        'userId'=> $val->getStudent()->getParent()->getId(),
  873.                        'userFullName'=> $val->getStudent()->getParent()->getFullName(),
  874.                        "last_request_ts"=> $val->getStudent()->getParent()->getLastRequestTs(),
  875.                        'subject'=>null,
  876.                        'userType'=>'parent',
  877.                        'student'=>[
  878.                           'id'=> $val->getStudent()->getId(),
  879.                           'fullName'=> $val->getStudent()->getFullName(),
  880.                        ]
  881.                    ];
  882.                    $userInfos[] = $userDetails
  883.                    
  884.                }
  885.                
  886.                $userDetails = [
  887.                 'classeName' => $value->getName(),
  888.                 'userInfos' => $userInfos
  889.                ];
  890.                
  891.                $parent[] = $userDetails;
  892.            }
  893.             
  894.            //dd($parent);
  895.             $jsonUser $serializer->serialize($parent,'json');
  896.             return new JsonResponse($jsonUser,Response::HTTP_OK,['accept'=>'application/json'],true);
  897.             //dd($parent)
  898.            //dd($classe);
  899.         }
  900.         return new JsonResponse(null);
  901.     }
  902.      /**
  903.      * discussion list
  904.      * @OA\Tag(name="Discussion")
  905.      */
  906.     #[Route(path'api/discussion/from/{from}/list'name'api_discussion_list'methods: ['GET'] )]
  907.     public function discussionList(
  908.         $from,
  909.         StudentYearRepository $studentYearRepository,
  910.         SchoolYearRepository $schoolYearRepository,
  911.         SerializerInterface $serializer,
  912.         DiscussionMessageRepository $discussionMessageRepository,
  913.         DiscussionRepository $discussionRepository,
  914.         SubjectRepository $subjectRepository,
  915.         PushNotificationService $notification
  916.     ):JsonResponse
  917.     {
  918.         if (!$this->getUser()){
  919.              return new JsonResponse(
  920.                  $serializer->serialize(['message'=>'you must be logged'],'json'),
  921.                  Response::HTTP_UNAUTHORIZED,['accept'=>'application/json'],
  922.                  true
  923.              );
  924.         }
  925.         $school $this->getUser()->getSchool();
  926.         $discussion $discussionRepository->findByDiscussion($this->getUser(),$school/*,(int)$from*/);
  927.         $chatWhit = [];
  928.         foreach ($discussion as  $value){
  929.             $unread $discussionMessageRepository->findBy(['discussion'=>$value,'messageFor'=>$this->getUser(),'isRead'=>false]);
  930.             $unreadCount count($unread);
  931.             //dd($unreadCount);
  932.             $messageDiscussion $discussionMessageRepository->findBy(['discussion'=>$value],[]);
  933.             //$messageCount = count($messageDiscussion);
  934.             //$lastMessage = $messageDiscussion[$messageCount];
  935.             //dd($lastMessage);
  936.             if ($value->getUserA() !== $this->getUser()){
  937.                 $user = [
  938.                     'discussionId'=>$value->getId(),
  939.                     'time_of_last_message'=>$value->getUpdatedAt(),
  940.                     'unread_message_count'=>$unreadCount,
  941.                     'user' => $value->getUserB(),
  942.                     'userType' => $value->getUserB()->getUserType(),
  943.                 ];
  944.                 $chatWhit[]=$user;
  945.             }elseif($value->getUserB() !== $this->getUser()){
  946.                 $user = [
  947.                     'discussionId'=>$value->getId(),
  948.                     'time_of_last_message'=>$value->getUpdatedAt(),
  949.                     'unread_message_count'=>$unreadCount,
  950.                     'user' => $value->getUserB(),
  951.                     'userType' => $value->getUserB()->getUserType(),
  952.                 ];
  953.                 $chatWhit[]=$user;
  954.             }
  955.         }
  956.         //dd($chatWhit);
  957.         $context SerializationContext::create()->setGroups(["getDiscussion"]);
  958.         $jsonUser $serializer->serialize($chatWhit,'json',$context);
  959.         return new JsonResponse($jsonUser,Response::HTTP_OK,['accept'=>'application/json'],true);
  960.         //dd($chatWhit);
  961.     }
  962.      /**
  963.      * discussion new
  964.      * @OA\Tag(name="Discussion")
  965.      */
  966.     #[Route(path'api/discussion/new/whit/{id}/from/{from}/'name'api_discussion_new'methods: ['POST','GET'] )]
  967.     public function new(
  968.         DiscussionMessageRepository $discussionMessageRepository,
  969.          HubInterface $hub,
  970.          SchoolYearRepository $schoolYearRepository,
  971.          SerializerInterface $serializer,
  972.          $id,$from,
  973.          DiscussionRepository $discussionRepository,
  974.          UserRepository $userRepository,
  975.          EntityManagerInterface $entityManager,
  976.          NotificationsRepository $notificationsRepository,
  977.          MessageBusInterface $bus,
  978.          PushNotificationService $notification,
  979.          Request $request
  980.     ):JsonResponse{
  981.         if (!$this->getUser()){
  982.              return new JsonResponse(
  983.                  $serializer->serialize(['message'=>'you must be logged'],'json'),
  984.                  Response::HTTP_UNAUTHORIZED,['accept'=>'application/json'],
  985.                  true
  986.              );
  987.         }
  988.         $year $schoolYearRepository->findOneBy(['active'=>true]);
  989.         $user $this->getUser();
  990.         $discussionWhit $userRepository->find($id);
  991.         $discussionExist $discussionRepository->findOneBy(['userA'=>$user,'userB'=>$discussionWhit]);
  992.         $discussionExist2 $discussionRepository->findOneBy(['userA'=>$discussionWhit,'userB'=>$user]);
  993.         if ($discussionExist === null && $discussionExist2 === null){
  994.             $discussion = new Discussion();
  995.             $discussion->setUserA($user);
  996.             $discussion->setUserB($discussionWhit);
  997.             $discussion->setSchool($this->getUser()->getSchool());
  998.             $discussion->setYear($year);
  999.             $entityManager->persist($discussion);
  1000.             $entityManager->flush();
  1001.             $discussionEntity $discussion;
  1002.         }else{
  1003.             if ($discussionExist === null){
  1004.                 $discussionEntity $discussionExist2;
  1005.             }elseif ( $discussionExist2 === null){
  1006.                  $discussionEntity $discussionExist;
  1007.             }
  1008.         }
  1009.         $msgFor $userRepository->find($id);
  1010.         if ($request->isMethod('POST')){
  1011.             $data $request->request->all();
  1012.             $discussionMessage = new DiscussionMessage();
  1013.             $discussionMessage->setMessageBy($user);
  1014.             $discussionMessage->setMessageFor($msgFor);
  1015.             $discussionMessage->setIsRead(false);
  1016.             $discussionMessage->setMessage((string)$data['message']);
  1017.             $discussionMessage->setDiscussion($discussionEntity);
  1018.             if ($data['reply_for_message']!== null && $data['reply_for_message'] !== ''){
  1019.                 $msgId = (int) $data['reply_for_message'];
  1020.                 if ($msgId){
  1021.                     $rpMessage $discussionMessageRepository->find($msgId);
  1022.                     $discussionMessage->setReplyToMessage($rpMessage);
  1023.                 }
  1024.             }
  1025.              $file $request->files->get('file');
  1026.              if ($file!==null){
  1027.                  $extensionAuthorize = ["pdf","PDF","PNG",'png','jpg','JPG','JPEG','jpeg','docx','DOCX'];
  1028.                  if (in_array($file->guessExtension(), $extensionAuthorizetrue)){
  1029.                      $fileName md5(uniqid(''true)).'.'.$file->guessExtension();
  1030.                      $file->move($this->getParameter('app.discussion.file.dir'),$fileName);
  1031.                      $discussionMessage->setFileName($fileName);
  1032.                  }else{
  1033.                     return new JsonResponse(
  1034.                          $serializer->serialize(['message'=>'file extension is not supported'],'json'),
  1035.                          Response::HTTP_UNAUTHORIZED,[],
  1036.                          true
  1037.                     );
  1038.                  }
  1039.              }
  1040.              if (($file === null) && ($data['message'] === '')){
  1041.                 return new JsonResponse(
  1042.                     $serializer->serialize(['message'=>'file and message is empty, add file and message or one value'],'json'),
  1043.                     Response::HTTP_BAD_REQUEST,[],
  1044.                     true
  1045.                 );
  1046.              }
  1047.             $entityManager->persist($discussionMessage);
  1048.             $entityManager->flush();
  1049.             $discussionEntity->setCreatedAt(new \DateTime());
  1050.             $entityManager->flush();
  1051.             if ($discussionMessage->getReplyToMessage() !== null){
  1052.                $replyId $discussionMessage->getReplyToMessage()->getId();
  1053.                $replyContentArray = [
  1054.                     'id'=>$replyId,
  1055.                     'message_by'=>[
  1056.                         'id'=>$discussionMessage->getReplyToMessage()->getMessageBy()->getId(),
  1057.                         'first_name'=>$discussionMessage->getReplyToMessage()->getMessageBy()->getFirstName(),
  1058.                         'last_name'=>$discussionMessage->getReplyToMessage()->getMessageBy()->getLastName(),
  1059.                         'user_type'=>$discussionMessage->getReplyToMessage()->getMessageBy()->getUserType(),
  1060.                         'last_request_ts'=>$discussionMessage->getReplyToMessage()->getMessageBy()->getLastRequestTs()
  1061.                     ],
  1062.                     'message_for'=>[
  1063.                         'id'=>$discussionMessage->getReplyToMessage()->getMessageFor()->getId(),
  1064.                         'first_name'=>$discussionMessage->getReplyToMessage()->getMessageFor()->getFirstName(),
  1065.                         'last_name'=>$discussionMessage->getReplyToMessage()->getMessageFor()->getLastName(),
  1066.                         'user_type'=>$discussionMessage->getReplyToMessage()->getMessageFor()->getUserType(),
  1067.                         'last_request_ts'=>$discussionMessage->getReplyToMessage()->getMessageFor()->getLastRequestTs()
  1068.                     ],
  1069.                     'message'=>$discussionMessage->getReplyToMessage()->getMessage(),
  1070.                     'created_at'=>$discussionMessage->getReplyToMessage()->getCreatedAt()
  1071.                 ];
  1072.             }else{
  1073.                 $replyId ;
  1074.                 $replyContentArray = [];
  1075.             }
  1076.             $update = new Update(
  1077.                 'https://armsyschool.com/discussion/message/page/hub/'.$discussionEntity->getId(),
  1078.                 $serializer->serialize(['data'=>[
  1079.                     "id"=>$discussionMessage->getId(),
  1080.                     "message_by"=>[
  1081.                         'id'=>$discussionMessage->getMessageBy()->getId(),
  1082.                         'first_name'=>$discussionMessage->getMessageBy()->getFirstName(),
  1083.                         'last_name'=>$discussionMessage->getMessageBy()->getLastName(),
  1084.                         'user_type'=>$discussionMessage->getMessageBy()->getUserType(),
  1085.                         'last_request_ts'=>$discussionMessage->getMessageBy()->getLastRequestTs()
  1086.                     ],
  1087.                     "message_for"=>[
  1088.                         'id'=>$discussionMessage->getMessageFor()->getId(),
  1089.                         'first_name'=>$discussionMessage->getMessageFor()->getFirstName(),
  1090.                         'last_name'=>$discussionMessage->getMessageFor()->getLastName(),
  1091.                         'user_type'=>$discussionMessage->getMessageFor()->getUserType(),
  1092.                         'last_request_ts'=>$discussionMessage->getMessageFor()->getLastRequestTs()
  1093.                     ],
  1094.                     "is_read"=>$discussionMessage->isIsRead(),
  1095.                     'message'=>$discussionMessage->getMessage(),
  1096.                     "created_at"=>$discussionMessage->getCreatedAt(),
  1097.                     "reply_to_message"=>$replyContentArray
  1098.                 ]],'json')
  1099.             );
  1100.             $hub->publish($update);
  1101.             $update2 = new Update(
  1102.                 'https://armsyschool.com/discussion/list/page/hub/'.$discussionMessage->getMessageFor()->getId(),
  1103.                 $serializer->serialize(['update'=>true],'json')
  1104.             );
  1105.             $hub->publish($update2);
  1106.             $update3 =  new Update(
  1107.                 'https://armsyschool.com/discussion/list/page/hub/'.$discussionMessage->getMessageBy()->getId(),
  1108.                 $serializer->serialize(['update'=>true],'json')
  1109.             );
  1110.             $hub->publish($update3);
  1111.             //on envoie la notification apres que Mercure ait envoye le message et que le message n'est pas encore lu
  1112.             
  1113.             if ($discussionMessage->isIsRead() == false) {
  1114.                 
  1115.                 $destinataire $discussionMessage->getMessageFor();
  1116.                 $lang $destinataire->getLocalPhoneLang();
  1117.                 $token $destinataire->getUserToken();
  1118.                 $userId $destinataire->getId();
  1119.                 $author $discussionMessage->getMessageBy();
  1120.                 $route '/drawer/(tabs)/Calls';
  1121.                 if ($author->getUserType() == 'parent') {
  1122.                     $userType '(parent)';
  1123.                 } elseif ($author->getUserType() == 'prof') {
  1124.                     $userType '(enseignant ~ ' $discussionMessage->getDiscussion()->getClasse()->getName() . ')';
  1125.                 } else {
  1126.                     $userType '(admin)';
  1127.                 }
  1128.                 $title $destinataire->getFullName() . ' '$userType;
  1129.                 $message $discussionMessage->getReplyToMessage() ? $discussionMessage->getReplyToMessage()->getMessage() : $discussionMessage->getMessage();
  1130.                 $notification->sendNotification($token$title$message$route$userId);
  1131.             }
  1132.             return new JsonResponse(
  1133.                  $serializer->serialize(['message'=>'message has been added'],'json'),
  1134.                  Response::HTTP_OK,[],
  1135.                  true
  1136.              );
  1137.         }
  1138.         $message $discussionMessageRepository->findByMessageFrom($from,$discussionEntity);
  1139.         $messageIsReadUpdate $discussionMessageRepository->findBy(['discussion'=>$discussionEntity,'isRead'=>false,'messageFor'=>$this->getUser()]);
  1140.         foreach ($messageIsReadUpdate as $__value){
  1141.             $__value->setIsRead(true);
  1142.         }
  1143.         $entityManager->flush();
  1144.         $allMessageCount count($message);
  1145.         $getData = [
  1146.             'total_count' => $allMessageCount//$chatMessage->getTotalItemCount(),
  1147.             'me'=>$this->getUser(),
  1148.             'discussion_id'=>$discussionEntity->getId(),
  1149.             'data' =>$message /*$chatMessage->getItems()*/,
  1150.             
  1151.         ];
  1152.         $context SerializationContext::create()->setGroups(["getDiscussion"]);
  1153.         $jsonPost $serializer->serialize($getData'json'$context);
  1154.         return new JsonResponse($jsonPostResponse::HTTP_OK, ['accept' => 'application/json'], true);
  1155.         //dd($message);
  1156.     }
  1157.     /**
  1158.      * discussion message hub subscribe
  1159.      * @OA\Tag(name="Discussion")
  1160.      */
  1161.     #[Route(path'/api/discussion/{id}/message/mercure/hub'name'api_discussion_message_subscribe_mercure_hub'methods: ['GET'])]
  1162.     public function getParentSubscribeLateMercureHub($id,SerializerInterface $serializerEnvironment $twigUserRepository $userRepository):JsonResponse
  1163.     {
  1164.         $mercureHubSubscribeUrl "https://armsyschool.com/discussion/message/page/hub/".$id;
  1165.         try {
  1166.             $result $twig->render('mercure/client_hub_url.html.twig', [
  1167.                 'url' => $mercureHubSubscribeUrl
  1168.             ]);
  1169.         } catch (LoaderError|RuntimeError|SyntaxError $e) {
  1170.         }
  1171.         return new  JsonResponse($serializer->serialize([ 'mercure_client_hub_url'=>$result], 'json'),Response::HTTP_OK,['accept'=>'application/json'],true);
  1172.     }
  1173.     /**
  1174.      * discussion list update hub subscribe
  1175.      * @OA\Tag(name="Discussion")
  1176.      */
  1177.     #[Route(path'/api/discussion/list/user/mercure/hub'name'api_discussion_list_user_subscribe_mercure_hub'methods: ['GET'])]
  1178.     public function getDiscussionSubscribeLateMercureHub(SerializerInterface $serializerEnvironment $twigUserRepository $userRepository):JsonResponse
  1179.     {
  1180.         $id $this->getUser()->getId();
  1181.         $mercureHubSubscribeUrl "'https://armsyschool.com/discussion/list/page/hub/".$id;
  1182.         try {
  1183.             $result $twig->render('mercure/client_hub_url.html.twig', [
  1184.                 'url' => $mercureHubSubscribeUrl
  1185.             ]);
  1186.         } catch (LoaderError|RuntimeError|SyntaxError $e) {
  1187.         }
  1188.         return new  JsonResponse($serializer->serialize([ 'mercure_client_hub_url'=>$result], 'json'),Response::HTTP_OK,['accept'=>'application/json'],true);
  1189.     }
  1190.      /**
  1191.      * discussion notification
  1192.      * @OA\Tag(name="Discussion")
  1193.      */
  1194.     #[Route('api/discussion/notifications'name'api_discussion_notifications'methods: ['GET'])]
  1195.     public function notification(DiscussionMessageRepository $discussionMessageRepository,
  1196.      
  1197.         Request $request,
  1198.         NotificationsRepository $notificationsRepository,
  1199.         SerializerInterface $serializer): JsonResponse
  1200.     {
  1201.         $data $discussionMessageRepository->findBy(["messageFor"=>$this->getUser(),"isRead"=>false],['id'=>'DESC']);
  1202.         if (count($data)>0){
  1203.             return new JsonResponse(
  1204.                 $serializer->serialize(['title'=>'Messages',"message" =>'vous avez  'count($data)." message(s) non lu(s)" ],'json'),
  1205.                 Response::HTTP_OK,['accept'=>'application/json'],
  1206.                 true
  1207.             );
  1208.         }
  1209.         
  1210.         return new JsonResponse(nullResponse::HTTP_NO_CONTENT);
  1211.     }
  1212.     /**
  1213.      * discussion update notification
  1214.      * @OA\Tag(name="Discussion")
  1215.      */
  1216.     #[Route('api/discussion/notifications/update'name'api_discussion_notifications_update'methods: ['GET'])]
  1217.     public function notificationUpdate(DiscussionMessageRepository $discussionMessageRepository,
  1218.       Request $request,
  1219.       NotificationsRepository $notificationsRepository,
  1220.       SerializerInterface $serializer,
  1221.       EntityManagerInterface $entityManager
  1222.     ): JsonResponse
  1223.     {
  1224.         $data $discussionMessageRepository->findBy(["messageFor"=>$this->getUser(),"isRead"=>false],['id'=>'DESC']);
  1225.         if (count($data)>0){
  1226.             foreach ($data as $value){
  1227.                 $value->setIsRead(1);
  1228.             }
  1229.             $entityManager->flush();
  1230.         }
  1231.         return new JsonResponse(nullResponse::HTTP_NO_CONTENT);
  1232.     }
  1233.      /**
  1234.      * discussion message update content
  1235.      * @OA\Tag(name="Discussion")
  1236.      */
  1237.     #[Route('api/discussion/{id}/message/update/last/count/{totalItem}'name'api_discussion_message_update'methods: ['GET'])]
  1238.     public function discussionUpdateContent(DiscussionMessageRepository $discussionMessageRepository,
  1239.         $id,
  1240.         $totalItem,
  1241.         Request $request,
  1242.         EntityManagerInterface $entityManager,
  1243.         DiscussionRepository $discussionRepository,
  1244.         NotificationsRepository $notificationsRepository,
  1245.         SerializerInterface $serializer): JsonResponse
  1246.     {
  1247.         $discussion $discussionRepository->findOneBy(['id'=>$id],[]);
  1248.         
  1249.         $data $discussionMessageRepository->findBy(["discussion"=>$discussion],['id'=>'DESC']);
  1250.         $newCount count($data);
  1251.         $prevCount = (int)$totalItem;
  1252.         
  1253.         $countRapport $newCount-$prevCount;
  1254.         if($newCount>$prevCount){
  1255.             $message $discussionMessageRepository->findBy(["discussion"=>$discussion],[],$countRapport,$prevCount);
  1256.             $messageIsReadUpdate $discussionMessageRepository->findBy(['discussion'=>$discussion,'isRead'=>false,'messageFor'=>$this->getUser()]);
  1257.             foreach ($messageIsReadUpdate as $__value){
  1258.                 $__value->setIsRead(true);
  1259.             }
  1260.             $entityManager->flush();
  1261.             $getData = [
  1262.                 //'current_page_number' => $chatMessage->getCurrentPageNumber(),
  1263.                 //'number_per_page' => $chatMessage->getItemNumberPerPage(),
  1264.                 'total_count' => $newCount//$chatMessage->getTotalItemCount(),
  1265.                 //'me'=>$this->getUser(),
  1266.                 'data' =>$message /*$chatMessage->getItems()*/,
  1267.                 
  1268.             ];
  1269.     
  1270.             $context SerializationContext::create()->setGroups(["getDiscussion"]);
  1271.             $jsonPost $serializer->serialize($getData'json'$context);
  1272.     
  1273.             return new JsonResponse($jsonPostResponse::HTTP_OK, ['accept' => 'application/json'], true);
  1274.         }
  1275.     
  1276.         return new JsonResponse(nullResponse::HTTP_NO_CONTENT);
  1277.     }
  1278. }