Refine the search REST ressource.
[Project_proches_de_moi-server.git] / src / Controller / PersonController.php
index 49c456d999609bbcb0a6f89cdf7b2eff89ea50b8..0b7a7d5c5d127e3f88c83dbaac3141c0c8da129b 100644 (file)
@@ -4,11 +4,13 @@ namespace App\Controller;
 use App\Entity\Person;
 use App\Entity\Localisation;
 use \Datetime;
+use \NotNull;
 use Symfony\Bundle\FrameworkBundle\Controller\Controller;
 use FOS\RestBundle\Controller\FOSRestController;
 use FOS\RestBundle\Controller\Annotations as Rest;
 use FOS\RestBundle\View\ViewHandler;
 use FOS\RestBundle\View\View;
+use FOS\RestBundle\Request\ParamFetcherInterface;
 use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpFoundation\Response;
@@ -38,7 +40,10 @@ class PersonController extends FOSRestController
         $em->persist($person);
         $em->flush();
 
-        return $this->view($person, Response::HTTP_CREATED, ['Location' => $this->generateUrl('show_person', ['id' => $person->getId(), UrlGeneratorInterface::ABSOLUTE_URL])]);
+        return $this->view($person, Response::HTTP_CREATED,
+                           ['Location' => $this->generateUrl('show_person',
+                           ['id' => $person->getId(),
+                           UrlGeneratorInterface::ABSOLUTE_URL])]);
     }
 
     /**
@@ -106,7 +111,10 @@ class PersonController extends FOSRestController
         $em->merge($person);
         $em->flush();
 
-        return $this->view($person, Response::HTTP_CREATED, ['Location' => $this->generateUrl('show_person', ['id' => $person->getId(), UrlGeneratorInterface::ABSOLUTE_URL])]);
+        return $this->view($person, Response::HTTP_CREATED,
+                           ['Location' => $this->generateUrl('show_person',
+                           ['id' => $person->getId(),
+                           UrlGeneratorInterface::ABSOLUTE_URL])]);
     }
 
     /**
@@ -128,7 +136,10 @@ class PersonController extends FOSRestController
         if ($request->get('password') != $person->getPassword()) {
             return $this->PersonWrongPassword();
         } else {
-            return $this->view($person, Response::HTTP_ACCEPTED, ['Location' => $this->generateUrl('show_person', ['id' => $person->getId(), UrlGeneratorInterface::ABSOLUTE_URL])]);
+            return $this->view($person, Response::HTTP_ACCEPTED,
+                               ['Location' => $this->generateUrl('show_person',
+                               ['id' => $person->getId(),
+                               UrlGeneratorInterface::ABSOLUTE_URL])]);
         }
     }
 
@@ -177,9 +188,15 @@ class PersonController extends FOSRestController
     }
 
     private function getLastLocalisation($em, $id) {
-        $query = $em->createQuery("SELECT l1 FROM App\Entity\Localisation l1 WHERE l1.person = :person and l1.timestamp = (SELECT MAX(l2.timestamp) FROM App\Entity\Localisation l2 WHERE l2.person = l1.person)");
+        $query = $em->createQuery("SELECT l1 FROM App\Entity\Localisation l1
+                                   WHERE l1.person = :person and l1.timestamp =
+                                   (SELECT MAX(l2.timestamp) FROM App\Entity\Localisation l2
+                                   WHERE l2.person = l1.person)");
         $query->setParameter('person', $id);
-        return $query->getResult()[0];
+        $result = $query->getResult();
+        if (!empty($result)) {
+            return $result[0];
+        }
     }
 
     /**
@@ -339,7 +356,9 @@ class PersonController extends FOSRestController
             return $this->PersonNotFound();
         }
 
-        return $person->getFriendsWithMe();
+        $friends_with_me = $person->getFriendsWithMe();
+
+        return $friends_with_me;
     }
 
     /**
@@ -407,6 +426,31 @@ class PersonController extends FOSRestController
         $em->flush();
     }
 
+    /**
+     * @Rest\Get(
+     *     path = "/api/person/search",
+     *     name = "search_person"
+     * )
+     * @Rest\QueryParam(name="keyword")
+     * @Rest\View()
+     */
+    public function searchPerson(ParamFetcherInterface $paramFetcher)
+    {
+        $em = $this->getDoctrine()->getManager();
+        $query = $em->createQuery("SELECT DISTINCT p FROM App\Entity\Person p WHERE
+            p.firstname LIKE :keyword OR
+            p.lastname LIKE :keyword OR
+            p.email LIKE :keyword");
+        $query->setParameter('keyword', '%'.$paramFetcher->get('keyword').'%');
+        $persons = $query->getResult();
+
+        if (empty($persons)) {
+            return $this->PersonsNotFound();
+        }
+
+        return $persons;
+    }
+
     private function PersonNotFound() {
         return View::create(['message' => 'Person not found'], Response::HTTP_NOT_FOUND);
     }