src/Controller/SycMessagesAndPlanning.php line 682

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