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