src/Controller/Front/MessageController.php line 49

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Front;
  3. use App\Entity\Discussion;
  4. use App\Entity\Message;
  5. use App\Entity\User;
  6. use App\Form\MessageType;
  7. use App\Helper\ControllerHelper;
  8. use App\Repository\CommentRepository;
  9. use App\Repository\DiscussionRepository;
  10. use App\Repository\MessageRepository;
  11. use App\Repository\ModuleInscriptionRepository;
  12. use App\Repository\ProgramRepository;
  13. use App\Repository\SubjectRepository;
  14. use App\Repository\UserRepository;
  15. use App\Utils\Constants;
  16. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  17. use Symfony\Component\Console\Helper\Helper;
  18. use Symfony\Component\HttpFoundation\JsonResponse;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use Symfony\Component\HttpFoundation\Response;
  21. use Symfony\Component\Mercure\HubInterface;
  22. use Symfony\Component\Routing\Annotation\Route;
  23. use Symfony\Component\Mercure\PublisherInterface;
  24. use Symfony\Component\Mercure\Update;
  25. use Symfony\Component\String\Slugger\SluggerInterface;
  26. class MessageController extends AbstractController
  27. {
  28.     use ControllerHelper;
  29.     private $hub;
  30.     private $slugger;
  31.     public function __construct(HubInterface $hubSluggerInterface $slugger)
  32.     {
  33.         $this->hub $hub;
  34.         $this->slugger $slugger;
  35.     }
  36.     /**
  37.      * @Route("/chat", name="app_front_message_chat", methods={"GET", "POST"})
  38.      * @param Request $request
  39.      * @param MessageRepository $messageRepository
  40.      * @return JsonResponse
  41.      * @throws Exception
  42.      */
  43.     public function chat(Request $requestMessageRepository $messageRepositoryDiscussionRepository $discussionRepositoryProgramRepository $programRepositorySubjectRepository $subjectRepositoryCommentRepository $commentRepositoryModuleInscriptionRepository $moduleInscriptionRepositoryHubInterface $hub)
  44.     {
  45.         /** @var User $currentUser */
  46.         $currentUser $this->getUser();
  47.         
  48.         $myTopics = [];
  49.         $subsidiaryCompany $currentUser->getSubsidiaryCompany();
  50.         if ($subsidiaryCompany !== null) {
  51.             $programs $programRepository->findProgramsBySubsidiaryCompany($subsidiaryCompany);
  52.             foreach ($programs as $program) {
  53.                 $topic $this->slugger->slug(strtolower('program_'.$program->getLabel().'_'.$currentUser->getId()))->toString();
  54.                 $myTopics [] = $topic;
  55.             }
  56.         }
  57.         $subjects $subjectRepository->findBy(['createdBy' => $currentUser]);
  58.         foreach ($subjects as $subject) {
  59.             $topic $this->slugger->slug(strtolower('subject_'.$subject->getTitle().'_'.$currentUser->getId()))->toString();
  60.             $myTopics [] = $topic;
  61.         }
  62.         $comments $commentRepository->findBy(['createdBy' => $currentUser]);
  63.         foreach ($comments as $comment) {
  64.             $topic $this->slugger->slug(strtolower('comment_'.$comment->getId().'_'.$currentUser->getId()))->toString();
  65.             $myTopics [] = $topic;
  66.         }
  67.         $topic = [
  68.             'chat_'.$currentUser->getId().'_{id}',
  69.             'chat_{id}_'.$currentUser->getId(),
  70.             'program-{program_name}-'.$currentUser->getId(),
  71.             'module-{module_name}-'.$currentUser->getId(),
  72.             'subject-{subject_title}-'.$currentUser->getId(),
  73.             'comment-{comment_id}-'.$currentUser->getId(),
  74.             'quote-{quote_title}-'.$currentUser->getId(),
  75.             Constants::DEFAULT_TOPIC.'/1'
  76.         ];
  77.         $message = new Message();
  78.         $form $this->createForm(MessageType::class, $message);
  79.         $form->handleRequest($request);
  80.         if ($form->isSubmitted()) {
  81.             if ($form->isValid()) {
  82.                 $receiver $message->getReceiver();
  83.                 $discussion $discussionRepository->findOneBy(['createdBy' => $currentUser'receiver' => $receiver]);
  84.                 if ($discussion === null) {
  85.                     $discussion = new Discussion();
  86.                     $discussion->setReceiver($receiver);
  87.                     $discussionRepository->add($discussiontrue);
  88.                 }
  89.                 $message->setDiscussion($discussion);
  90.                 $messageRepository->add($messagetrue);
  91.                 
  92.                 $data = [
  93.                     'createdById' => $currentUser->getId(),
  94.                     'receiverId' => $receiver->getId(),
  95.                     'photo' => ($currentUser->getPhoto() !== null) ? '/files/images/'.$currentUser->getPhoto()->getFileName() : "",
  96.                     'fullName' => $currentUser->getFullname(),
  97.                     'profileColor' => $currentUser->getProfileColor(),
  98.                     'time' => $this->getHumanTiming($message->getCreatedAt()->getTimestamp(), 'long'),
  99.                     'content' => $message->getContent(),
  100.                     'visibility' => $message->getVisibility(),
  101.                     'action' => 'add'
  102.                 ];
  103.                 $topic = [
  104.                     'chat_'.$currentUser->getId().'_'.$receiver->getId(),
  105.                     'chat_'.$receiver->getId().'_'.$currentUser->getId(),
  106.                     'program-{program_name}-'.$currentUser->getId(),
  107.                     'module-{module_name}-'.$currentUser->getId(),
  108.                     'subject-{subject_title}-'.$currentUser->getId(),
  109.                     'comment-{comment_id}-'.$currentUser->getId(),
  110.                     'quote-{quote_title}-'.$currentUser->getId(),
  111.                     Constants::DEFAULT_TOPIC.'/1'
  112.                 ];
  113.                 $update = new Update(
  114.                     $topic,
  115.                     json_encode($data)
  116.                 );
  117.         
  118.                 $hub->publish($update);
  119.                
  120.                 // $this->publish($topic, $data);
  121.                 return new JsonResponse($data);
  122.             } else {
  123.                 return new JsonResponse([
  124.                     'errors' => $this->getErrorMessages($form)
  125.                 ], Response::HTTP_OK);
  126.             }
  127.             
  128.         }
  129.         return $this->render('front/components/messenger.html.twig', [
  130.             'form' => $form->createView(),
  131.             'config' => [
  132.                 'topics' => (!empty($topic)) ? $topic : [],
  133.                 'publishRoute' => $this->generateUrl('app_front_message_chat'),
  134.                 'mercureHubUrl' => $_ENV['MERCURE_URL'],
  135.                 'myTopics' => $myTopics
  136.             ]
  137.         ]);
  138.     }
  139.     /**
  140.      * @Route("/messages-chat", name="app_front_message_list", methods={"GET", "POST"})
  141.      * @param Request $request
  142.      * @return JsonResponse
  143.      */
  144.     public function list(Request $requestMessageRepository $messageRepository)
  145.     {
  146.         $messages $messageRepository->findAll();
  147.         $topic $request->get('topic');
  148.         $publishRoute $this->generateUrl('app_front_message_chat', ['topic' => $topic]);
  149.         $data = [];
  150.         foreach ($messages as $message) {
  151.             $createdBy $message->getCreatedBy();
  152.             $data ['messages'][] = [
  153.                 'createdById' => $message->getCreatedBy()->getId(),
  154.                 'photo' => ($createdBy->getPhoto() !== null) ? '/files/images/'.$createdBy->getPhoto()->getFileName() : "",
  155.                 'fullName' => $createdBy->getFullname(),
  156.                 'profileColor' => $createdBy->getProfileColor(),
  157.                 'time' =>  $this->getHumanTiming($message->getCreatedAt()->getTimestamp(), 'long'),
  158.                 'content' => $message->getContent(),
  159.                 'visibility' => $message->getVisibility(),
  160.                 'action' => 'add'
  161.             ];
  162.         }
  163.         $data['publishRoute'] = $publishRoute;
  164.         return new JsonResponse($data);
  165.     }
  166.     /**
  167.      * @Route("/messages-discussion/{id}", name="app_front_message_discussion", methods={"GET"})
  168.      * @param Request $request
  169.      * @return JsonResponse
  170.      */
  171.     public function discussion(MessageRepository $messageRepositoryUser $receiver)
  172.     {
  173.         /** Check if current user is allowed to see discussions */
  174.         if ($receiver === null) return new JsonResponse([]);
  175.         /** @var User $currentUser */
  176.         $currentUser $this->getUser();
  177.         $messages $messageRepository->findMessages($currentUser$receiver);
  178.         $data = [];
  179.         foreach ($messages as $message) {
  180.             if($message->getReceiver() == $currentUser) {
  181.                 $message->setIsRead(true);
  182.                 $messageRepository->add($messagetrue);
  183.             }
  184.             $data [] = [
  185.                 'id' => $message->getId(),
  186.                 'isReceive' => ($message->getCreatedBy() !== $currentUser),
  187.                 'message' => $message->getContent(),
  188.                 'date' =>  $this->getHumanTiming($message->getCreatedAt()->getTimestamp(), 'long')
  189.             ];
  190.         }
  191.         return new JsonResponse($data);
  192.     }
  193.     /**
  194.      * @Route("/find-users", name="app_front_message_find_user", methods={"POST"})
  195.      * @param Request $request
  196.      * @return JsonResponse
  197.      */
  198.     public function findUser(Request $requestUserRepository $userRepository)
  199.     {
  200.         $searchKey $request->get('search_key');
  201.         if ($searchKey === null || empty($searchKey)) return new JsonResponse([]);
  202.         $users $userRepository->findUsersBySearchKey($this->getUser(), $searchKey);
  203.         $data = [];
  204.         foreach ($users as $user) {
  205.             $customPhoto '<div style="width: 60px; height: 60px"><div class="rounded-circle shadow-sm position-relative img-profile-pic d-flex align-items-center justify-content-center bg-danger" style="width: 100%; height: 100%; background-color: '.$user["profileColor"].' !important;"><p class="fw-bold text-white" style="margin: auto; font-size: 1.1rem !important;">'.substr($user["firstname"], 01).' '.substr($user["lastname"], 01).'</p></div></div>';
  206.             $data [] = [
  207.                 'id' => $user['id'],
  208.                 'photo' => ($user['filename'] !== null) ? '/files/images/'.$user['filename'] : "",
  209.                 'custom_photo' => $customPhoto,
  210.                 'lastname' => $user['lastname'],
  211.                 'firstname' => $user['firstname'],
  212.                 'profileColor' => $user['profileColor'],
  213.                 'message' => '',
  214.                 'text' => $user['firstname'].' '.$user['lastname'],
  215.                 'is_new_message' => false
  216.             ];
  217.         }
  218.         return new JsonResponse($data);
  219.     }
  220.      /**
  221.      * @Route("/find-user-data", name="app_find_user_data", methods={"GET"})
  222.      * @param Request $request
  223.      * @return JsonResponse
  224.      */
  225.     public function findUserData(Request $requestUserRepository $userRepository)
  226.     {
  227.         $searchKey $request->query->get('search_key');
  228.         if ($searchKey === null || empty($searchKey)) return new JsonResponse([]);
  229.         $users $userRepository->findUsersBySearchKey($this->getUser(), $searchKey);
  230.         $data = [];
  231.         foreach ($users as $user) {
  232.             $customPhoto '<div style="width: 60px; height: 60px"><div class="rounded-circle shadow-sm position-relative img-profile-pic d-flex align-items-center justify-content-center bg-danger" style="width: 100%; height: 100%; background-color: '.$user["profileColor"].' !important;"><p class="fw-bold text-white" style="margin: auto; font-size: 1.1rem !important;">'.substr($user["firstname"], 01).' '.substr($user["lastname"], 01).'</p></div></div>';
  233.             $data['results'] [] = [
  234.                 'id' => $user['id'],
  235.                 'photo' => ($user['filename'] !== null) ? '/files/images/'.$user['filename'] : "",
  236.                 'custom_photo' => $customPhoto,
  237.                 'lastname' => $user['lastname'],
  238.                 'firstname' => $user['firstname'],
  239.                 'profileColor' => $user['profileColor'],
  240.                 'message' => '',
  241.                 'text' => $user['firstname'].' '.$user['lastname'],
  242.                 'is_new_message' => false
  243.             ];
  244.         }
  245.         return new JsonResponse($data);
  246.     }
  247.     /**
  248.      * @Route("/my-contacts", name="app_front_message_my_contact", methods={"GET"})
  249.      * @param Request $request
  250.      * @return JsonResponse
  251.      */
  252.     public function myContact(Request $requestMessageRepository $messageRepositoryDiscussionRepository $discussionRepository)
  253.     {
  254.         // $searchKey = $request->get('search_key');
  255.         // if ($searchKey === null || empty($searchKey)) return new JsonResponse([]);
  256.         /** @var User $currentUser */
  257.         $currentUser $this->getUser();
  258.         $discussions = (!$currentUser->getSenderDiscussions()->isEmpty()) ? $currentUser->getSenderDiscussions() : $currentUser->getReceiverDiscussions();
  259.         //$discussions = $discussionRepository->findDiscussions($currentUser);
  260.         $data = [];
  261.         foreach ($discussions as $discussion) {
  262.             $receiver $discussion->getReceiver();
  263.             $myContact = ($receiver === $currentUser) ? $discussion->getCreatedBy() : $discussion->getReceiver();
  264.             //$lastMessage = (!$myContact->getMessages()->isEmpty()) ? $myContact->getMessages()->last() : null;
  265.             
  266.             $discussion $discussionRepository->findOneBy(['createdBy' => $currentUser'receiver' => $receiver]);
  267.             $discussionReverse $discussionRepository->findOneBy(['createdBy' => $receiver'receiver' => $currentUser]);
  268.             $lastMessage $discussion $messageRepository->findOneBy(array('discussion' => [$discussion$discussionReverse]), array('createdAt' => 'DESC')) : null;
  269.             //$lastMessage = count($lastMessage) > 0 ? $lastMessage = $lastMessage->first() : null;
  270.             $data [] = [
  271.                 'id' => $myContact->getId(),
  272.                 'photo' => ($myContact->getPhoto() !== null) ? '/files/images/'.$myContact->getPhoto()->getFileName() : "",
  273.                 'firstname' => $myContact->getFirstname(),
  274.                 'profileColor' => $myContact->getProfileColor(),
  275.                 'lastname' => $myContact->getLastname(),
  276.                 'message' => ($lastMessage !== null) ? $lastMessage->getContent() : "",
  277.                 'is_new_message' => false,
  278.                 'new_messages_count' => $myContact->getMessages()->filter(function($message) use($currentUser) {
  279.                     return (!$message->isIsRead() && $message->getReceiver() == $currentUser);
  280.                 })->count()
  281.             ];
  282.             
  283.         }
  284.         //dd($data);
  285.         return new JsonResponse($data);
  286.     }
  287.     public function publish(String $topic, array $data): void
  288.     {
  289.         $update = new Update(
  290.             $topic,
  291.             json_encode($data)
  292.         );
  293.         // Publisher's JWT must contain this topic, a URI template it matches or * in mercure.publish or you'll get a 401
  294.         // Subscriber's JWT must contain this topic, a URI template it matches or * in mercure.subscribe to receive the update
  295.         $this->hub->publish($update);
  296.     }
  297. }