diff --git a/config/api_acl.yaml b/config/api_acl.yaml index 759d3816..c9cc42bf 100644 --- a/config/api_acl.yaml +++ b/config/api_acl.yaml @@ -102,7 +102,7 @@ access_keys: - id: mobile_vehicle.list label: List Vehicle Makes - id: mobile_customer_vehicle - label: Mobile customer Vehicle Access + label: Mobile Customer Vehicle Access acls: - id: mobile_customer_vehicle.add label: Add Mobile Customer Vehicle @@ -114,7 +114,7 @@ access_keys: label: Mobile Promo Access acls: - id: mobile_promo.list - label: List Mobile Promos + label: List Promos - id: mobile_battery label: Mobile Battery Access acls: @@ -124,4 +124,13 @@ access_keys: label: Mobile Service Access acls: - id: mobile_service.list - label: List Mobile Services + label: List Services + - id: mobile_partner + label: Mobile Partner Access + acls: + - id: mobile_partner.list + label: List Mobile Partners + - id: mobile_partner.info + label: Get Partner Info + - id: mobile_partner.review + label: Add Partner Review diff --git a/config/routes/resqapi.yaml b/config/routes/resqapi.yaml index b2edb7f8..354440d2 100644 --- a/config/routes/resqapi.yaml +++ b/config/routes/resqapi.yaml @@ -105,7 +105,7 @@ resqapi_partner_info: resqapi_partner: path: /resqapi/partners controller: App\Controller\ResqAPI\PartnerController:getClosestPartners - methods: [GET] + methods: [POST] resqapi_partner_review: path: /resqapi/partners/{pid}/review diff --git a/src/Controller/ResqAPI/CustomerController.php b/src/Controller/ResqAPI/CustomerController.php index 215daf01..c47daf55 100644 --- a/src/Controller/ResqAPI/CustomerController.php +++ b/src/Controller/ResqAPI/CustomerController.php @@ -401,7 +401,7 @@ class CustomerController extends APIController $api_version = $this->getParameter('api_version'); - $app_version = $req->query->get('version'); + $app_version = $req->request->get('version'); $api_v = explode('.', $api_version); $app_v = explode('.', $app_version); diff --git a/src/Controller/ResqAPI/PartnerController.php b/src/Controller/ResqAPI/PartnerController.php index e6bc0157..3a124427 100644 --- a/src/Controller/ResqAPI/PartnerController.php +++ b/src/Controller/ResqAPI/PartnerController.php @@ -9,14 +9,13 @@ use Doctrine\ORM\Query; use Doctrine\ORM\EntityManagerInterface; use Catalyst\APIBundle\Controller\APIController; -// TODO: what do we use for response? APIResponse or APIResult? -// APIResult is what is used by APIController. APIResponse is what is used by CAPI use Catalyst\APIBundle\Response\APIResponse; -use App\Ramcar\APIResult; use App\Entity\Partner; use App\Entity\Review; +use App\Service\MobileAPIHandler; + use Catalyst\APIBundle\Access\Generator as ACLGenerator; class PartnerController extends APIController @@ -28,22 +27,35 @@ class PartnerController extends APIController $this->acl_gen = $acl_gen; } - public function getClosestPartners(Request $req, EntityManagerInterface $em) + public function getClosestPartners(Request $req, EntityManagerInterface $em, + MobileAPIHandler $mah) { + $this->denyAccessUnlessGranted('mobile_partner.list', null, 'No access.'); + + // check required parameters $required_params = [ 'longitude', 'latitude', 'service_id', 'limit', ]; - $res = $this->checkParamsAndKey($req, $em, $required_params); - if ($res->isError()) - return $res->getReturnResponse(); + $msg = $this->checkRequiredParameters($req, $required_params); + if ($msg) + return new APIResponse(false, $msg); - $long = $req->query->get('longitude'); - $lat = $req->query->get('latitude'); - $service_id = $req->query->get('service_id'); - $limit = $req->query->get('limit'); + // get capi user to link to mobile user + $user_id = $this->getUser()->getID(); + + // get mobile user + $mobile_user = $mah->findMobileUser($em, $user_id); + + if ($mobile_user == null) + return new APIResponse(false, 'No mobile user found.'); + + $long = $req->request->get('longitude'); + $lat = $req->request->get('latitude'); + $service_id = $req->request->get('service_id'); + $limit = $req->request->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 @@ -55,10 +67,10 @@ class PartnerController extends APIController $query->setMaxResults($limit); $result = $query->getResult(); - $data = []; $partners = []; foreach($result as $row) { + error_log($row[0]->getID()); $partners[] = [ 'id' => $row[0]->getID(), 'name' => $row[0]->getName(), @@ -75,26 +87,33 @@ class PartnerController extends APIController $data['partners'] = $partners; - $res->setData($data); - - return $res->getReturnResponse(); + return new APIResponse(true, 'Partners found', $data); } - public function getPartnerInformation(Request $req, $pid, EntityManagerInterface $em) + public function getPartnerInformation(Request $req, $pid, EntityManagerInterface $em, + MobileAPIHandler $mah) { + $this->denyAccessUnlessGranted('mobile_partner.info', null, 'No access.'); + + // check required parameters $required_params = []; - $res = $this->checkParamsAndKey($req, $em, $required_params); - if ($res->isError()) - return $res->getReturnResponse(); + $msg = $this->checkRequiredParameters($req, $required_params); + if ($msg) + return new APIResponse(false, $msg); + + // get capi user to link to mobile user + $user_id = $this->getUser()->getID(); + + // get mobile user + $mobile_user = $mah->findMobileUser($em, $user_id); + + if ($mobile_user == null) + return new APIResponse(false, 'No mobile user found.'); // get partner $partner = $em->getRepository(Partner::class)->findOneBy(['id' => $pid]); if ($partner == null) - { - $res->setError(true) - ->setErrorMessage('No partner found.'); - return $res->getReturnResponse(); - } + return new APIResponse(false, 'No partner found.'); // get reviews for partner $reviews = $em->getRepository(Review::class)->findBy(['partner' => $partner]); @@ -125,21 +144,31 @@ class PartnerController extends APIController 'average_rating' => $average_rating, ]; - $res->setData($data); - - return $res->getReturnResponse(); + return new APIResponse(true, 'Partner information found', $data); } - public function reviewPartner($pid, Request $req, EntityManagerInterface $em) + public function reviewPartner($pid, Request $req, EntityManagerInterface $em, + MobileAPIHandler $mah) { + $this->denyAccessUnlessGranted('mobile_partner.review', null, 'No access.'); + $required_params = [ 'rating', 'message', ]; - $res = $this->checkParamsAndKey($req, $em, $required_params); - if ($res->isError()) - return $res->getReturnResponse(); + $msg = $this->checkRequiredParameters($req, $required_params); + if ($msg) + return new APIResponse(false, $msg); + + // get capi user to link to mobile user + $user_id = $this->getUser()->getID(); + + // get mobile user + $mobile_user = $mah->findMobileUser($em, $user_id); + + if ($mobile_user == null) + return new APIResponse(false, 'No mobile user found.'); $rating = $req->request->get('rating'); $msg = $req->request->get('message'); @@ -149,11 +178,7 @@ class PartnerController extends APIController // check if partner exists $partner = $em->getRepository(Partner::class)->find($pid); if ($partner == null) - { - $res->setError(true) - ->setErrorMessage('No partner found.'); - return $res->getReturnResponse(); - } + return new APIResponse(false, 'No partner found.'); $rev = new Review(); $rev->setRating($rating) @@ -165,93 +190,6 @@ class PartnerController extends APIController $em->persist($rev); $em->flush(); - $data = []; - $res->setData($data); - - return $res->getReturnResponse(); - } - - // TODO: since we broke the functions into separate files, we need - // to figure out how to make this accessible to all ResqAPI controllers - protected function checkParamsAndKey(Request $req, $em, $params) - { - // TODO: depends on what we decide to return - // returns APIResult object - $res = new APIResult(); - - // check for api_key in query string - $api_key = $req->query->get('api_key'); - if (empty($api_key)) - { - $res->setError(true) - ->setErrorMessage('Missing API key'); - return $res; - } - - // check missing parameters - $missing = $this->checkMissingParameters($req, $params); - if (count($missing) > 0) - { - $miss_string = implode(', ', $missing); - $res->setError(true) - ->setErrorMessage('Missing parameter(s): ' . $miss_string); - return $res; - } - - // check api key - $mobile_user = $this->checkAPIKey($em, $req->query->get('api_key')); - if ($mobile_user == null) - { - $res->setError(true) - ->setErrorMessage('Invalid API Key'); - return $res; - } - - // store session - $this->session = $sess; - - return $res; - } - - // TODO: this might not be needed if we use APIController's checkRequiredParameters - // or we put this into a service? - protected function checkMissingParameters(Request $req, $params = []) - { - $missing = []; - - // check if parameters are there - foreach ($params as $param) - { - if ($req->getMethod() == 'GET') - { - $check = $req->query->get($param); - if (empty($check)) - $missing[] = $param; - } - else if ($req->getMethod() == 'POST') - { - $check = $req->request->get($param); - if (empty($check)) - $missing[] = $param; - } - else - return $params; - } - - return $missing; - } - - // TODO: type hint entity manager - // TODO: since we broke the functions into separate files, we need - // to figure out how to make this accessible to all ResqAPI controllers - protected function checkAPIKey($em, $api_key) - { - // find the api key (session id) - // TODO: user validation needs to be changed - $m_user = $em->getRepository(MobileUser::class)->find($api_key); - if ($m_user == null) - return null; - - return $m_user; + return new APIResponse(true, 'Review added'); } } diff --git a/src/Entity/MobileUser.php b/src/Entity/MobileUser.php index 0e5e80e0..f31a04fb 100644 --- a/src/Entity/MobileUser.php +++ b/src/Entity/MobileUser.php @@ -97,9 +97,9 @@ class MobileUser */ protected $date_code_sent; - // reviews made by mobile session + // reviews made by mobile user /** - * @ORM\OneToMany(targetEntity="Review", mappedBy="mobile_session") + * @ORM\OneToMany(targetEntity="Review", mappedBy="mobile_user") */ protected $reviews; diff --git a/src/Entity/Review.php b/src/Entity/Review.php index 9903784e..efb8314a 100644 --- a/src/Entity/Review.php +++ b/src/Entity/Review.php @@ -52,6 +52,13 @@ class Review */ protected $mobile_session; + // mobile user that sent review + /** + * @ORM\ManyToOne(targetEntity="MobileUser", inversedBy="reviews") + * @ORM\JoinColumn(name="mobile_user_id", referencedColumnName="id") + */ + protected $mobile_user; + public function __construct() { $this->date_create = new DateTime(); @@ -114,4 +121,15 @@ class Review return $this->mobile_session; } + public function setMobileUser(MobileUser $mobile_user) + { + $this->mobile_user = $mobile_user; + return $this; + } + + public function getMobileUser() + { + return $this->mobile_user; + } + }