resq/src/Controller/ResqAPI/PartnerController.php
2021-07-14 10:27:14 +00:00

200 lines
6.4 KiB
PHP

<?php
namespace App\Controller\ResqAPI;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Doctrine\ORM\Query;
use Doctrine\ORM\EntityManagerInterface;
use Catalyst\APIBundle\Controller\APIController;
use Catalyst\APIBundle\Response\APIResponse;
use App\Entity\Partner;
use App\Entity\Review;
use App\Service\MobileAPIHandler;
use Catalyst\APIBundle\Access\Generator as ACLGenerator;
class PartnerController extends APIController
{
protected $acl_gen;
public function __construct(ACLGenerator $acl_gen)
{
$this->acl_gen = $acl_gen;
}
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',
];
$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($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
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();
$partners = [];
foreach($result as $row)
{
error_log($row[0]->getID());
$partners[] = [
'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"),
'longitude' => $row[0]->getCoordinates()->getLongitude(),
'latitude' => $row[0]->getCoordinates()->getLatitude(),
'db_distance' => $row['dist'],
];
}
$data['partners'] = $partners;
return new APIResponse(true, 'Partners found', $data);
}
public function getPartnerInformation(Request $req, $pid, EntityManagerInterface $em,
MobileAPIHandler $mah)
{
$this->denyAccessUnlessGranted('mobile_partner.info', null, 'No access.');
// check required parameters
$required_params = [];
$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($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)
return new APIResponse(false, 'No partner found.');
// get reviews for partner
$reviews = $em->getRepository(Review::class)->findBy(['partner' => $partner]);
// get average rating for all reviews
$average_rating = 0;
if (!empty($reviews))
{
$rating = 0;
foreach($reviews as $review)
{
$rating = $rating + $review->getRating();
}
$average_rating = $rating / sizeof($reviews);
}
$data['partner'] = [
'id' => $partner->getID(),
'name' => $partner->getName(),
'branch' => $partner->getBranch(),
'address' => $partner->getAddress(),
'contact_nums' => $partner->getContactNumbers(),
'time_open' => $partner->getTimeOpen()->format("g:i A"),
'time_close' => $partner->getTimeClose()->format("g:i A"),
'longitude' => $partner->getCoordinates()->getLongitude(),
'latitude' => $partner->getCoordinates()->getLatitude(),
'average_rating' => $average_rating,
];
return new APIResponse(true, 'Partner information found', $data);
}
public function reviewPartner($pid, Request $req, EntityManagerInterface $em,
MobileAPIHandler $mah)
{
$this->denyAccessUnlessGranted('mobile_partner.review', null, 'No access.');
$required_params = [
'rating',
'message',
];
$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($user_id);
if ($mobile_user == null)
return new APIResponse(false, 'No mobile user found.');
$rating = $req->request->get('rating');
$msg = $req->request->get('message');
// TODO: check rating if 1 - 5
// check if partner exists
$partner = $em->getRepository(Partner::class)->find($pid);
if ($partner == null)
return new APIResponse(false, 'No partner found.');
$rev = new Review();
$rev->setRating($rating)
->setMessage($msg)
->setPartner($partner)
->setMobileUser($mobile_user);
// save to db
$em->persist($rev);
$em->flush();
$data = [
'rating' => $rev->getRating(),
'message' => $rev->getMessage(),
];
return new APIResponse(true, 'Review added', $data);
}
}