src/Controller/SycMessagesAndPlanning.php line 114

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\FileMessage;
  4. use App\Entity\FileMission;
  5. use App\Entity\Message;
  6. use App\Entity\User;
  7. use App\Entity\MessageReaction;
  8. use App\Entity\DiscussionGroup;
  9. use Symfony\Component\Uid\Uuid;
  10. use App\Entity\GroupMessage;
  11. use App\Entity\Mission;
  12. use App\Entity\WorkflowStep;
  13. use App\Form\GroupMessageType;
  14. use App\Entity\Campaign;
  15. use App\Enum\AdminMail;
  16. use App\Enum\Role;
  17. use App\Event\User\UserReactionEvent;
  18. use Symfony\Component\Serializer\SerializerInterface;
  19. use App\Form\MessageType;
  20. use App\Form\MissionParticipantDelaisType;
  21. use App\Repository\MessageReactionRepository;
  22. use App\Repository\MessageRepository;
  23. use App\Repository\MissionRepository;
  24. use App\Repository\UserRepository;
  25. use App\Repository\WorkflowStepRepository;
  26. use App\Repository\CampaignRepository;
  27. use App\Repository\FileMessageRepository;
  28. use App\Repository\MissionParticipantRepository;
  29. use App\Service\MessageService;
  30. use App\Service\NotificationService;
  31. use Doctrine\ORM\EntityManagerInterface;
  32. use Psr\Log\LoggerInterface;
  33. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  34. use Symfony\Component\Filesystem\Filesystem;
  35. use Symfony\Component\HttpFoundation\JsonResponse;
  36. use Symfony\Component\HttpFoundation\Request;
  37. use Symfony\Component\HttpFoundation\Response;
  38. use Symfony\Component\Routing\Annotation\Route;
  39. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  40. use Symfony\Component\Mime\Address;
  41. use Twig\Environment;
  42. use App\Service\GoogleStorageService;
  43. use App\Service\MissionParticipantService;
  44. use App\Service\PriceService;
  45. use App\Service\ChatService;
  46. use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
  47. use App\EventSubscriber\GroupeMessageSubscriber;
  48. use App\Event\Chat\GroupedMessageSentEvent;
  49. use VSC\API\FileHandler;
  50. use App\Event\VirusCamp\VirusCampEvent;
  51. use App\Event\VirusCamp\FileInfectedEvent;
  52. #[Route('/messages'name'messages')]
  53. class SycMessagesAndPlanning extends AbstractController
  54. {
  55.     public function __construct(
  56.         private Environment $twig,
  57.         private EntityManagerInterface $entityManagerInterface,
  58.         private Filesystem $filesystem,
  59.         private MessageService $messageService,
  60.         private LoggerInterface $logger,
  61.         private MessageRepository $messageRepository,
  62.         private MessageReactionRepository $messageReactionRepository,
  63.         private EventDispatcherInterface $dispatcher,
  64.         private NotificationService $notificationService,
  65.         private MissionParticipantService $missionParticipantService,
  66.         private UserRepository $userRepository,
  67.         private GoogleStorageService $googleStorageService,
  68.         private MissionParticipantRepository $missionParticipantRepository,
  69.         private PriceService $priceService,
  70.         private ChatService $chatService,
  71.         private SerializerInterface $serializer,
  72.     ) {
  73.     }
  74.     #[Route('/update/user-who-read/{lastIdMessage}'name'user_who_read')]
  75.     public function userWhoReadUpdate(Request $request,FileMessageRepository $fileMessageRepository,  MissionRepository $missionRepositorystring $lastIdMessageMessageRepository $messageRepository,UserRepository $userRepository)
  76.     {
  77.         $lastIdMessage preg_replace("/message/"""$lastIdMessage);
  78.         $message $messageRepository->findOneBy(['id' => $lastIdMessage]);
  79.         $groupMessageId $request->query->get('group-message-id');
  80.         $missionId $request->query->get('mission-id');
  81.         $mission $missionRepository->findOneBy(["id" => $missionId]);
  82.         $group null;
  83.         if (null !== $groupMessageId) {
  84.             $group $this->entityManagerInterface->getRepository(DiscussionGroup::class)->find($groupMessageId);
  85.         }
  86.         $this->chatService->publishMessageNotificationCampaign(
  87.             $mission->getId(),
  88.             [
  89.                 'message' => [],
  90.                 'html' => "",
  91.                 'type' => 'insert',
  92.                 'planning' => "",
  93.                 'currentUser' => $this->getUser()->getId(),
  94.             ],
  95.             $group
  96.         );
  97.         return new JsonResponse([
  98.                 'status' => "ok",
  99.             ]);
  100.     }
  101.     #[Route('/last/{lastIdMessage}-{nbMessage}'name'last')]
  102.     public function lastMessages(Request $request,FileMessageRepository $fileMessageRepository,  MissionRepository $missionRepositorystring $lastIdMessageMessageRepository $messageRepository,UserRepository $userRepository$nbMessage 10)
  103.     {
  104.         if ($this->getUser() == null) {
  105.             return new JsonResponse([
  106.                 'status' => "KO",
  107.             ], Response::HTTP_UNAUTHORIZED);
  108.         }
  109.         $unredMessage $request->query->get('unred-message');
  110.         $missionId $request->query->get('mission-id');
  111.         $currentRouteName=$request->query->get('current-route-name');
  112.         $estimatedIncome $request->query->get('estimatedIncome');
  113.         $timeZone $request->query->get('time-zone');
  114.         $groupMessageId $request->query->get('group-message-id');
  115.         $keyword $request->query->get('keyword');
  116.         $ids $request->query->get('ids');
  117.        
  118.         $group null;
  119.         if (null !== $groupMessageId) {
  120.             $group $this->entityManagerInterface->getRepository(DiscussionGroup::class)->find($groupMessageId);
  121.         }
  122.         $dateOffSetHour floatval($request->query->get('date-offset-hour'));
  123.         $isLoadMore $request->query->get('is-load-more'); 
  124.         $lastIdMessage preg_replace("/message/"""$lastIdMessage);
  125.         $messageIdsDeleted = [] ; 
  126.         $fileMessageIdsDeleted = []; 
  127.         $messagesEditing = []; 
  128.         $messagesWithReactions = []; 
  129.        
  130.         $mission $missionRepository->findOneBy(["id" => $missionId]);
  131.         //special requete pour voir les prochain message contenant les keywords peut alterer donc le nombre limite des messages a affiché.
  132.         $dateLastMessageForSearchWord '';
  133.         $idLastMessageGet '';
  134.         if (!empty($keyword)) {
  135.             $nextMessageDate $messageRepository->getNextMessageWithCritarea($mission->getCampaign(),$group,$keyword,json_decode($ids));
  136.             if (!is_null($nextMessageDate)) {
  137.                 $dateLastMessageForSearchWord $nextMessageDate['createdAt'];
  138.                 $idLastMessageGet $nextMessageDate['idMessage'];
  139.             }
  140.             
  141.         }
  142.         //$countNbMessge = $this->entityManagerInterface->getRepository
  143.         //fin special requete 
  144.         $idLastMessageToGetinSearch null;
  145.         $listOfUserTyping $this->messageService->getUserTypingWithoutCurrentUser($mission);
  146.         $userTypingWithDuration $this->messageService->calculaTimeTypingOfEachUser($listOfUserTyping);
  147.         if(is_null($userTypingWithDuration)){
  148.             $userTypingWithDuration = [];
  149.         }
  150.         $message $messageRepository->findOneBy(['id' => $lastIdMessage]);
  151.         $nbMessageAfterSearch null;
  152.         if ($mission != null) {
  153.             if($isLoadMore == "true" || $message == null){
  154.                 $listLastMessage $messageRepository->getAllMessage($mission->getCampaign(),$nbMessage,$group,$dateLastMessageForSearchWord,$this->getUser());
  155.                   if (!empty($keyword)) {//pour la recherche 
  156.                     $nbMessageAfterSearch count($listLastMessage);
  157.                  }
  158.             }
  159.             else{
  160.                 $listLastMessage =$messageRepository->findLastMessage($mission->getCampaign(), $message->getCreatedAt(),$group,$this->getUser());
  161.                 $messageIdsDeleted $messageRepository->findIdsMessageDeleted($mission->getCampaign(),$group,$this->getUser()) ; 
  162.                 $fileMessageIdsDeleted $fileMessageRepository->findIdsFileMessageDeleted($mission->getCampaign());
  163.                 $messagesEditing$messageRepository->findMessagesEditing($mission->getCampaign(),$group,$this->getUser()) ; 
  164.                 $messagesWithReactions$messageRepository->findMessageWithReaction($mission->getCampaign(),$group,$this->getUser()) ; 
  165.             }
  166.             $nbAllMessage $messageRepository->nbAllMessage($mission->getCampaign(),$group,$this->getUser())['nb'];
  167.             
  168.          
  169.                 usort($listLastMessage, function($a$b) {
  170.                     $dateA = ($a->getCreatedAt()->getTimestamp());
  171.                     $dateB = ($b->getCreatedAt()->getTimestamp());
  172.                     return   $dateA $dateB 
  173.                 });
  174.             //pour la recherche 
  175.             if (!empty($keyword)) {
  176.                $idLastMessageToGetinSearch $listLastMessage[0]?->getId();
  177.             }
  178.             $missionParticipant null;
  179.             foreach ($mission->getParticipants() as $participant) {
  180.                 if ($participant->getUser()->getId() == $this->getUser()->getId()) {
  181.                     $missionParticipant $participant;
  182.                 }
  183.             }
  184.             $lastTenMessages $messageRepository->getLastTenMessages($mission->getCampaign(),$group,$this->getUser()); 
  185.             $listIdsLastMessage $this->getIdsMessage($lastTenMessages); 
  186.             $futuresActions $this->missionParticipantService->getUniqByFutureActions($mission->getCampaign()->getId(),$this->getUser()->getId()); 
  187.             return new JsonResponse([
  188.                 "status" => "ok",
  189.                 "nbMessageAfterSearch" => $nbMessageAfterSearch,
  190.                 "html" => $this->getHtmlToRenderInView(mission$missionlistLastMessage$listLastMessagetimeZone$timeZonedateOffSetHour$dateOffSetHourunredMessage$unredMessage,nbAllMessage$nbAllMessage,group:$group),
  191.                 "lists_last_message_id"=>$listIdsLastMessage['message_ids'],
  192.                 "lists_last_file_message_id"=>$listIdsLastMessage['file_message_ids'],
  193.                 "planning" => $this->twig->render("mission/_planning_item.html.twig", [
  194.                     "mission" => $mission,
  195.                     "campaign" => $mission->getCampaign(),
  196.                     "userConnected" => $this->getUser(),
  197.                     "missionParticipant" => $missionParticipant,
  198.                 ]),
  199.                 "list_user_read_last_message"=>$this->userReadLastMessage($messageRepository->findOneBy(['campaign' => $mission->getCampaign()], ['createdAt' => 'DESC'])), 
  200.                 "message_deleted_ids"=> $messageIdsDeleted,
  201.                 'user_typing' => $this->getUserTypingMessage($userTypingWithDuration), 
  202.                 "file_message_deleted_ids"=> $fileMessageIdsDeleted
  203.                 "messages_editing"=>$messagesEditing,
  204.                 "messages_with_reactions"=>$this->getElementReactions($messagesWithReactions),
  205.                 "futureActions" =>  $this->getHtmlFutureActions($mission$futuresActions$currentRouteName$estimatedIncome),
  206.                 "idLastMessage" => $idLastMessageGet,
  207.                 "idLastMessageToGetinSearch" => $idLastMessageToGetinSearch,
  208.             ]);
  209.         }
  210.         // $this->sendEmailError('-', '-', 'L\'id de la mission est null');
  211.         return new JsonResponse(["status" => "ko"], 200);
  212.     }
  213.     #[Route('/count-all-message-correspondence'name'count_all_search_message_correspondence')]
  214.     public function countAllSearchMessageCorrespondence(Request $request,FileMessageRepository $fileMessageRepository,  MissionRepository $missionRepositoryMessageRepository $messageRepository,UserRepository $userRepository){
  215.         $groupId $request->query->get('groupId');
  216.         $missionId $request->query->get('missionId');
  217.         $search $request->query->get('search');
  218.         $mission $missionRepository->findOneBy(criteria: ["id" => $missionId]);
  219.         $group null;
  220.         if (!empty($groupId) && !is_null($groupId)) {
  221.             $group $this->entityManagerInterface->getRepository(DiscussionGroup::class)->find($groupId);
  222.         }
  223.         $listLastMessage $messageRepository->getAllMessageWithCritarea($mission->getCampaign(),$group,$search);
  224.         return new JsonResponse([
  225.             'status' => "ok",
  226.             'nb' => count($listLastMessage)
  227.         ]);
  228.     }
  229.     #[Route('/delete/{id}'name'detele_message'methods: ['POST'])]
  230.     public function deleteMessages(Message $message,Request $request)
  231.     {
  232.         $groupId $request->query->get('groupId');
  233.         $group null;
  234.         if (!empty($groupId) && !is_null($groupId)) {
  235.             $group $this->entityManagerInterface->getRepository(DiscussionGroup::class)->find($groupId);
  236.         }
  237.         if ($message->getUser()->getId() == $this->getUser()->getId() || $this->isGranted('ROLE_ADMIN')) {
  238.             $message->setIsDeleted(true);
  239.             $this->entityManagerInterface->flush();
  240.             //ecoute de suppression
  241.             $this->chatService->publishMessageNotificationCampaign($message->getMission()->getId(),['message'=>$message->getId(),'type'=>'deleted'],$group);
  242.             //fin ecoute
  243.              $this->chatService->publishNotificationMessageUnread("message-send-end-not-read", [
  244.                 "message" => "",
  245.                 'idMission' => $message->getMission()->getId(),
  246.                 'group' => !is_null($group) ? $group->getId() : "",
  247.                 'type' => 'message-unread'
  248.             ]);
  249.             return new JsonResponse([
  250.                 'status' => "ok"
  251.             ]);
  252.         }
  253.         return new JsonResponse(['status' => "ko"Response::HTTP_UNAUTHORIZED]);
  254.     }
  255.     #[Route('/delete/file/{id}'name'detele_file_message'methods: ['POST'])]
  256.     public function deleteFileMessages(FileMessage $fileMessageGoogleStorageService $googleStorageService,Request $request)
  257.     {
  258.         $groupId $request->query->get('groupId');
  259.         $group null;
  260.         if (!empty($groupId) && !is_null($groupId)) {
  261.             $group $this->entityManagerInterface->getRepository(DiscussionGroup::class)->find($groupId);
  262.         }
  263.         if ($fileMessage->getMessages()->getUser()->getId() == $this->getUser()->getId() || $this->isGranted('ROLE_ADMIN')) {
  264.             $message $fileMessage->getMessages();
  265.             //delete file if in storage
  266.             $company $message->getCampaign()->getCompany();
  267.             $campaign $message->getCampaign();
  268.             $bucketName "company-" strtolower($company->getId());
  269.             $fileName "Campaigns/" $campaign->getId() . "/" $fileMessage->getName();
  270.             //end delete in google storage
  271.             $fileMessage->setIsDeleted(true);
  272.             $this->entityManagerInterface->flush();
  273.             $file $this->messageService->getFileMissionUrl($fileMessage->getMessages()->getMission(), $fileMessage->getName());
  274.             if ($message->getContent() == null && $fileMessage->getMessages()->getFileMessages()!=null && $this->messageService->allFileMessageIsDeleted($fileMessage->getMessages())) {
  275.                 $message->setIsDeleted(true);
  276.                 $this->entityManagerInterface->flush();
  277.             }
  278.             try {
  279.                 $this->filesystem->remove($file);
  280.             } catch (\Throwable $th) {
  281.                 $this->logger->error("can't delete file in $file");
  282.             }
  283.             $googleStorageService->deleteFile($bucketName$fileName);
  284.             //ecoute de suppression fichier message
  285.             $this->chatService->publishMessageNotificationCampaign($message->getMission()->getId(),['message'=>$message->getId(),'type'=>'deleted'],$group);
  286.             $this->chatService->publishNotificationMessageUnread("message-send-end-not-read", [
  287.                 "message" => "",
  288.                 'idMission' => $campaign->getMissions()->first()->getId(),
  289.                 'group' => !is_null($group) ? $group->getId() : "",
  290.                 'type' => 'message-unread'
  291.             ]);
  292.             //fin ecoute
  293.             return new JsonResponse([
  294.                 'status' => "ok"
  295.             ]);
  296.         }
  297.         return new JsonResponse(['status' => "ko"Response::HTTP_UNAUTHORIZED]);
  298.     }
  299.     #[Route('/emoji/toggle/{id}'name'toggle_emoji_reaction'methods: ['POST''GET'])]
  300.     public function toggleEmojiReaction(Message $messageRequest $request): JsonResponse
  301.     {
  302.         $groupId $request->query->get('groupId');
  303.         $group null;
  304.         if (!empty($groupId) && !is_null($groupId)) {
  305.             $group $this->entityManagerInterface->getRepository(DiscussionGroup::class)->find($groupId);
  306.         }
  307.         $user $this->getUser();
  308.         if ($user != null) {
  309.             $emoji $request->request->get('emoji');
  310.             $emojiId $request->request->get('emojiId');
  311.             $campaignOfMessage $message->getCampaign();
  312.             $messageReaction $this->messageReactionRepository->findReactionByUser(messageId$message->getId(), userId$user->getId(), emojiId$emojiId);
  313.             if ($messageReaction != null) {
  314.                 $message->removeMessageReaction($messageReaction[0]);
  315.                 $this->entityManagerInterface->remove($messageReaction[0]);
  316.                 $this->entityManagerInterface->flush();
  317.             } else {
  318.                 $newReaction = new MessageReaction();
  319.                 $newReaction->setEmoji($emoji);
  320.                 $newReaction->setUser($user);
  321.                 $newReaction->setEmojiId(intval($emojiId));
  322.                 $newReaction->setMessage($message);
  323.                 $message->addMessageReaction($newReaction);
  324.                 $this->entityManagerInterface->persist($newReaction);
  325.                 $this->entityManagerInterface->flush();
  326.                 $event = new UserReactionEvent($message->getUser(), $this->getUser(), $message$newReaction->getEmoji(),$campaignOfMessage);
  327.                 $this->dispatcher->dispatch($eventUserReactionEvent::NAME);
  328.             }
  329.             $mission $message->getMission();
  330.             $renderContent $this->chatService->getHtmlContentToRenderInViewForLastMessage($mission,$message,0);
  331.             $this->chatService->publishMessageNotificationCampaign(
  332.                 $mission->getId(),
  333.                 [
  334.                     'message'=>$this->serializer->normalize($messagenull, [AbstractNormalizer::GROUPS => ['message_read']]),
  335.                     'html'=>$renderContent,
  336.                     'type'=>'update',
  337.                     
  338.                 ],$group);
  339.             return new JsonResponse([
  340.                 'status' => "ok",
  341.                 'id_user' => $user->getId()
  342.             ]);
  343.         }
  344.         return new JsonResponse(['status' => "ko"Response::HTTP_UNAUTHORIZED]);
  345.     }
  346.     #[Route('/send/error'name'send_error'methods: ['POST'])]
  347.     public function sendError(Request $request)
  348.     {
  349.         $this->messageService->sendEmailError($request->request->get('xhr'), $request->request->get('type'), $request->request->get('message'));
  350.         return new JsonResponse([]);
  351.     }
  352.     #[Route('/get/user/who/read/{id}'name'_get_message_user_who_read'methods: ['GET'])]
  353.     public function whoRead(Message $messageRequest $requestMessageRepository $messageRepository)
  354.     {
  355.         $userIdsread $this->messageService->getBullUsersWhoReadMessage($message);
  356.         $userIdsData = [];
  357.         foreach ($userIdsread as $user) {
  358.             $userIdsData[] = $user->getId();
  359.         }
  360.         return new JsonResponse([
  361.             'status' => 'ok',
  362.             'userWhoReadIds' => $userIdsData,
  363.             "messageId" => $message->getId(),
  364.             'userId' => $request->query->get('currentUserId'),
  365.             'renderUserWhoRead' => $this->chatService->userWhoRead($message)
  366.         ]);
  367.     }
  368.     #[Route('/get/message/by/user/{idUser}/{idMessage}/{dateOffsetHour}'name'_get_message_for_user_by_id'methods: ['GET'])]
  369.     public function getMessageByUser($idUser$idMessage,$dateOffsetHourRequest $requestMessageRepository $messageRepository)
  370.     {
  371.         $groupId $request->query->get('groupId');
  372.         $group null;
  373.         if (!empty($groupId) && !is_null($groupId)) {
  374.             $group $this->entityManagerInterface->getRepository(DiscussionGroup::class)->find($groupId);
  375.         }
  376.         $entityManager $this->getDoctrine()->getManager();
  377.         $user $entityManager->getRepository(User::class)->find($idUser);
  378.         $dateOffSetHour floatval($request->query->get('date-offset-hour'));
  379.         $entityManager->flush();
  380.         $message $entityManager->getRepository(Message::class)->find($idMessage);
  381.         $listUserWhoRead $message?->getUserListWhoRead();
  382.         $listUserWhoRead[] = $user->getId();
  383.         $message->setUserListWhoRead($listUserWhoRead);
  384.         $entityManager $this->getDoctrine()->getManager();
  385.         $entityManager->persist($message);
  386.         $entityManager->flush();
  387.         $html $this->twig->render("mission/_chat_by_item_for_listener.html.twig", [
  388.             "message" => $message,
  389.             "mission" => $message->getMission(),
  390.             "date_off_setHour" => abs($dateOffsetHour),
  391.             "user" => $user
  392.         ]);
  393.         //mise a jour bloc user who read
  394.          $this->chatService->publishMessageNotificationCampaign(
  395.             $message->getCampaign()->getMissions()->first()->getId(),
  396.             [
  397.                 'message' => $this->serializer->normalize($messagenull, [AbstractNormalizer::GROUPS => ['message_read']]),
  398.                 'type' => "userWhoRead",
  399.                 'userId' => $user->getId(),
  400.             ],
  401.             $group
  402.         );
  403.         //fin mise a jour 
  404.          //end notification
  405.         return new JsonResponse([
  406.             'status' => 'ok',
  407.             'htmlRender'=> $html,
  408.             "message" => $message,
  409.             'planningRender' => $this->chatService->getHtmlToRenderPlanningByUser($user,$message->getMission()),
  410.             'renderUserWhoRead' => $this->chatService->userWhoRead($message)
  411.         ]);
  412.     }
  413.     #[Route('/add_group/{id}'name'_add_group'methods: ['POST'])]
  414.     public function addGroupedMessage(Request $requestMission $missionMessageRepository $messageRepository)
  415.     {
  416.         $group = new DiscussionGroup();
  417.          $entityManager $this->getDoctrine()->getManager();
  418.          $formCreatedGroup $this->createForm(GroupMessageType::class, $group, ['listUser' => $mission->getCampaign()->getAllUserInCampaing()]);
  419.          $formCreatedGroup->handleRequest($request);
  420.         if ($formCreatedGroup->isSubmitted() && $formCreatedGroup->isValid()) {
  421.             $id Uuid::v4()->toBase58();
  422.             $group $formCreatedGroup->getData(); 
  423.             $group->setId($id);
  424.             $group->setCreatedBy($this->getUser());
  425.             $group->setCampaign($mission->getCampaign());
  426.             $entityManager $this->getDoctrine()->getManager();
  427.             
  428.             $group->addUser($this->getUser());
  429.             $entityManager->persist($group);
  430.             $entityManager->flush();
  431.             //envoyer des message au utilisateur du groupe
  432.             foreach ($group->getUsers() as $user) {
  433.                 if ($this->getUser()->getId() != $user->getId()) {
  434.                     $userInstance $entityManager->getRepository(User::class)->find($user->getId());
  435.                     
  436.                     $event = new GroupedMessageSentEvent($group,$userInstance);
  437.                     $this->dispatcher->dispatch($eventGroupedMessageSentEvent::NAME);
  438.                 }
  439.             }
  440.             //fin envoie de messag
  441.             $this->chatService->publishOnDiscussionGroupUpdate('add',$group);
  442.             
  443.             $this->addFlash(
  444.                 type'success',
  445.                 message"Groupe créé avec succès !",
  446.             ); 
  447.             //redirection vers la page list mission avec message de confirmation
  448.             return $this->redirectToRoute('mission_discussion_group', ['id' => $mission->getCampaign()->getMissions()?->first()?->getId(),'groupId'=>$group->getId()], Response::HTTP_SEE_OTHER);
  449.         }
  450.         $this->addFlash(
  451.                 type'error',
  452.                 message"Erreur lors de la création du groupe",
  453.             ); 
  454.         return $this->redirectToRoute('mission_edit', ['id' => $mission->getCampaign()->getMissionsWithoutEspaceDeDiscussion()?->first()?->getId()], Response::HTTP_SEE_OTHER);
  455.     }
  456.     #[Route('/add/{id}'name'_add'methods: ['POST'])]
  457.     public function addMessage(Request $requestMission $missionMessageRepository $messageRepository)
  458.     {
  459.         $message = new Message();
  460.         $typeMessage "insert";
  461.         $entityManager $this->getDoctrine()->getManager();
  462.         $path 'file_message_directory';
  463.         $form $this->createForm(MessageType::class, $message);
  464.         $form->handleRequest($request);
  465.         $error_id_message $request->query->get('error_id_message'null);
  466.         $dateOffSetHour floatval($request->query->get('date-offset-hour'));
  467.         $groupId $request->query->get('groupId');
  468.         $group null;
  469.         if (!empty($groupId) && !is_null($groupId)) {
  470.             $group $entityManager->getRepository(DiscussionGroup::class)->find($groupId);
  471.         }
  472.         $messageInsered $messageRepository->findOneBy(['id' => $error_id_message]);
  473.         if ($form->isSubmitted() && $form->isValid() && $messageInsered == null or ($path 'file_message_directory')) {
  474.             $errorMessage "";
  475.             $errorCode 200;
  476.             try {
  477.                 $idMessage $request->query->get('id-message');
  478.                 $replyTo $request->query->get('id-reply-message');
  479.                 if ($idMessage != "") {
  480.                     $typeMessage "update";
  481.                     $messagePersisted $messageRepository->findOneBy(['id' => $idMessage]);
  482.                     $messagePersisted->setIsModified(true);
  483.                     $messagePersisted->setContent($message->getContent(), false);
  484.                     $message $messagePersisted;
  485.                 } else {
  486.                     $message->setUser($this->getUser())
  487.                         ->setCampaign($mission->getCampaign())
  488.                         ->setMission(mission$mission)
  489.                         ->setUserListWhoRead([$this->getUser()->getId()])
  490.                         ->setOriginalContent($message->getContent());
  491.                         ;
  492.                     if (!is_null($group)) {
  493.                         $message->setDiscussionGroup($group);
  494.                     }
  495.                     $entityManager->persist($message);
  496.                 }
  497.                 if ($replyTo != "") {
  498.                     $replyedMessage $messageRepository->findOneBy(['id' => $replyTo]);
  499.                     $message->setReplyToWithMessage($replyedMessage);
  500.                 }
  501.                  $entityManager->persist($message);
  502.                  $entityManager->flush();
  503.                
  504.                 $this->messageService->sendEmailForParticipantMentionedInTchat($mission$message);
  505.                 // Publication des notifications
  506.                 $renderPlanning $this->chatService->getHtmlToRenderPlanning($mission);
  507.                 $timezone = new \DateTimeZone(date_default_timezone_get());
  508.                 $utcCokkieInDays $request->cookies->get('utcCokkieInDays');
  509.     
  510.                 if ($utcCokkieInDays) {
  511.                    $offsetInHours $utcCokkieInDays;
  512.                 }else{
  513.                     $offsetInHours 0;
  514.                 }
  515.                
  516.                 $this->chatService->publishMessageNotificationCampaign(
  517.                     $mission->getId(),
  518.                     [
  519.                         'message' => $this->serializer->normalize($messagenull, [AbstractNormalizer::GROUPS => ['message_read']]),
  520.                         'html' => $this->chatService->getHtmlToRenderInViewForLastMessage($mission$message$offsetInHours),
  521.                         'type' => $typeMessage,
  522.                         'planning' => $renderPlanning,
  523.                         'currentUser' => $this->getUser()->getId(),
  524.                     ],
  525.                     $group
  526.                 );
  527.                 $this->chatService->publishNotificationMessageUnread("message-send-end-not-read", [
  528.                     "message" => "",
  529.                     'idMission' => $mission->getId(),
  530.                     'group' => !is_null($group) ? $group->getId() : "",
  531.                     'type' => 'message-unread'
  532.                 ]);
  533.                 $drapDrop $request->query->get('drag-drop');
  534.                 $files = !is_null($request->query->get('drag-drop')) && $request->query->get('drag-drop') == 
  535.                     $request->files->get('file'
  536.                     : $form->get('fileMessages')->getData();
  537.                
  538.                 // Vérification des fichiers
  539.                 if (!empty($files) && sizeof($files) > 0) {
  540.                     foreach ($files as $file) {
  541.                         // Création d'un nouveau message pour chaque fichier
  542.                         $newMessage = new Message();
  543.                         $newMessage->setUser($this->getUser())
  544.                             ->setCampaign($mission->getCampaign())
  545.                             ->setMission($mission)
  546.                             ->setUserListWhoRead([$this->getUser()->getId()])
  547.                             ->setOriginalContent($message->getContent());
  548.                         
  549.                         if (!is_null($group)) {
  550.                             $newMessage->setDiscussionGroup($group);
  551.                         }
  552.                         
  553.                         // Traitement du fichier
  554.                         $nameSplitByDot explode('.'$file->getClientOriginalName());
  555.                         $extension $nameSplitByDot != null && sizeof($nameSplitByDot) > end($nameSplitByDot) : $file->guessExtension();
  556.                         $type preg_replace('/\/[a-zA-Z-_,.]*\s?/'""$file->getMimeType());
  557.                         $nameUniqueCompany strtolower("company-" $mission->getCampaign()->getCompany()->getId());
  558.                         $destination $this->getParameter($path) . '/' $mission->getId() . '/message';
  559.                         $originalFilename pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
  560.                         $newFilename $originalFilename '-' uniqid() . '.' $extension;
  561.                         
  562.                         // Upload du fichier
  563.                         $this->googleStorageService->uploadFile($nameUniqueCompany$file$newFilename'Campaigns/' $mission->getCampaign()->getId());
  564.                         
  565.                         // Création de l'objet FileMessage
  566.                         $fileMessage = new FileMessage();
  567.                         $fileMessage->setName($newFilename);
  568.                         $fileMessage->setIsNew(1);
  569.                         $fileMessage->setType($type);
  570.                         $fileMessage->setIsNotInfected(true);
  571.                         $newMessage->addFileMessage($fileMessage);
  572.                         // Persister le message
  573.                         $entityManager->persist($newMessage);
  574.                         // Notification par email pour les mentions dans le tchat
  575.                         $this->messageService->sendEmailForParticipantMentionedInTchat($mission$newMessage);
  576.                         // Publication des notifications
  577.                         $renderPlanning $this->chatService->getHtmlToRenderPlanning($mission);
  578.                         $this->chatService->publishMessageNotificationCampaign(
  579.                             $mission->getId(),
  580.                             [
  581.                                 'message' => $this->serializer->normalize($newMessagenull, [AbstractNormalizer::GROUPS => ['message_read']]),
  582.                                 'html' => $this->chatService->getHtmlToRenderInViewForLastMessage($mission$newMessage$offsetInHours),
  583.                                 'type' => $typeMessage,
  584.                                 'planning' => $renderPlanning,
  585.                                 'currentUser' => $this->getUser()->getId(),
  586.                             ],
  587.                             $group
  588.                         );
  589.                         $this->chatService->publishNotificationMessageUnread("message-send-end-not-read", [
  590.                             "message" => "",
  591.                             'idMission' => $mission->getId(),
  592.                             'group' => !is_null($group) ? $group->getId() : "",
  593.                             'type' => 'message-unread'
  594.                         ]);
  595.                     }
  596.                     $entityManager->flush();
  597.                 }else {
  598.                     $errorMessage "Empty content or no files provided.";
  599.                 }
  600.             } catch (\Throwable $e) {
  601.                 $errorMessage "Throwable: " $e->getMessage();
  602.                 $errorCode 500;
  603.                 $this->messageService->sendEmailError('exception'$e->getMessage(), "message : {$message->getContent()}  mission : {$mission->getId()}");
  604.             }
  605.             return new JsonResponse([
  606.                 'status' => $errorMessage == "" 'ok' 'ko',
  607.                 'message_id' => $message->getId(),
  608.                 'message' => $errorMessage == "" 'Enregistré avec succès' $errorMessage,
  609.             ], $errorCode);
  610.         }
  611.         return new JsonResponse([
  612.             'status' => 'ko',
  613.             'message_id' => $message->getId(),
  614.             'message' => 'Formulaire invalide',
  615.         ], Response::HTTP_UNAUTHORIZED);
  616.     }
  617.     #[Route('/verify/virus-camp/file'name'_verify_virus_camp_file'methods: ['POST'])]
  618.     public function verifyFile(Request $request){
  619.         //new file
  620.          $fileHandler = new FileHandler;
  621.          $errorGetInScan = [];
  622.          if (!empty($_FILES)) {
  623.              foreach ($_FILES as $file) {
  624.                  $result $fileHandler->resultsScan($file,"input");
  625.                  if (!empty($result)) {
  626.                     $errorGetInScan[$file['name']] = ['result'=>$result];
  627.                  }
  628.              }
  629.          }
  630.          if (!empty($errorGetInScan) and $this->getUser()!= null) {
  631.              $event = new VirusCampEvent($this->getUser(),$errorGetInScan ,null);
  632.              $this->dispatcher->dispatch($eventVirusCampEvent::NAME);
  633.          }
  634.         
  635.          return new JsonResponse([
  636.             'status' => 'ok',
  637.             'errorGetInScan' => $errorGetInScan
  638.         ]);
  639.     }
  640.     #[Route('/verify/virus-camp/link'name'_verify_virus_camp_link'methods: ['GET'])]
  641.     public function verifyLink(Request $request,EntityManagerInterface $entityManager){
  642.          //old file
  643.         $fileHandler = new FileHandler;
  644.         $errorGetInScan = [];
  645.         $fileLink $request->query->get('fileUrl'); 
  646.         $fileName $request->query->get('fileName'); 
  647.         $result $fileHandler->resultsScan($fileLink,"urlOrDir");
  648.         if (!empty($result)) {
  649.             $errorGetInScan[$fileName] = ['result'=>$result];
  650.         }
  651.         if (!empty($errorGetInScan)) {
  652.              //get file by name
  653.             $fileMessage $entityManager->getRepository(FileMessage::class)->findOneBy(['name' => $fileName]);
  654.             $fileCampaign $entityManager->getRepository(FileMission::class)->findOneBy(['name' => $fileName]);
  655.             $file null !== $fileMessage $fileMessage $fileCampaign ;
  656.             $event = new FileInfectedEvent($this->getUser(),$errorGetInScan ,$file);
  657.             $this->dispatcher->dispatch($eventFileInfectedEvent::NAME);
  658.         }
  659.         return new JsonResponse([
  660.             'status' => 'ok',
  661.             'errorGetInScan' => $errorGetInScan
  662.         ]);
  663.     }
  664.  
  665.     #[Route('/unread/{id}'name'_unread'methods: ['POST','GET'])]
  666.     public function messageUnread(Request $requestMission $missionMessageRepository $messageRepository)
  667.     {   
  668.         $entityManager $this->getDoctrine()->getManager();
  669.         $groupId $request->query->get('groupId'); 
  670.         $userId $request->query->get('userId'); 
  671.         $group null;
  672.         $user $entityManager->getRepository(User::class)->find($userId);
  673.         if (!empty($groupId) && !is_null($groupId)) {
  674.             $group $entityManager->getRepository(DiscussionGroup::class)->find($groupId);
  675.         }  
  676.         return new JsonResponse([
  677.             'status' => 'ko',
  678.             'missionId' => $mission->getId(),
  679.             'groupId' => $groupId,
  680.             'nombreUnread' => $this->messageService->getNumberMessageUnread(mission$mission,groupedMessage $group,user $user)
  681.         ]);
  682.     }
  683.     #[Route('/unread-all/{id}'name'_unread_all'methods: ['POST','GET'])]
  684.     public function messageUnreadAll(Request $requestMission $missionMessageRepository $messageRepository)
  685.     {   
  686.         $entityManager $this->getDoctrine()->getManager();
  687.         $userId $request->query->get('userId'); 
  688.         return new JsonResponse([
  689.             'status' => 'ok',
  690.             'missionId' => $mission->getId(),
  691.             'campaignId' => $mission->getCampaign()->getId(),
  692.             'nombreUnread' => $this->messageService->getNumberAllMessageUnread(mission$mission,groupedMessage null)
  693.         ]);
  694.     }
  695.     
  696.     #[Route('/addaudio/{id}'name'_add_audio_file'methods: ['POST'])]
  697.     public function addAudioMessageFile(Mission $mission,Request $requestMessageRepository $messageRepository)
  698.     {
  699.         $message = new Message();
  700.         $dateOffSetHour floatval($request->query->get('date-offset-hour'));
  701.         $entityManager $this->getDoctrine()->getManager();
  702.         $groupId $request->query->get('groupId');
  703.         $group null;
  704.         if (!empty($groupId) && !is_null($groupId)) {
  705.             $group $entityManager->getRepository(DiscussionGroup::class)->find($groupId);
  706.         }
  707.         $file $request->files->get('audio');
  708.         $nameSplitByDot explode('.'$file->getClientOriginalName());
  709.         $extension $nameSplitByDot && sizeof($nameSplitByDot) > end($nameSplitByDot) : $file->guessExtension();
  710.         $type preg_replace('/\/[a-zA-Z-_,.]*\s?/',"",$file->getMimeType());
  711.         $nameUniqueCompany strtolower("company-" $mission->getCampaign()->getCompany()->getId());
  712.         $newFilename 'audio-' uniqid() . '.' $extension;
  713.         $this->googleStorageService->uploadFile($nameUniqueCompany$file$newFilename'Campaigns/' $mission->getCampaign()->getId());
  714.         $fileMessage = new FileMessage();
  715.         $fileMessage->setName($newFilename);
  716.         $fileMessage->setIsNew(1);
  717.         $fileMessage->setIsNotInfected(true);
  718.         $fileMessage->setType($type);
  719.         $message->addFileMessage($fileMessage);
  720.         $message->setUser($this->getUser())
  721.             ->setCampaign($mission->getCampaign())
  722.             ->setMission(mission$mission)
  723.             ->setUserListWhoRead([$this->getUser()->getId()]);
  724.         if (!is_null($group)) {
  725.             $message->setDiscussionGroup($group);
  726.         }
  727.         $entityManager->persist($message);
  728.         $entityManager->flush();
  729.         $this->chatService->publishMessageNotificationCampaign($mission->getId(),[
  730.                 'message'=>$this->serializer->normalize($messagenull, [AbstractNormalizer::GROUPS => ['message_read']]),
  731.                 'html'=>$this->getHtmlToRenderInViewForLastMessage($mission,$message,$dateOffSetHour),'type'=>'insert'],$group);
  732.         return new JsonResponse('ok');
  733.     }
  734.     #[Route('/planning/validation/{type}/{id}/{stepId}'name'_planning_validation'methods: ['GET'])]
  735.     public function stepValidation(string $typestring $stepIdWorkflowStepRepository $workflowStepRepositoryMission $mission)
  736.     {
  737.         return new JsonResponse([
  738.             'html' => $this->getHtmlValidationStep($type$mission$workflowStepRepository->findOneBy(['id' => $stepId]))
  739.         ]);
  740.     }
  741.       private function getHtmlValidationStep(string $typeMission $missionWorkflowStep $step)
  742.     {
  743.         return $this->twig->render('mission/_validation_step.html.twig', [
  744.             'type' => $type,
  745.             'mission' => $mission,
  746.             'step' => $step
  747.         ]);
  748.     }
  749.     private function getHtmlToRenderInView(?Mission $mission, array $listLastMessagestring $timeZonefloat $dateOffSetHourbool|null $unredMessage false,int $nbAllMessage =0,$group null)
  750.     {
  751.         if (sizeof($listLastMessage) == 0) {
  752.             return "";
  753.         }
  754.         $listLastMessageNoDuble = [];
  755.         $seenMessages = [];
  756.         foreach ($listLastMessage as $message) {
  757.             if ($message->getContent() != null) {
  758.                 $uniqueKey $message->getContent() . '_' $message->getCreatedAt()->format('Y-m-d H:i');
  759.                 if (!isset($seenMessages[$uniqueKey])) {
  760.                     $listLastMessageNoDuble[] = $message;
  761.                     $seenMessages[$uniqueKey] = true;
  762.                 }
  763.             }else{
  764.                  $listLastMessageNoDuble[] = $message;
  765.             }
  766.         }
  767.         return $this->twig->render("mission/_chat_item.html.twig", [
  768.             "messages" => $listLastMessage,
  769.             "nbAllMessage" => $nbAllMessage,
  770.             "mission" => $mission,
  771.             "unred_message" => $unredMessage,
  772.             "time_zone" => $timeZone,
  773.             "date_off_setHour" => abs($dateOffSetHour),
  774.             "group" => $group,
  775.             "currentUser" => $this->getUser()
  776.         ]);
  777.     }
  778.      private function getHtmlToRenderInViewForLastMessage(?Mission $mission,$message,$dateOffSetHour)
  779.     {
  780.        
  781.         return $this->twig->render("mission/_chat_by_item.html.twig", [
  782.             "message" => $message,
  783.             "mission" => $mission,
  784.             "date_off_setHour" => abs($dateOffSetHour),
  785.             "currentUser" => $this->getUser()
  786.         ]);
  787.     }
  788.     private function getHtmlFutureActions (Mission $mission, array $futuresActions, ?string $currentRouteName=null, ?string $estimatedIncome=null)
  789.     {   
  790.         $formMissionInitialTimeManually $this->createForm(MissionParticipantDelaisType::class);
  791.         return $this->twig->render("mission/Ux/_futures_actions.html.twig", [
  792.             'futurActions'=> $futuresActions
  793.             'mission'=> $mission,
  794.             'price_service' => $this->priceService,
  795.             'campaign'=> $mission->getCampaign(),
  796.             'currentRouteName'=>$currentRouteName,
  797.             'estimatedIncome'=> $this->getEstimatedIncome(),
  798.             'formMissionInitialTimeManually' => $formMissionInitialTimeManually->createView(),
  799.         ]);
  800.     }
  801.     private function getEstimatedIncome(){
  802.         if ($this->isGranted(Role::ROLE_ADMIN->value)) {
  803.             $priceCampaign $this->missionParticipantRepository->findByInitialTime();
  804.             $estimatedIncome = [];
  805.             $initialTime = [];
  806.             $price = [];
  807.             foreach ($priceCampaign as $value) {
  808.                 if (!isset($estimatedIncome[$value->getMission()->getId()])) {
  809.                     $estimatedIncome[$value->getMission()->getId()] = [];
  810.                 }
  811.                 $initialTime[$value->getMission()->getId()][] = $value->getInitialTime();
  812.                 $price[$value->getMission()->getId()][] = $value->getEstimatedIncome();
  813.             }
  814.         } elseif ($this->isGranted(Role::ROLE_SUBCONTRACTOR->value)) {
  815.             $visibleCampaign = ['orderedBy' => $this->getUser()];
  816.             $estimatedIncome $this->missionParticipantRepository->getSubcontractorForUserAndMission($this->getUser());
  817.         } else {
  818.             $estimatedIncome null;
  819.         }
  820.         return $estimatedIncome;
  821.     }
  822.     private function getIdsMessage(array $listLastMessage){
  823.         $ids = []; 
  824.         $fileIds = []; 
  825.         foreach ($listLastMessage as $key => $message) {
  826.             $ids =[...$ids$message->getId()]; 
  827.             foreach ($message->getFileMessages() as $fileMessage) {
  828.                 $fileIds =[...$fileIds$fileMessage->getId()]; 
  829.             }
  830.         }
  831.         return [
  832.             'message_ids'=>$ids
  833.             'file_message_ids'=> $fileIds
  834.         ]; 
  835.     }
  836.     private function  getUserTypingMessage(array $user_typing){
  837.         return $this->twig->render('services/messages/user_typing_message.html.twig',[
  838.             'user_typing' => $user_typing
  839.         ]);
  840.     }
  841.     private function getElementReactions(array $messages){
  842.         $listMessageWithReactions = []; 
  843.         foreach ($messages as $key => $message) {
  844.             $listMessageWithReactions = [... $listMessageWithReactions,[
  845.                  'id'=> $message->getId(), 
  846.                  'content'=> $this->messageService->getReactionsHtml($message)
  847.             ]];
  848.         }
  849.         return $listMessageWithReactions 
  850.     }
  851.     private function userReadLastMessage(?Message $message=null){
  852.         $userIds = [];
  853.         $users = []; 
  854.         if($message!=null){
  855.             $userIds $message->getUserListWhoRead();
  856.             $userIds array_diff($userIds, [$message->getUser()->getId()]);
  857.             $users $this->userRepository->findByIds($userIds);
  858.         }
  859.         return [
  860.                     'html'=>$this->twig->render('services/messages/users_who_read.html.twig',[
  861.                                 'user_list' => $users
  862.                     ]), 
  863.                     'ids'=>[...$userIds], 
  864.             ]
  865.         
  866.        ;
  867.     }
  868.     function splitChar($string$lg_max)
  869.     {
  870.         if (strlen($string) > $lg_max) {
  871.             $string substr($string0$lg_max);
  872.             $last_space strrpos($string" ");
  873.             $string substr($string0$last_space) . "...";
  874.         }
  875.         return $string;
  876.     }
  877.     #[Route('/user/istyping/{id}/{idUser}',name:'user_is_typing')]
  878.     public function setUserIsTyping($id,$idUser,CampaignRepository $campaignRepository,Request $request){
  879.         
  880.         $groupId $request->query->get('groupId');
  881.         $group null;
  882.         if (!empty($groupId) && !is_null($groupId)) {
  883.             $group $this->entityManagerInterface->getRepository(DiscussionGroup::class)->find($groupId);
  884.         }
  885.         //envoyer donnez sur mercure
  886.         $entityManager $this->getDoctrine()->getManager();
  887.         $campaign $entityManager->getRepository(Campaign::class)->find($id);
  888.         $user $entityManager->getRepository(User::class)->find($idUser);
  889.         $this->chatService->publishMessageNotificationCampaign($campaign->getMissions()->first()->getId(),[
  890.                 'message'=>"",
  891.                 'type'=>'isTyping',
  892.                 'currentUser' => $user->getId(),
  893.                 'typingRender' => $this->chatService->userTyping($user),
  894.                 'user'=> $this->serializer->normalize($usernull, [AbstractNormalizer::GROUPS => ['message_read']])
  895.             ],$group);
  896.         //fin envoie
  897.         return new JsonResponse([
  898.             'status'=>'ok',
  899.         ]);
  900.     }
  901.     #[Route('/user/isStopTyping/{id}/{idUser}',name:'user_is_stop_typing')]
  902.     public function setUserIsStopTyping($id,$idUser,CampaignRepository $campaignRepository,Request $request){
  903.         $groupId $request->query->get('groupId');
  904.         $group null;
  905.         if (!empty($groupId) && !is_null($groupId)) {
  906.             $group $this->entityManagerInterface->getRepository(DiscussionGroup::class)->find($groupId);
  907.         }
  908.         //envoyer donnez sur mercure
  909.         $entityManager $this->getDoctrine()->getManager();
  910.         $mission $entityManager->getRepository(Mission::class)->find($id);
  911.         $user $entityManager->getRepository(User::class)->find($idUser);
  912.         $this->chatService->publishMessageNotificationCampaign($mission->getId(),[
  913.                 'message'=>"",
  914.                 'type'=>'isStopTyping',
  915.                 'currentUser' => $user->getId(),
  916.                 'user'=> $this->serializer->normalize($usernull, [AbstractNormalizer::GROUPS => ['message_read']])
  917.             ],$group);
  918.         //fin envoie
  919.         return new JsonResponse([
  920.             'status'=>'ok',
  921.         ]);
  922.     }
  923.     #[Route('/pinned/{id}',name:'pinned_message')]
  924.     public function pinned(Message $message,CampaignRepository $campaignRepository,Request $request){
  925.         $idCurrentUser $request->query->get('idCurrentUser');
  926.         $user $this->entityManagerInterface->getRepository(User::class)->find($idCurrentUser);
  927.         $message->setInsertPinned(new \DateTime())->addPinnedByUser($user);
  928.         $this->entityManagerInterface->persist($message);
  929.         $this->entityManagerInterface->flush();
  930.         $dateOffSetHour floatval($request->query->get('date-offset-hour'));
  931.         $groupId $request->query->get('groupId');
  932.         $group null;
  933.         if (!empty($groupId) && !is_null($groupId)) {
  934.             $group $this->entityManagerInterface->getRepository(DiscussionGroup::class)->find($groupId);
  935.         }
  936.         //faut prendre les rendu du pinned
  937.         // $this->chatService->publishMessageNotificationCampaign($message->getMission()->getId(),[
  938.         //         'message'=>$message->getId(),
  939.         //         'type'=>'isPinned',
  940.         //         'currentUser' => $user->getId(),
  941.         //         'renderPinned'=> $this->chatService->messagePinned($message,$this->getUser())
  942.         //     ],$group);
  943.         //fin envoie
  944.         return new JsonResponse([
  945.             'status'=>'ok',
  946.             'message'=>$message->getId(),
  947.             'renderPinned'=> $this->chatService->messagePinned($message,$this->getUser(),$dateOffSetHour)
  948.         ]);
  949.     }
  950.     #[Route('/pinned-off/{id}',name:'pinned_message_off')]
  951.     public function pinnedOff(Message $message,CampaignRepository $campaignRepository,Request $request){
  952.         $idCurrentUser $request->query->get('idCurrentUser');
  953.         $user $this->entityManagerInterface->getRepository(User::class)->find($idCurrentUser);
  954.         $message->removePinnedByUser($user);
  955.         $this->entityManagerInterface->persist($message);
  956.         $this->entityManagerInterface->flush();
  957.         $groupId $request->query->get('groupId');
  958.         $group null;
  959.         if (!empty($groupId) && !is_null($groupId)) {
  960.             $group $this->entityManagerInterface->getRepository(DiscussionGroup::class)->find($groupId);
  961.         }
  962.         // //faut prendre les rendu du pinned
  963.         // $this->chatService->publishMessageNotificationCampaign($message->getMission()->getId(),[
  964.         //     'message'=>$message->getId(),
  965.         //     'type'=>'isPinnedOff',
  966.         // ],$group);
  967.         //fin envoie
  968.         return new JsonResponse([
  969.             'status'=>'ok',
  970.             'message'=>$message->getId(),
  971.         ]);
  972.     }
  973.     
  974.  
  975. }