From e8b76e8810aad8346486f892ea5e88d5f2a51f6d Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 8 Jul 2019 06:57:24 +0000 Subject: [PATCH] Add getClosestPartners method to the APIController that takes in a longitude, latitude, results limit, and service id to find the closes partners. #228 --- config/routes/api.yaml | 6 ++++ src/Controller/APIController.php | 62 +++++++++++++++++++++++++++++--- 2 files changed, 64 insertions(+), 4 deletions(-) diff --git a/config/routes/api.yaml b/config/routes/api.yaml index e11e0c20..6c66429d 100644 --- a/config/routes/api.yaml +++ b/config/routes/api.yaml @@ -134,3 +134,9 @@ api_partner_info: path: /api/partner/{pid} controller: App\Controller\APIController:getPartnerInformation methods: [GET] + +api_partner: + path: /api/partners + controller: App\Controller\APIController:getClosestPartners + methods: [GET] + diff --git a/src/Controller/APIController.php b/src/Controller/APIController.php index 72016ddc..d1bad313 100644 --- a/src/Controller/APIController.php +++ b/src/Controller/APIController.php @@ -1837,8 +1837,8 @@ class APIController extends Controller 'branch' => $sp->getBranch(), 'address' => $sp->getAddress(), 'contact_nums' => $sp->getContactNumbers(), - 'time_open' => $sp->getTimeOpen()->format("d M Y g:i A"), - 'time_close' => $sp->getTimeClose()->format("d M Y g:i A"), + 'time_open' => $sp->getTimeOpen()->format("g:i A"), + 'time_close' => $sp->getTimeClose()->format("g:i A"), ]; } @@ -1896,8 +1896,8 @@ class APIController extends Controller 'branch' => $partner->getBranch(), 'address' => $partner->getAddress(), 'contact_nums' => $partner->getContactNumbers(), - 'time_open' => $partner->getTimeOpen()->format("d M Y g:i A"), - 'time_close' => $partner->getTimeClose()->format("d M Y g:i A"), + 'time_open' => $partner->getTimeOpen()->format("g:i A"), + 'time_close' => $partner->getTimeClose()->format("g:i A"), 'reviews' => $rev, ]; @@ -1905,4 +1905,58 @@ class APIController extends Controller return $res->getReturnResponse(); } + + public function getClosestPartners(Request $req) + { + $required_params = [ + 'longitude', + 'latitude', + 'service_id', + 'limit', + ]; + $em = $this->getDoctrine()->getManager(); + $res = $this->checkParamsAndKey($req, $em, $required_params); + if ($res->isError()) + return $res->getReturnResponse(); + + $long = $req->query->get('longitude'); + $lat = $req->query->get('latitude'); + $service_id = $req->query->get('service_id'); + $limit = $req->query->get('limit'); + + // get partners within range + $query = $em->createQuery('SELECT p, st_distance(p.coordinates, point(:lng, :lat)) as dist FROM App\Entity\Partner p + JOIN App\Entity\Service s where s.id = :service_id ORDER BY dist') + ->setParameter('lat', $lat) + ->setParameter('lng', $long) + ->setParameter('service_id', $service_id); + + $query->setMaxResults($limit); + $result = $query->getResult(); + + $data = []; + foreach($result as $row) + { + $partner = []; + $partner[] = [ + 'id' => $row[0]->getID(), + 'name' => $row[0]->getName(), + 'branch' => $row[0]->getBranch(), + 'address' => $row[0]->getAddress(), + 'contact_nums' => $row[0]->getContactNumbers(), + 'time_open' => $row[0]->getTimeOpen()->format("g:i A"), + 'time_close' => $row[0]->getTimeClose()->format("g:i A"), + ]; + + $data[] = [ + 'partner' => $partner, + 'db_distance' => $row['dist'], + ]; + } + + $res->setData($data); + + return $res->getReturnResponse(); + + } }