src/Service/MessageService.php line 217

Open in your IDE?
  1. <?php
  2. namespace App\Service;
  3. use App\Entity\DiscussionGroup;
  4. use App\Entity\Campaign;
  5. use App\Entity\FileMessage;
  6. use App\Entity\Message;
  7. use App\Entity\Mission;
  8. use App\Entity\User;
  9. use App\Enum\AdminMail;
  10. use App\Event\Chat\MessageSentEvent;
  11. use App\Event\User\UserMentionnedEvent;
  12. use App\Event\FirebaseCloudeMessaging\FcmNotificationEvent;
  13. use App\Repository\CampaignRepository;
  14. use App\Repository\MessageRepository;
  15. use App\Repository\UserRepository;
  16. use Doctrine\ORM\EntityManagerInterface;
  17. use Symfony\Bridge\Twig\Mime\NotificationEmail;
  18. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  19. use Symfony\Component\Security\Core\Security;
  20. use Symfony\Component\Filesystem\Filesystem;
  21. use Symfony\Component\Mailer\MailerInterface;
  22. use Symfony\Component\Mime\Address;
  23. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  24. use App\Service\DynamicHostService;
  25. use Twig\Environment;
  26. class MessageService
  27. {
  28.     public function __construct(
  29.         private MessageRepository $messageRepository,
  30.         private EntityManagerInterface $entityManagerInterface,
  31.         private CampaignRepository $campaignRepository
  32.         private UserRepository $userRepository,
  33.         private Security $security,
  34.         private ParameterBagInterface $parameterBagInterface,
  35.         private MailerInterface $mailer,
  36.         private EventDispatcherInterface $dispatcher,
  37.         private GoogleStorageService $googleStorageService
  38.         private DynamicHostService $dynamicHostService
  39.         private EntityManagerInterface $entityManager,
  40.         private Environment $twig,
  41.     ) {
  42.     }
  43.     public function addMessage(Mission $mission,  Message $message$files$idMessageToReply$idMessageToEdit$pathFileMessage){
  44.         
  45.         foreach ($files as $file) {
  46.             $nameSplitByDot explode('.'$file->getClientOriginalName());
  47.             $extension sizeof($nameSplitByDot) > end($nameSplitByDot) : $file->guessExtension();
  48.             $type preg_replace('/\/[a-zA-Z-_,.]*\s?/',"",$file->getMimeType());
  49.             $nameUniqueCompany strtolower("company-" $mission->getCampaign()->getCompany()->getId());
  50.             $originalFilename pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
  51.             $newFilename $originalFilename '-' uniqid() . '.' $extension;
  52.             //upload file in google storage
  53.             $this->googleStorageService->uploadFile($nameUniqueCompany$file$newFilename'Campaigns/' $mission->getCampaign()->getId());
  54.             $fileMessage = new FileMessage();
  55.             $fileMessage->setName($newFilename);
  56.             $fileMessage->setIsNew(1);
  57.             $fileMessage->setType($type);
  58.             $fileMessage->setIsNotInfected(true); 
  59.             
  60.             $message->addFileMessage($fileMessage);
  61.         }    
  62.         if ($idMessageToEdit != "" && $idMessageToEdit!=null) {
  63.             $messagePersisted $this->messageRepository->findOneBy(['id' => $idMessageToEdit]);
  64.             $messagePersisted->setIsModified(true);
  65.             $messagePersisted->setContent($message->getContent(), false)
  66.                              ->setOriginalContent($message->getContent())
  67.             
  68.             ;
  69.             $message $messagePersisted;
  70.         } else {
  71.             $message->setUser($this->security->getUser())
  72.                 ->setCampaign($mission->getCampaign())
  73.                 ->setMission(mission$mission)
  74.                 ->setUserListWhoRead([$this->security->getUser()->getId()])
  75.                 ->setOriginalContent($message->getContent());
  76.                 
  77.                 ;
  78.             $this->entityManagerInterface->persist($message);
  79.         }
  80.         if ($idMessageToReply != "" && $idMessageToReply!=null) {
  81.             $replyedMessage $this->messageRepository->findOneBy(['id' => $idMessageToReply]);
  82.             $message->setReplyToWithMessage($replyedMessage);
  83.         }
  84.         $this->entityManagerInterface->flush();
  85.         $this->sendEmailForParticipantMentionedInTchat($mission$message);
  86.         return $message;
  87.     }
  88.     public function addAtTheLine($content){
  89.         $pattern "/\r/";
  90.         return preg_replace($pattern,'<br>',$content);
  91.     }
  92.     public  function sendEmailForParticipantMentionedInTchat(Mission $missionMessage $message)
  93.     {
  94.         $rawMessage $message->getOriginalContent();
  95.         $messageContent $message->getContent();
  96.         $messageId $message->getId();
  97.         $messageStripTag strip_tags($messageContent);
  98.         $missionReference $message->getMission()->getReference();
  99.         $idUserToExclure = [];
  100.         $idUserToAlreadyHaveMessage = [];
  101.         $usersMentionned = []; 
  102.         $userMentionnedAllMembre false
  103.         if ($rawMessage != null && $message->getContent() != null) {
  104.             $pattern '/@\w*\S/u';
  105.             preg_match_all($pattern$messageContent$matches);
  106.             $users $matches[0];
  107.             if (in_array("@tous"$users)) {
  108.                 $message->setContent($this->putBoldUserMentioned($message->getContent(), '@tous''@tous'), falsefalse);
  109.                 $this->entityManagerInterface->flush(); 
  110.                 $userMentionnedAllMembre true
  111.                
  112.             }
  113.       
  114.             foreach ($users as $userIdentifier) {
  115.                     $identifier str_replace('@''',rtrim($userIdentifier,'.,;:/!?'));
  116.                 
  117.                     $company $this->dynamicHostService->getCompany();
  118.                     $user $this->userRepository->getUserByIdentifier($identifier,$company);
  119.                     if ($user != null) {
  120.                         $message->setContent($this->putBoldUserMentioned($message->getContent(),   $userIdentifier$user->getFirstname()), falsefalse);
  121.                         $this->entityManagerInterface->flush(); 
  122.                         $idUserToExclure = [...$idUserToExclure$user->getId()];
  123.                         $usersMentionned = [...$usersMentionned,$user ]; 
  124.                         
  125.                     }
  126.             }
  127.             
  128.             if($userMentionnedAllMembre){
  129.                 $event = new UserMentionnedEvent($missionnull$message->getContent(), $messageIdnull);
  130.                 $this->dispatcher->dispatch($eventUserMentionnedEvent::NAME);
  131.             }
  132.             else{
  133.                foreach ($usersMentionned as $user) {
  134.                     foreach ($mission->getCampaign()->getMissions() as $mission) {
  135.                         foreach ($mission->getParticipants() as $participant) {
  136.                             if(
  137.                                 !in_array($participant->getUser()->getId(), $idUserToAlreadyHaveMessage) and  
  138.                                 $participant->getUser()->getId() == $user->getId()
  139.                               ){
  140.                                 $event = new UserMentionnedEvent($mission$user$message->getContent(), $messageId$user->getEmail());
  141.                                 $this->dispatcher->dispatch($eventUserMentionnedEvent::NAME);
  142.                                  $idUserToAlreadyHaveMessage = [...$idUserToAlreadyHaveMessage$user->getId()];
  143.                             }
  144.                         }
  145.                     }
  146.                 }
  147.             }
  148.             $event = new MessageSentEvent($message$idUserToExclure);
  149.             $this->dispatcher->dispatch($eventMessageSentEvent::NAME);
  150.         }
  151.     }
  152.     public function putBoldUserMentioned($content$search$remplace){
  153.         $htmlToRemplace =  "<strong data-origin='$search'>$remplace</strong>"
  154.         return preg_replace("/$search\b/"$htmlToRemplace$this->addAtTheLine($content)); 
  155.     }
  156.     public  function sendEmailError(string $errorTypestring $messageTypestring $message)
  157.     {
  158.         // $content = "
  159.         //         <p>Bonjour</p>
  160.         //         <p>Une erreur à été survenue lors d'enregistrement d'un message du {$this->security->getUser()->getFullname()}</p>
  161.         //         <p>type de l'erreur : $errorType</p>
  162.         //         <p>type de message : $messageType</p>
  163.         //         <p>Message : $message</p>
  164.         //     ";
  165.         // $admins = ['r.rado@softibox.com', 'anthony@softibox.com'];
  166.         // foreach ($admins as $email) {
  167.         //     $this->sendEmail(
  168.         //         new Address('caroline.b@my-flow.fr', 'myFlow'),
  169.         //         new Address($email),
  170.         //         'Erreur dans le tchat',
  171.         //         $content
  172.         //     );
  173.         // }
  174.         
  175.     }
  176.     public function getNumberMessageUnread(Mission $mission,DiscussionGroup $groupedMessage null,$user null)
  177.     {
  178.         $user = !is_null($user) ? $user $this->security->getUser();
  179.         $listMessage =   $this->messageRepository->findBy(["campaign" => $mission->getCampaign(),"discussionGroup"=>null]);
  180.         if (!is_null($groupedMessage)) {
  181.              $listMessage =   $this->messageRepository->findBy(["campaign" => $mission->getCampaign(),"discussionGroup"=>$groupedMessage]);
  182.         }
  183.         $numberMessageUnread 0;
  184.         foreach ($listMessage as $message) {
  185.             if ( $user !== null && $message->getOrigin() !=&& ($message->getUserListWhoRead() === null || !in_array($this->security->getUser()->getId(), $message->getUserListWhoRead()))
  186.              and !$message->isDeleted() and $this->haveMessage($message))
  187.              {
  188.                 if ($message->getDiscussionGroup() !== null) {
  189.                     foreach ($message->getDiscussionGroup()->getUsers() as $userInGroup) {
  190.                         if ($this->security->getUser()->getId() == $userInGroup->getId() and !$message->getDiscussionGroup()->isDeleted()) {
  191.                              $numberMessageUnread++;
  192.                         }
  193.                     }
  194.                 }else{
  195.                      $numberMessageUnread++;
  196.                 }
  197.             }
  198.         }
  199.         return  $numberMessageUnread;
  200.     }
  201.     public function haveMessage($message){
  202.             return $message->getContent() == null && count($message->getFileMessages()) > || $message->getContent() != null ;
  203.     }
  204.     public function getNumberAllMessageUnread(Mission $mission,DiscussionGroup $groupedMessage null)
  205.     {
  206.         $listMessage =   $this->messageRepository->findBy(["campaign" => $mission->getCampaign()]);
  207.         $numberMessageUnread 0;
  208.         foreach ($listMessage as $message) {
  209.             if ($this->security->getUser() !== null && $message->getOrigin() !=&& ($message->getUserListWhoRead() === null || !in_array($this->security->getUser()->getId(), $message->getUserListWhoRead()))) {
  210.                 if (!$message->isDeleted()) {
  211.                     if ($message->getDiscussionGroup() !== null) {
  212.                         foreach ($message->getDiscussionGroup()->getUsers() as $userInGroup) {
  213.                             if ($this->security->getUser()->getId() == $userInGroup->getId() and !$message->getDiscussionGroup()->isDeleted()) {
  214.                                 
  215.                                  if ($message->getContent() == null) {
  216.                                     foreach ($message->getFileMessages() as $file) {
  217.                                         if ($file->getSharedWithUsers()->isEmpty() or  ( in_array("ROLE_ADMIN"$this->security->getUser()->getRoles()) or in_array("ROLE_CLIENT"$this->security->getUser()->getRoles()))) {
  218.                                             $numberMessageUnread++;
  219.                                         }else{
  220.                                             foreach ($file->getSharedWithUsers() as $user) {
  221.                                                 if ($user->getId() == $this->security->getUser()->getId()) {
  222.                                                     $numberMessageUnread++;
  223.                                                 }
  224.                                             }
  225.                                         }
  226.                                     }
  227.                                 }else{
  228.                                     $numberMessageUnread++;
  229.                                 }
  230.                             }
  231.                         }
  232.                     }else{
  233.                         if ($message->getContent() == null) {
  234.                             foreach ($message->getFileMessages() as $file) {
  235.                                 if ($file->getSharedWithUsers()->isEmpty() or  ( in_array("ROLE_ADMIN"$this->security->getUser()->getRoles()) or in_array("ROLE_CLIENT"$this->security->getUser()->getRoles()))) {
  236.                                     $numberMessageUnread++;
  237.                                 }else{
  238.                                     foreach ($file->getSharedWithUsers() as $user) {
  239.                                         if ($user->getId() == $this->security->getUser()->getId()) {
  240.                                             $numberMessageUnread++;
  241.                                         }
  242.                                     }
  243.                                 }
  244.                             }
  245.                         }else{
  246.                             $numberMessageUnread++;
  247.                         }
  248.                     }
  249.                 }
  250.             }
  251.         }
  252.         return  $numberMessageUnread;
  253.     }
  254.     public function marqueAllInMissionMessageRead(Mission $missionUser $user null)
  255.     {
  256.         $user $user !== null $user $this->security->getUser();
  257.         $messages =   $this->messageRepository->findBy(["campaign" => $mission->getCampaign()]);
  258.         $message null;
  259.         // $messages = $mission->getMessages();
  260.      
  261.         if($user != null ){
  262.             foreach ($messages as $message) {
  263.                 try {
  264.                     $this->marqueMessageRead(message $message,user$user);
  265.                 } catch (\Throwable $th) {
  266.              //       mail("erreurmessageanthonmyfolo@yopmail.com", "erreur", "errdsf");
  267.                 }
  268.             }
  269.         }
  270.         
  271.     }
  272.      public function marqueAllInMissionMessageReadWithGroup(Mission $missionUser $user null,$groupedMessage null)
  273.     {
  274.         $user $user !== null $user $this->security->getUser();
  275.         $messages =   $this->messageRepository->getMessageWithGroup($mission->getCampaign(),$groupedMessage);
  276.         $message null;
  277.         // $messages = $mission->getMessages();
  278.         
  279.         if($user != null ){
  280.             foreach ($messages as $message) {
  281.                 try {
  282.                     $this->marqueMessageRead(message $message,user$user);
  283.                 } catch (\Throwable $th) {
  284.              //       mail("erreurmessageanthonmyfolo@yopmail.com", "erreur", "errdsf");
  285.                 }
  286.             }
  287.         }
  288.         
  289.     }
  290.     public function marqueMessageRead(Message $messageUser $user)
  291.     {
  292.         if ($message->getUserListWhoRead() == null || sizeof($message->getUserListWhoRead()) == 0) {
  293.             $message->setUserListWhoRead([$user->getId()]);
  294.         } elseif (!in_array($user->getId(), $message->getUserListWhoRead())) {
  295.             $message->setUserListWhoRead([...$message->getUserListWhoRead(), $user->getId()]);
  296.         }
  297.         $this->entityManagerInterface->flush();
  298.     }
  299.     public function getUsersWhoReadMessage(Message $message)
  300.     {
  301.         return $this->userRepository->findUsersWhoAllreadyRead($message);
  302.     }
  303.     public function allFileMessageIsDeleted(Message $message){
  304.         $numberFileMessageDeleted 0
  305.         $numberMessageDeleted 0
  306.         foreach ($message->getFileMessages() as $key => $filemessage) {
  307.             if($filemessage->getIsDeleted()){
  308.                 $numberFileMessageDeleted++; 
  309.             }
  310.             $numberMessageDeleted ++ ; 
  311.         }
  312.         return $numberFileMessageDeleted == $numberMessageDeleted true false 
  313.     }
  314.     public function getReactionsHtml(Message $message){
  315.         
  316.         $reactions $message->getMessageReactions();
  317.         $reactionsReduced=[];
  318.         $users = [];
  319.         foreach ($reactions as $reaction) {
  320.            
  321.            $isMyReaction =  $reaction->getUser()->getId() == $this->security->getUser()->getId() ? true false;
  322.            
  323.            if(array_key_exists($reaction->getEmojiId(), $reactionsReduced)){
  324.             $numberReaction $reactionsReduced[$reaction->getEmojiId()]['number'] ; 
  325.             $users $reactionsReduced[$reaction->getEmojiId()]['users'] ; 
  326.             $reactionsReduced[$reaction->getEmojiId()]['number'] = $numberReaction +;
  327.             $reactionsReduced[$reaction->getEmojiId()]['users'] = [...$users,$reaction->getUser()];
  328.             if( $reactionsReduced[$reaction->getEmojiId()]['my_reaction'] == false){
  329.                 $reactionsReduced[$reaction->getEmojiId()]['my_reaction'] = $isMyReaction;
  330.             }
  331.                     
  332.            }
  333.            else{
  334.                 $reactionsReduced = [
  335.                     ...$reactionsReduced,
  336.                     $reaction->getEmojiId()=>[
  337.                             'id'=> $reaction->getEmojiId(),
  338.                             'message_id'=>$message->getId(),
  339.                             'emoji'=> $reaction->getEmoji(),
  340.                             'users'=>[$reaction->getUser()],
  341.                             'number'=>1,
  342.                             'my_reaction'=>$isMyReaction,
  343.                         ]
  344.                     ];
  345.            }
  346.         }
  347.         return $this->twig->render('services/messages/reaction.html.twig',[
  348.                  'reactionsReduced'=> $reactionsReduced
  349.              ]
  350.         ) ;
  351.     }
  352.     public function getFileMissionUrlByCampaign(Campaign $campaign$fileName){
  353.         $filesystem = new Filesystem();
  354.         foreach ($campaign->getMissions() as $mission) {
  355.             $destination "{$this->parameterBagInterface->get('file_message_directory')}/{$mission->getId()}/message/$fileName";
  356.             if ($filesystem->exists($destination)) {
  357.                 return "uploads/mission/{$mission->getId()}/message/$fileName";
  358.             }
  359.         }
  360.         return "";
  361.     }
  362.     public function getFileMissionUrl(Mission $missionCampaignstring $fileName)
  363.     {
  364.        return $this->getFileMissionUrlByCampaign($missionCampaign->getCampaign(), $fileName);
  365.     }
  366.     /**
  367.      * @param User $user
  368.      * @param string $message=""
  369.      * 
  370.      * @return string
  371.      */
  372.     public function generateMessageByAction(User $user nullstring $action ""mixed $option null, ?Mission $mission=null): string
  373.     {
  374.         $user ??= "Système";
  375.         $mission $mission !=null $mission->getProduct()->getName(): ''
  376.         $userOptionFullName ="";
  377.         $jobsOptionFullName "";
  378.         try {
  379.             $userOptionFullName $option != null && $option->getUser() != null ?  $option->getUser()->getFullName() : ''
  380.             $jobsOptionFullName $option != null && $option->getJob() != null  $option->getJob()->getName() : '-'
  381.         } catch (\Throwable $th) {
  382.             //throw $th;
  383.         }
  384.         if (preg_match('/^relancelaunch_/'$action)) {
  385.             $explodeValue explode("_"$action);
  386.             return "Une relance a été envoyée à " $explodeValue[1] . " " $explodeValue[2];
  387.         }
  388.         
  389.         switch ($action) {
  390.             case 'save_file';
  391.                 return "Téléchargement de ce fichier $option.";
  392.             case 'accept_mission';
  393.                 return $user a accepté de prendre en charge la mission.";
  394.             
  395.             case 'decline_mission';
  396.                 return "$user a rejeté la mission $mission.";
  397.                 
  398.             case 'title_campagne_modified';
  399.                 return 'Le titre de la mission a été modifié.';
  400.             case 'new_project':
  401.                 return "Passation de la commande.";
  402.             case 'add_validator_list':
  403.                 return "Utilisateur(s) qui valide la mission :  {$this->stringParticipant(participants:$option)}.";
  404.             case 'archive':
  405.                 return "Mission archivée par $user.";
  406.             case 'add_subcontractor':
  407.                 return "$user a ajouté {$userOptionFullName} en tant que {$jobsOptionFullName} sur la mission.";
  408.             case 'quantity_update':
  409.                 return "$user a modifié la quantité.";
  410.             case 'deadline_change':
  411.                 return "Mise à jour de l’échéance par $user.";
  412.             case 'modif_subcontractor':
  413.                 return "Modification de l’intervenant opérationnel pour le métier $option.";
  414.             case 'initial_time':
  415.                 return "$user a apporté(e) une modification à la demande initiale.";
  416.             case 'mission_evaluate':
  417.                 return "$user a fait évoluer le budget.";
  418.             case 'mission_evaluate_time':
  419.                 return "Mise à jour du temps passé par $user.";
  420.             case 'add_client':
  421.                 return "$user a ajouté {$userOptionFullName} en tant que contact client";
  422.             case 'edit_role_participant':
  423.                 return "Le role de  : {$userOptionFullName} a changé en {$option->getRole()->label()}.";
  424.             case 'delete_participant':
  425.                 return "Suppression d’un contact sur la mission : {$userOptionFullName} par $user.";
  426.             case 'mission_reactived':
  427.                 return "La mission {$option->getProduct()->getName()} a été réactivé.";
  428.             case 'mission_deleted':
  429.                 return "La mission {$option->getProduct()->getName()} a été supprimé.";
  430.             case 'sub_activate_mission':
  431.                 return "Mission démarrée par $user.";
  432.             case 'activation':
  433.                 return 'Mission activée.';
  434.             case 'activation_campaign':
  435.                 return 'Mission activée.';
  436.             case 'pause':
  437.                 return "Mission en pause par $user.";
  438.             case 'unpause':
  439.                 return "Mission est redémarrée par $user.";
  440.             case 'cancel':
  441.                 return "Mission annulée par $user.";
  442.             case 'refus':
  443.                 return "$user a refusé la mission.";
  444.             case 'closed':
  445.                 return "Mission clôturée par $user.";
  446.             case 'evaluation_request':
  447.                 return "Envoi de demande d'évaluation.";
  448.             case 'resoumission':
  449.                 return "resoumission du panier avec la dernière action de $user.";
  450.             case 'resend':
  451.                 return "Mission resoumise par $user.";
  452.             case 'validate':
  453.                 return "Mission validée.";
  454.             case 'accepter':
  455.                 return "Panier validé.";
  456.             case 'start':
  457.                 return "Mission démarrée.";
  458.             case 'automatic_close':
  459.                 return "Mission cloturée automatiquement.";
  460.             case 'credit_campagne_modified':
  461.                 return "$user a modifié le mode de facturation de la mission.";
  462.             case 'campaign_initiate_by_admin':
  463.                 return "Commande par l'administrateur.";
  464.             case 'campaign_initiate_by_tunnel_client':
  465.                 return "Mission déposée à partir du tunnel de commande.";
  466.             case 'devis_public':
  467.                 return "Mission déposée à partir du devis public.";
  468.             case 'campaign_initiate_by_tunnel_devis':
  469.                 return "Mission déposée à partir du tunnel de demande de devis.";
  470.             case 'campaign_initiate_by_recurrent':
  471.                 return "Mission récurrente.";
  472.             case 'campaign_initiate_by_mail':
  473.                 return "Mission déposée par email";
  474.             case 'livrable_send_have_file':
  475.                 return "$user a partagé le(s) livrable(s) suivant(s) : $option";
  476.             case 'livrable_send_not_file':
  477.                 return "$user n'a aucun livrable";
  478.             default:
  479.                 return "Une action est faite par $user.";
  480.         }
  481.     }
  482.     public function stringParticipant(array|string|null $participants=''): string
  483.     {
  484.        if(!is_string($participants) && !is_null($participants)){
  485.             $separate ",";
  486.             $validators "";
  487.             foreach ($participants as $key => $participant) {
  488.                 if ($key == sizeof($participants)) {
  489.                     $separate "";
  490.                 }
  491.                 $validators .= "{$participant->getUser()->getFullName()} $separate";
  492.             }
  493.             return $validators;
  494.         }
  495.         return '-';
  496.     }
  497.     public function sendEmail(Address $fromAddress $tostring $subjectstring $content$attachments null)
  498.     {
  499.         $notification = (new NotificationEmail())
  500.             ->from($from)
  501.             ->to($to)
  502.             ->subject($subject)
  503.             ->content($content)
  504.             ->markAsPublic();
  505.         if (null !== $attachments) {
  506.             foreach ($attachments as $file) {
  507.                 $notification->attachFromPath($this->parameterBagInterface->get('kernel.project_dir') . '/public/uploads/mission/' $file->getMission()->getId() . '/' $file->getName());
  508.             }
  509.         }
  510.         try {
  511.             $this->mailer->send($notification);
  512.         } catch (\Exception $e) {
  513.         }
  514.     }
  515.     public function getBullUsersWhoReadMessage(Message $message,  ?Message $nextMessage null){
  516.         $users=[];
  517.        
  518.         if($nextMessage!=null){
  519.             $userIds array_diff($message->getUserListWhoRead(), $nextMessage->getUserListWhoRead());
  520.             //delete my Id of sender
  521.             // $userIds = array_diff($userIds, [$message->getUser()->getId()]);
  522.             if(sizeof(value$userIds)>0){
  523.                 $users $this->userRepository->findByIds($userIds);
  524.             }
  525.         }else{
  526.             
  527.             $userIds $message->getUserListWhoRead();
  528.             // $userIds = array_diff($userIds, [$message->getUser()->getId()]);
  529.             $users $this->userRepository->findByIds($userIds);
  530.         }
  531.         return $users
  532.     }
  533.     public function postUserTypingMessage(string $campaignId){
  534.         $campaign$this->campaignRepository->findOneBy(['id'=>$campaignId]);
  535.     
  536.         if($campaign){
  537.             $entityManager $this->entityManager;
  538.             $aboutThisUser = [];
  539.             $dateUserTyping = new \DateTime();
  540.             $user $this->security->getUser();
  541.             $userId $user->getId();
  542.             $userName $user->getFirstname();
  543.             $userProfilePicture $user->getPictureName();
  544.             $campaignIsUserWriting $campaign->getUserWriting();
  545.             $aboutThisUser = [
  546.                 [
  547.                 'id'=> $userId,
  548.                 'name' => $userName,
  549.                 'picture_name'=> $userProfilePicture,
  550.                 'date_typing' => $dateUserTyping,
  551.                 ]   
  552.             ];
  553.             if(is_null($campaignIsUserWriting)){
  554.                 $campaignIsUserWriting $aboutThisUser;
  555.             }else{
  556.                 $isUserAlreadyTyping $this->checkIfUserIsAlreadyTyping($userId,$campaignIsUserWriting);
  557.                 if($isUserAlreadyTyping === false ){
  558.                     $campaignIsUserWriting array_merge($campaignIsUserWriting,$aboutThisUser);
  559.                 }else{
  560.                     $campaignIsUserWriting[$isUserAlreadyTyping]['date_typing'] = $dateUserTyping;
  561.                 }
  562.             }
  563.             $campaign->setUserWriting($campaignIsUserWriting);
  564.             $entityManager->persist($campaign);
  565.             $entityManager->flush();
  566.         }
  567.     }
  568.     public function getUserTypingWithoutCurrentUser(Mission $mission) {
  569.         $campaign$mission->getCampaign();
  570.         $allUserTyping $campaign->getUserWriting();
  571.         if(!is_null($allUserTyping)){
  572.             $allUserTyping array_filter($allUserTyping, function ($idUser) {
  573.                 return !in_array($idUser['id'], [$this->security->getUser()->getId()]); 
  574.             });
  575.         }
  576.         return $allUserTyping;
  577.     }
  578.     private function checkIfUserIsAlreadyTyping($userId,$listOfUser){
  579.         return array_search($userIdarray_column($listOfUser'id'));
  580.     }
  581.     public function calculaTimeTypingOfEachUser($listOfUserTyping) {
  582.         if(!is_null($listOfUserTyping)){
  583.             $listOfUserTyping array_map(function ($user) {
  584.                 $currentDate = new \DateTime();
  585.                 $maxNumberSeconds 5;
  586.                 $timeTyping $currentDate->diff($user['date_typing']);
  587.                 $date1 $user['date_typing'];
  588.                 $timeSecondDiff $currentDate->format('U') - $date1->format('U');
  589.                 
  590.                 if($timeSecondDiff<5){
  591.                     $user['date_typing'] = 'is_typing';
  592.                 }else{
  593.                     $user['date_typing'] = "";
  594.                 }
  595.                 return $user;
  596.             }, $listOfUserTyping);
  597.         }
  598.         return $listOfUserTyping ?? [];
  599.     }
  600. }