Newer
Older
<?php
declare(strict_types=1);
namespace App\Controller;
use App\Requests\RestaurantListRequest;
use Exception;
use App\Service\RestaurantService;
use Nelmio\ApiDocBundle\Annotation\Model;
use OpenApi\Attributes as OA;
use OpenApi\Attributes\Schema;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Attribute\Route;
use App\Model\RestaurantList;
use Symfony\Component\Serializer\SerializerInterface;
#[Route("/api/v1")]
class RestaurantController extends AbstractController
{
public function __construct(private RestaurantService $restaurantService) {}
#[Route('/restaurants', name: 'restaurants', methods: ['GET'])]
#[OA\Response(response: 200, description: "Листинг ресторанов")]
#[OA\Parameter(
name: "page",
description: "Номер страницы",
in: "query",
schema: new Schema(type: "integer", default: 1, example: 1)
)]
#[OA\Parameter(
name: "limit",
description: "Лимит",
in: "query",
schema: new Schema(type: "integer", default: 12, example: 12)
)]
#[OA\Parameter(
name: "restaurant_type_id",
description: "Идентификатор типа ресторанов",
in: "query",
schema: new Schema(type: "integer")
)]
#[OA\Parameter(
name: "kitchen_id",
description: "Идентификатор кухни",
in: "query",
schema: new Schema(type: "integer")
)]
#[Model(type: RestaurantList::class)]
public function restaurants(RestaurantListRequest $request): Response
$page = $request->getRequest()->query->get('page');
$limit = $request->getRequest()->query->get('limit');
$restaurantTypeId = $request->getRequest()->query->get('restaurant_type_id');
$kitchenId = $request->getRequest()->query->get('kitchen_id');
$restaurantsList = $this->restaurantService->getRestaurants(
$page, $limit, $restaurantTypeId, $kitchenId
);
return $this->json($restaurantsList);
}
#[Route('/restaurants/{restaurantId}', name: 'restaurant', methods: ['GET'])]
public function restaurant(Request $request, SerializerInterface $serializer): Response
try {
$restaurantId = (int)$request->get('restaurantId');
$restaurant = $this->restaurantService->getRestaurant($restaurantId);
$json = $serializer->serialize($restaurant, 'json', [
'circular_reference_handler' => function ($object) {
return $object->getId();
}
]);
return new Response($json, Response::HTTP_OK, ['Content-Type' => 'application/json']);
} catch (Exception $e) {
return new Response($e->getMessage(), $e->getCode());
}