src/Controller/SycMessagesAndPlanning.php line 107

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