Modify PartnerController. #591

This commit is contained in:
Korina Cordero 2021-07-06 09:26:13 +00:00
parent dbcf226682
commit 41f2002701
6 changed files with 96 additions and 131 deletions

View file

@ -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

View file

@ -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

View file

@ -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);

View file

@ -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');
}
}

View file

@ -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;

View file

@ -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;
}
}