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