<?php
declare(strict_types=1);
namespace Slivki\Controller\MobileApi\V2\Beauty\Offer;
use Nelmio\ApiDocBundle\Annotation\Model;
use OpenApi\Annotations as OA;
use Slivki\Message\Query\Beauty\Offer\GetMastersWithFilterQuery;
use Slivki\Messenger\Query\QueryBusInterface;
use Slivki\Request\Beauty\Master\MasterWithFilterRequest;
use Slivki\Response\Beauty\Offer\MasterResponse;
use Slivki\ValueObject\Coordinate;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;
final class GetMastersWithFilterAction
{
private QueryBusInterface $queryBus;
public function __construct(QueryBusInterface $queryBus)
{
$this->queryBus = $queryBus;
}
/**
* @Route("/mobile/api/v2/beauty/offer/{offerId}/masters_with_filter", methods={"GET"}, name="mobile_api_v2_beauty_offer_masters_with_filter_get")
* @OA\Tag(name="Beauty"),
*
* @OA\Response(
* response=200,
* description="Все мастера акции с пагинацией",
* @OA\JsonContent(
* type="array",
* @OA\Items(
* @OA\Property(
* property="items",
* type="array",
* description="Мастер",
* @OA\Items(ref=@Model(type=MasterResponse::class)),
* ),
* @OA\Property(
* property="total",
* description="Количество мастеров",
* example=185,
* ),
* ),
* ),
* ),
* ),
*
* @OA\Parameter(
* name="offerId",
* in="path",
* description="The ID of the offer",
* @OA\Schema(type="integer", example=12345, nullable=false),
* ),
* @OA\Parameter(
* name="page",
* in="query",
* description="Страница",
* required=false,
* @OA\Schema(type="integer"),
* ),
* @OA\Parameter(
* name="perPage",
* in="query",
* description="Лимит",
* required=false,
* @OA\Schema(type="integer"),
* ),
* @OA\Parameter(
* name="level",
* in="query",
* description="Уровень мастера",
* required=false,
* @OA\Schema(type="integer"),
* ),
* @OA\Parameter(
* name="longitude",
* in="query",
* description="The user's longitude",
* @OA\Schema(type="float", example=27.557008, default=null, nullable=true),
* ),
* @OA\Parameter(
* name="latitude",
* in="query",
* description="The user's latitude",
* @OA\Schema(type="float", example=53.911724, default=null, nullable=true),
* ),
*/
public function __invoke(MasterWithFilterRequest $request, int $offerId): JsonResponse
{
return new JsonResponse(
$this->queryBus->handle(
new GetMastersWithFilterQuery(
$offerId,
$request->getPage(),
$request->getPerPage(),
$request->getLevel(),
$request->getLatitude() === null || $request->getLongitude() === null
? null
: new Coordinate($request->getLatitude(), $request->getLongitude()),
),
),
);
}
}