X-Git-Url: https://git.piment-noir.org/?p=Project_proches_de_moi-server.git;a=blobdiff_plain;f=src%2FController%2FPersonController.php;fp=src%2FController%2FPersonController.php;h=49c456d999609bbcb0a6f89cdf7b2eff89ea50b8;hp=b037f5367faffa87ec7f2435f808f241526231eb;hb=c4fba949ce8e98cadb9222a202b9e24b52dcb7f8;hpb=787fc3b74e498cb78f516e372827790ba78920ac diff --git a/src/Controller/PersonController.php b/src/Controller/PersonController.php index b037f53..49c456d 100644 --- a/src/Controller/PersonController.php +++ b/src/Controller/PersonController.php @@ -28,6 +28,7 @@ class PersonController extends FOSRestController $person = new Person(); $person->setFirstname($request->get('firstname')); $person->setLastName($request->get('lastname')); + //TODO: email creation should normally have a verification step $person->setEmail($request->get('email')); $person->setPassword($request->get('password')); $person->setOnline(false); @@ -99,6 +100,7 @@ class PersonController extends FOSRestController $person->setFirstName($request->get('firstname')); $person->setLastName($request->get('lastname')); + //TODO: email update should normally have a verification step $person->setEmail($request->get('email')); $em->merge($person); @@ -107,6 +109,29 @@ class PersonController extends FOSRestController return $this->view($person, Response::HTTP_CREATED, ['Location' => $this->generateUrl('show_person', ['id' => $person->getId(), UrlGeneratorInterface::ABSOLUTE_URL])]); } + /** + * @Rest\Post( + * path = "/api/person/authenticate", + * name = "authenticate_person" + * ) + * @Rest\View(StatusCode = Response::HTTP_ACCEPTED) + */ + public function authenticatePersonAction(Request $request) + { + $em = $this->getDoctrine()->getManager(); + $person = $em->getRepository('App:Person')->findOneBy(['email' => $request->get('email')]); + + if (empty($person)) { + return $this->PersonNotFound(); + } + + 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])]); + } + } + /** * @Rest\Get("/api/person/{id}/localisations") * @Rest\View() @@ -124,6 +149,39 @@ class PersonController extends FOSRestController return $localisations; } + /** + * @Rest\Get( + * path = "/api/person/{id}/localisations/fuzzy/{distance}", + * name = "person_localisations_fuzzy", + * requirements = {"id"="\d+", "distance"="\d+"} + * ) + * @Rest\View() + */ + public function getLocalisationsFuzzyAction(Request $request) + { + //TODO: Check that the authenticated user is allowed to see the localisation + $em = $this->getDoctrine()->getManager(); + $localisations = $em->getRepository('App:Localisation')->findBy(['person' => $request->get('id')]); + + if (empty($localisations)) { + return $this->PersonLocalisationsNotFound(); + } + + if (!$this->chk_distance($request->get('distance'), 200, 500)) { + return $this->PersonLocalisationFuzzyWrongDistance(); + } + + $fuzzy_localisations = array_map(function($item) use ($request) { return $this->randomizeLocation($item, $request->get('distance'), 200, 500); }, $localisations); + + return $fuzzy_localisations; + } + + 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->setParameter('person', $id); + return $query->getResult()[0]; + } + /** * @Rest\Get("/api/person/{id}/localisation") * @Rest\View() @@ -133,9 +191,7 @@ class PersonController extends FOSRestController //TODO: Check that the authenticated user is allowed to see the localisation $em = $this->getDoctrine()->getManager(); - $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', $request->get('id')); - $localisation = $query->getResult(); + $localisation = $this->getLastLocalisation($em, $request->get('id')); if (empty($localisation)) { return $this->PersonLocalisationNotFound(); @@ -144,6 +200,61 @@ class PersonController extends FOSRestController return $localisation; } + private function chk_distance($distance, $min, $max) { + if ($distance >= $min && $distance <= $max) { + return true; + } else { + return false; + } + } + + private function randomizeLocation($localisation, $distance, $min, $max) { + // Generate random float in [0, 1[, [0, 1) + $u = rand(0, getrandmax() - 1) / getrandmax(); + $v = rand(0, getrandmax() - 1) / getrandmax(); + + if ($this->chk_distance($distance, $min, $max)) { + $r = $distance / 111300; + } else { + return $this->PersonLocalisationFuzzyWrongDistance(); + } + + $w = $r * sqrt($u); + $t = 2 * pi() * $v; + + $x = $w * cos($t); + $lng_off = $x / cos(deg2rad($localisation->getLatitude())); + $lat_off = $w * sin($t); + + $fuzzy_localisation = new Localisation(); + $fuzzy_localisation->setTimestamp($localisation->getTimestamp()); + $fuzzy_localisation->setLatitude($localisation->getLatitude() + $lat_off); + $fuzzy_localisation->setLongitude($localisation->getLongitude() + $lng_off); + return $fuzzy_localisation; + } + + /** + * @Rest\Get( + * path = "/api/person/{id}/localisation/fuzzy/{distance}", + * name = "person_localisation_fuzzy", + * requirements = {"id"="\d+", "distance"="\d+"} + * ) + * @Rest\View() + */ + public function getLocalisationFuzzyAction(Request $request) + { + //TODO: Check that the authenticated user is allowed to see the localisation + $em = $this->getDoctrine()->getManager(); + + $localisation = $this->getLastLocalisation($em, $request->get('id')); + + if (empty($localisation)) { + return $this->PersonLocalisationNotFound(); + } + + return $this->randomizeLocation($localisation, $request->get('distance'), 200, 500); + } + /** * @Rest\Post("/api/person/{id}/localisation") * @Rest\View(StatusCode = Response::HTTP_CREATED) @@ -211,6 +322,26 @@ class PersonController extends FOSRestController return $person->getFriends(); } + /** + * @Rest\Get( + * path = "/api/person/{id}/friendswithme", + * name = "show_person_friends_with_me", + * requirements = {"id"="\d+"} + * ) + * @Rest\View() + */ + public function showPersonFriendsWithMe(Request $request) + { + $em = $this->getDoctrine()->getManager(); + $person = $em->getRepository('App:Person')->find($request->get('id')); + + if (empty($person)) { + return $this->PersonNotFound(); + } + + return $person->getFriendsWithMe(); + } + /** * @Rest\Get( * path = "/api/persons", @@ -292,4 +423,11 @@ class PersonController extends FOSRestController return View::create(['message' => 'Person localisations not found'], Response::HTTP_NOT_FOUND); } + private function PersonWrongPassword() { + return View::create(['message' => 'Supplied password do not match'], Response::HTTP_UNAUTHORIZED); + } + private function PersonLocalisationFuzzyWrongDistance() { + return View::create(['message' => 'Distance range do not match'], Response::HTTP_NOT_ACCEPTABLE); + } + }