src/Controller/MessageController.php line 75

Open in your IDE?
  1. <?php
  2. // MessageController.php
  3. namespace App\Controller;
  4. use Knp\Component\Pager\PaginatorInterface;
  5. use App\Entity\Message;
  6. use App\Entity\User;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\Routing\Annotation\Route;
  12. use App\Repository\CategorieRepository;
  13. use App\Repository\MessageRepository;
  14. use App\Repository\UserRepository;
  15. use Symfony\Component\Security\Core\Security;
  16. use Symfony\Component\Security\Core\Exception\AccessDeniedException;
  17. class MessageController extends AbstractController
  18. {
  19.     private Security $security;
  20.     public function __construct(Security $security)
  21.     {
  22.         $this->security $security;
  23.     }
  24.     #[Route('/send-message'name'send_message'methods: ['POST'])]
  25.     public function sendMessage(Request $requestEntityManagerInterface $entityManager): Response
  26.     {
  27.         // Récupérer l'utilisateur connecté (expéditeur)
  28.         $expediteur $this->getUser();
  29.          // Vérifier si l'utilisateur est connecté
  30.          if (!$expediteur) {
  31.             throw $this->createAccessDeniedException('Vous devez être connecté pour envoyer un message.');
  32.             return $this->redirectToRoute('app_login');
  33.         }
  34.         $destinataireUsername $request->request->get('destinataire_username');
  35.         $content $request->request->get('content');
  36.         // Récupérer le destinataire à partir du nom d'utilisateur
  37.         $destinataire $entityManager->getRepository(User::class)->findOneBy(['username' => $destinataireUsername]);
  38.         // Vérifier si le destinataire existe
  39.         if (!$destinataire) {
  40.             throw $this->createNotFoundException('Destinataire non trouvé');
  41.         }
  42.         // Empêcher l'utilisateur de s'envoyer un message à lui-même
  43.         if ($expediteur === $destinataire) {
  44.             $this->addFlash('error''Vous ne pouvez pas vous envoyer un message à vous-même.');
  45.             return $this->redirectToRoute('app_envoyer_message', ['username' => $destinataireUsername]);
  46.         }
  47.         // Créer le message
  48.         $message = new Message();
  49.         $message->setExpediteur($expediteur);
  50.         $message->setDestinataire($destinataire);
  51.         $message->setContent($content);
  52.         $message->setCreatedAt(new \DateTimeImmutable());
  53.         // Enregistrer le message en base de données
  54.         $entityManager->persist($message);
  55.         $entityManager->flush();
  56.         return new Response('Message envoyé avec succès'Response::HTTP_OK);
  57.     }
  58.     /* Affichage de la discussion privé */
  59.     #[Route('/message/send/{username}'name'app_envoyer_message'methods: ['GET''POST'])]
  60.     public function showSendMessageForm(string $usernameUserRepository $userRepositoryMessageRepository $messageRepositoryCategorieRepository $categorieRepositoryRequest $requestPaginatorInterface $paginator): Response
  61.     {
  62.        
  63.         $categories $categorieRepository->findAll();
  64.         /* security gestion des utilisateurs et de leurs sessions */
  65.         $user $this->security->getUser();
  66.         $destinataire $userRepository->findOneBy(['username' => $username]);
  67.         
  68.         // Vérifier si l'utilisateur est connecté
  69.         if (!$user) {
  70.             return $this->redirectToRoute('app_login'); 
  71.         }
  72.         // Vérifier si l'utilisateur essaie de s'envoyer un message à lui-même
  73.         if ($user === $destinataire) {
  74.             $this->addFlash('error''Vous ne pouvez pas vous envoyer un message à vous-même.');
  75.             return $this->redirectToRoute('list_conversations');
  76.         }
  77.     
  78.         // Vérifier si destinataire est un ami et contains vérifie si cet collection contient le destinataire
  79.         $isFriend $user->getFriends()->contains($destinataire);    
  80.         // Vérifier si une demande d'ami a déjà été envoyée
  81.         $hasSentFriendRequest $user->getSentFriendRequests()->contains($destinataire);
  82.         $hasReceivedFriendRequest $user->getReceivedFriendRequests()->contains($destinataire);
  83.     
  84.         $queryBuilder $messageRepository->createQueryBuilder('m')
  85.             ->where('m.expediteur = :user AND m.destinataire = :destinataire')
  86.             ->orWhere('m.expediteur = :destinataire AND m.destinataire = :user')
  87.             ->setParameter('user'$user)
  88.             ->setParameter('destinataire'$destinataire)
  89.             ->orderBy('m.createdAt''ASC');
  90.     
  91.         /* PAGINATION */
  92.         $pagination $paginator->paginate(
  93.             $queryBuilder// Requête paginée
  94.             $request->query->getInt('page'1), // Numéro de page
  95.             // Nbx d'éléments par page
  96.         );
  97.     
  98.         if ($request->isMethod('POST')) {
  99.             $content $request->request->get('content');
  100.             if ($user === $destinataire) {
  101.                 $this->addFlash('error''Vous ne pouvez pas vous envoyer un message à vous-même.');
  102.                 return $this->redirectToRoute('app_envoyer_message', ['username' => $username]);
  103.             }
  104.     
  105.             // Créer le message
  106.             $message = new Message();
  107.             $message->setExpediteur($user);
  108.             $message->setDestinataire($destinataire);
  109.             $message->setContent($content);
  110.             $message->setCreatedAt(new \DateTimeImmutable());
  111.     
  112.             // Enregistrer le message en base de données
  113.             $entityManager $this->getDoctrine()->getManager();
  114.             $entityManager->persist($message);
  115.             $entityManager->flush();
  116.     
  117.             // Rediriger avec un message de succès
  118.             return $this->redirectToRoute('app_envoyer_message', ['username' => $username'messageSent' => true]);
  119.         }
  120.     
  121.         return $this->render('message/send.html.twig', [
  122.             'destinataire' => $destinataire,
  123.             'pagination' => $pagination,
  124.             'categories' => $categories,
  125.             'isFriend' => $isFriend,
  126.             'hasSentFriendRequest' => $hasSentFriendRequest
  127.             'hasReceivedFriendRequest' => $hasReceivedFriendRequest,
  128.         ]);
  129.     }
  130.     
  131.     
  132. #[Route('/message/list-conversations'name'list_conversations')]
  133. public function listConversations(MessageRepository $messageRepositoryPaginatorInterface $paginatorCategorieRepository $categorieRepositoryRequest $request): Response
  134. {
  135.     $categories $categorieRepository->findAll();
  136.     $user $this->getUser();
  137.      // Récupérer les utilisateurs avec qui l'utilisateur a eu des conversations
  138.      $conversations $messageRepository->findUniqueConversationsForUser($user);
  139.     return $this->render('message/listConvEntreUser.html.twig', [
  140.         'conversations' => $conversations,
  141.         'categories' => $categories,
  142.     ]);
  143. }
  144.     
  145. }