From 76029b8d1af52447e5331fa4c7b8c0f6efca1ab8 Mon Sep 17 00:00:00 2001
From: pfleu <fleutotp@gmail.com>
Date: Fri, 9 Jun 2023 23:01:13 +0200
Subject: [PATCH] Friendship: suite

---
 src/Controller/FriendController.php  | 10 ++++----
 src/Entity/User.php                  | 16 +++++++++++++
 src/Form/UserAddFriendType.php       | 14 ++++++++---
 templates/user/showFriends.html.twig | 35 +++++++++-------------------
 4 files changed, 44 insertions(+), 31 deletions(-)

diff --git a/src/Controller/FriendController.php b/src/Controller/FriendController.php
index e9111a8..ca9ce3f 100644
--- a/src/Controller/FriendController.php
+++ b/src/Controller/FriendController.php
@@ -41,18 +41,20 @@ class FriendController extends AbstractController
      */
     public function index(Request $request): Response
     {
-        $invitationRequestsSent = $this->doctrine->getManager()->getRepository(InvitationRequest::class)->findBy([
+        $pendingInvitationRequestsSent = $this->doctrine->getManager()->getRepository(InvitationRequest::class)->findBy([
             'sender' => $this->getUser(),
+            'status' => InvitationRequest::STATUS_NEW,
         ], ['id' => 'DESC']);
 
-        $invitationRequestsReceived = $this->doctrine->getManager()->getRepository(InvitationRequest::class)->findBy([
+        $pendingInvitationRequestsReceived = $this->doctrine->getManager()->getRepository(InvitationRequest::class)->findBy([
             'recipient' => $this->getUser(),
+            'status' => InvitationRequest::STATUS_NEW,
         ], ['id' => 'DESC']);
 
         return $this->render('user/showFriends.html.twig', [
             'user' => $this->getUser(),
-            'invitationRequestsSent' => $invitationRequestsSent,
-            'invitationRequestsReceived' => $invitationRequestsReceived,
+            'pendingInvitationRequestsSent' => $pendingInvitationRequestsSent,
+            'pendingInvitationRequestsReceived' => $pendingInvitationRequestsReceived,
         ]);
     }
 
diff --git a/src/Entity/User.php b/src/Entity/User.php
index b71c7ab..825fff6 100644
--- a/src/Entity/User.php
+++ b/src/Entity/User.php
@@ -286,6 +286,22 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface
         $this->invitationRequestsSent = new ArrayCollection();
     }
 
+    public function getUsersFromPendingInvitationRequests()
+    {
+        $result = [];
+        foreach ($this->getInvitationRequestsReceived() as $invitation) {
+            if ($invitation->isNew()) {
+                $result[] = $invitation->getSender();
+            }
+        }
+        foreach ($this->getInvitationRequestsSent() as $invitation) {
+            if ($invitation->isNew()) {
+                $result[] = $invitation->getRecipient();
+            }
+        }
+        return $result;
+    }
+
     public function getInitials()
     {
         return $this->getPseudo()[0];
diff --git a/src/Form/UserAddFriendType.php b/src/Form/UserAddFriendType.php
index b2750f1..6c55212 100644
--- a/src/Form/UserAddFriendType.php
+++ b/src/Form/UserAddFriendType.php
@@ -31,15 +31,23 @@ class UserAddFriendType extends AbstractType
     public function buildForm(FormBuilderInterface $builder, array $options): void
     {
         $user = $this->security->getUser();
+        $hiddenUsers = [];
+        if ($user) {
+            $hiddenUsers[] = $user;
+            foreach ($user->getMyFriends() as $friend) {
+                $hiddenUsers[] = $friend;
+            }
+            $hiddenUsers = array_merge($hiddenUsers, $user->getUsersFromPendingInvitationRequests());
+        }
 
         $builder
             ->add('friend', EntityType::class, [
                 'label' => 'Utilisateur',
                 'class' => User::class,
-                'query_builder' => function (EntityRepository $entityRepository) use ($user) {
+                'query_builder' => function (EntityRepository $entityRepository) use ($hiddenUsers) {
                     $qb = $entityRepository->createQueryBuilder('u')
-                        ->andWhere('u.id != :myId')
-                        ->setParameter('myId', $user->getId())
+                        ->andWhere('u.id NOT IN (:hiddenUsers)')
+                        ->setParameter('hiddenUsers', $hiddenUsers)
                         ->addOrderBy('u.pseudo', 'ASC')
                     ;
                     return $qb;
diff --git a/templates/user/showFriends.html.twig b/templates/user/showFriends.html.twig
index f495427..be375cc 100644
--- a/templates/user/showFriends.html.twig
+++ b/templates/user/showFriends.html.twig
@@ -28,27 +28,20 @@
                 </div>
             </div>
 
-            {% if invitationRequestsSent %}
+            {% if pendingInvitationRequestsSent %}
                 <h3 class="mt-3">{{ "Demandes envoyées"|trans }}</h3>
                 <div class="card mt-3">
                     <div class="card-body">
                         <table class="table table-borderless">
-                            {% for invitationRequest in invitationRequestsSent %}
+                            {% for invitationRequest in pendingInvitationRequestsSent %}
                                 <tr>
                                     <td>{{ invitationRequest.createdAt|date('d/m/Y') }}</td>
                                     <td>
                                         <span class="badge bg-secondary"> {{ "Demande envoyée à "|trans  }}{{ invitationRequest.recipient }}</span>
-                                        {% if invitationRequest.accepted %}
-                                            <span class="badge bg-success">{{ "Acceptée"|trans }}</span>
-                                        {% elseif invitationRequest.accepted %}
-                                            <span class="badge bg-success">{{ "Refusée"|trans }}</span>
-                                        {% endif %}
                                     </td>
                                     <td class="text-end">
-                                        {% if invitationRequest.accepted is null %}
-                                            <a data-confirm="{{ "Confirmer la suppression ?"|trans }}" data-bs-toggle="modal" data-bs-target="#confirm-dialog"
-                                               data-href="{{ path('app_friend_remove_friendship_invitationRequest', {id: invitationRequest.id}) }}" class="btn btn-xs btn-danger"><i class="bi-x-circle"></i></a>
-                                        {% endif %}
+                                        <a data-confirm="{{ "Confirmer la suppression ?"|trans }}" data-bs-toggle="modal" data-bs-target="#confirm-dialog"
+                                           data-href="{{ path('app_friend_remove_friendship_invitationRequest', {id: invitationRequest.id}) }}" class="btn btn-xs btn-danger"><i class="bi-x-circle"></i></a>
                                     </td>
                                 </tr>
                             {% endfor %}
@@ -57,27 +50,21 @@
                 </div>
             {% endif %}
 
-            {% if invitationRequestsReceived %}
+            {% if pendingInvitationRequestsReceived %}
                 <h3 class="mt-3">{{ "Demandes reçues"|trans }}</h3>
                 <div class="card mt-3">
                     <div class="card-body">
                         <table class="table table-borderless">
-                            {% for invitationRequest in invitationRequestsReceived %}
+                            {% for invitationRequest in pendingInvitationRequestsReceived %}
                                 <tr>
                                     <td>{{ invitationRequest.createdAt|date('d/m/Y') }}</td>
                                     <td><span class="badge bg-secondary"> {{ "Demande envoyée par "|trans  }}{{ invitationRequest.sender }}</span></td>
                                     <td class="text-end">
-                                        {% if invitationRequest.new %}
-                                            <a href="{{ path('app_friend_accept_friendship_invitationRequest', {id: invitationRequest.id}) }}" class="btn btn-xs btn-success"><i class="fa fa-check"></i> {{ "Accepter"|trans }}</a>
-                                            <a data-confirm="{{ "Confirmer le refus ?"|trans }}" data-bs-toggle="modal" data-bs-target="#confirm-dialog"
-                                               data-href="{{ path('app_friend_deny_friendship_invitationRequest', {id: invitationRequest.id}) }}" class="btn btn-xs btn-danger">
-                                                <i class="bi-x-circle"></i> {{ "Refuser"|trans }}
-                                            </a>
-                                        {% elseif invitationRequest.accepted %}
-                                            <span class="badge bg-success">{{ "Acceptée"|trans }}</span>
-                                        {% elseif invitationRequest.denied %}
-                                            <span class="badge bg-success">{{ "Refusée"|trans }}</span>
-                                        {% endif %}
+                                        <a href="{{ path('app_friend_accept_friendship_invitationRequest', {id: invitationRequest.id}) }}" class="btn btn-xs btn-success"><i class="fa fa-check"></i> {{ "Accepter"|trans }}</a>
+                                        <a data-confirm="{{ "Confirmer le refus ?"|trans }}" data-bs-toggle="modal" data-bs-target="#confirm-dialog"
+                                           data-href="{{ path('app_friend_deny_friendship_invitationRequest', {id: invitationRequest.id}) }}" class="btn btn-xs btn-danger">
+                                            <i class="bi-x-circle"></i> {{ "Refuser"|trans }}
+                                        </a>
                                     </td>
                                 </tr>
                             {% endfor %}
-- 
GitLab