/** * @param mixed $value * @param Constraint $constraint */ public function validate($value, Constraint $constraint) { /** @var Restaurant $restaurant */ $restaurant = $value; $name = $restaurant->getName(); $lat = $restaurant->getLat(); $lng = $restaurant->getLng(); $id = $restaurant->getId(); if ($this->restaurantRepository->existsWithSimilarCoordinatesAndName($name, $lat, $lng, $id)) { $this->context->buildViolation($constraint->message)->atPath('name')->setParameter('%string%', $name)->addViolation(); } }
/** * @ApiDoc( * description="New Batch of Reviews", * statusCodes={201="Batch of Reviews"}, * section="Review", * parameters={ * {"name"="restaurants", "dataType"="integer", "required"=true } * }) * @Route("/api/reviews/batch") * @Method({"POST"}) * @return View */ public function batchInsertAction() { $user = $this->getUser(); $positions = array(); $request = $this->requestStack->getCurrentRequest(); $ids = $request->request->get('restaurants'); $restaurants = $this->restaurantRepository->getByIds($ids); $reviews = array(); /** @var Restaurant $restaurant */ foreach ($restaurants as $restaurant) { if (null === $restaurant->getGeoname() || null === $restaurant->getCuisine()) { continue; } if (isset($positions[$restaurant->getRankingKey()])) { $positions[$restaurant->getRankingKey()]++; } else { $positions[$restaurant->getRankingKey()] = 1; } $review = new Review(); $review->setGeoname($restaurant->getGeoname()); $review->setCost($restaurant->getAverageCost()); $review->setCuisine($restaurant->getCuisine()); $review->setPosition($positions[$restaurant->getRankingKey()]); $review->setUser($user); $review->setComment(''); $review->setRestaurant($restaurant); $reviews[] = $review; $this->validate($review); $user->incrementReviewsCount(); $this->entityManager->persist($review); $this->cacheManager->invalidateOnInsert($review); } $this->entityManager->flush(); return $this->view(array('reviews' => $reviews), 201); }
/** * @ApiDoc( * description="Restaurant list", * statusCodes={200="Restaurant"}, * section="Restaurant", * filters={ * {"name"="name", "dataType"="string", "required"=true}, * {"name"="cuisine", "dataType"="string", "required"=false, "pattern"="not_null"}, * {"name"="averageCost", "dataType"="string", "required"=false, "pattern"="not_null"}, * {"name"="geoname", "dataType"="integer", "required"=false}, * {"name"="lat", "dataType"="string", "required"=false}, * {"name"="lng", "dataType"="string", "required"=false}, * {"name"="maxDistance", "dataType"="integer", "required"=false}, * {"name"="orderBy", "dataType"="string", "required"="false", "pattern"="score|distance"}, * {"name"="page", "dataType"="string", "required"=false} * }) * @Route("/api/restaurants") * @Cache(maxage="+1 week", public=true) * @Method({"GET"}) * @return View */ public function getAllAction() { $request = $this->requestStack->getCurrentRequest(); $pager = $this->restaurantRepository->getRestaurantsPager($request); $this->cacheManager->tagController($request, CacheTag::RESTAURANT); return $this->view($this->getPagedViewData($pager, 'restaurants')); }