src/Controller/MobileApi/V2/Beauty/Offer/GetMastersWithFilterAction.php line 17

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Slivki\Controller\MobileApi\V2\Beauty\Offer;
  4. use Nelmio\ApiDocBundle\Annotation\Model;
  5. use OpenApi\Annotations as OA;
  6. use Slivki\Message\Query\Beauty\Offer\GetMastersWithFilterQuery;
  7. use Slivki\Messenger\Query\QueryBusInterface;
  8. use Slivki\Request\Beauty\Master\MasterWithFilterRequest;
  9. use Slivki\Response\Beauty\Offer\MasterResponse;
  10. use Slivki\ValueObject\Coordinate;
  11. use Symfony\Component\HttpFoundation\JsonResponse;
  12. use Symfony\Component\Routing\Annotation\Route;
  13. final class GetMastersWithFilterAction
  14. {
  15.     private QueryBusInterface $queryBus;
  16.     public function __construct(QueryBusInterface $queryBus)
  17.     {
  18.         $this->queryBus $queryBus;
  19.     }
  20.     /**
  21.      * @Route("/mobile/api/v2/beauty/offer/{offerId}/masters_with_filter", methods={"GET"}, name="mobile_api_v2_beauty_offer_masters_with_filter_get")
  22.      * @OA\Tag(name="Beauty"),
  23.      *
  24.      * @OA\Response(
  25.      *     response=200,
  26.      *     description="Все мастера акции с пагинацией",
  27.      *     @OA\JsonContent(
  28.      *             type="array",
  29.      *             @OA\Items(
  30.      *                 @OA\Property(
  31.      *                     property="items",
  32.      *                     type="array",
  33.      *                     description="Мастер",
  34.      *                     @OA\Items(ref=@Model(type=MasterResponse::class)),
  35.      *                 ),
  36.      *                 @OA\Property(
  37.      *                     property="total",
  38.      *                     description="Количество мастеров",
  39.      *                     example=185,
  40.      *                 ),
  41.      *             ),
  42.      *         ),
  43.      *     ),
  44.      * ),
  45.      *
  46.      * @OA\Parameter(
  47.      *     name="offerId",
  48.      *     in="path",
  49.      *     description="The ID of the offer",
  50.      *     @OA\Schema(type="integer", example=12345, nullable=false),
  51.      * ),
  52.      * @OA\Parameter(
  53.      *     name="page",
  54.      *     in="query",
  55.      *     description="Страница",
  56.      *     required=false,
  57.      *     @OA\Schema(type="integer"),
  58.      * ),
  59.      * @OA\Parameter(
  60.      *     name="perPage",
  61.      *     in="query",
  62.      *     description="Лимит",
  63.      *     required=false,
  64.      *     @OA\Schema(type="integer"),
  65.      * ),
  66.      * @OA\Parameter(
  67.      *      name="level",
  68.      *      in="query",
  69.      *      description="Уровень мастера",
  70.      *      required=false,
  71.      *      @OA\Schema(type="integer"),
  72.      *  ),
  73.      * @OA\Parameter(
  74.      *      name="longitude",
  75.      *      in="query",
  76.      *      description="The user's longitude",
  77.      *      @OA\Schema(type="float", example=27.557008, default=null, nullable=true),
  78.      * ),
  79.      * @OA\Parameter(
  80.      *      name="latitude",
  81.      *      in="query",
  82.      *      description="The user's latitude",
  83.      *      @OA\Schema(type="float", example=53.911724, default=null, nullable=true),
  84.      * ),
  85.      */
  86.     public function __invoke(MasterWithFilterRequest $requestint $offerId): JsonResponse
  87.     {
  88.         return new JsonResponse(
  89.             $this->queryBus->handle(
  90.                 new GetMastersWithFilterQuery(
  91.                     $offerId,
  92.                     $request->getPage(),
  93.                     $request->getPerPage(),
  94.                     $request->getLevel(),
  95.                     $request->getLatitude() === null || $request->getLongitude() === null
  96.                         null
  97.                         : new Coordinate($request->getLatitude(), $request->getLongitude()),
  98.                 ),
  99.             ),
  100.         );
  101.     }
  102. }