<?php
declare(strict_types=1);
namespace Slivki\MessageHandler\Query\Beauty\Offer;
use Slivki\Message\Query\Beauty\Offer\GetMastersWithFilterQuery;
use Slivki\Paginator\Beauty\Master\MasterPaginatorInterface;
use Slivki\Response\Beauty\Offer\Factory\MasterResponseFactory;
use Slivki\Response\PaginateResponse;
use Slivki\Services\Beauty\BeautyMasterResponseDistanceUpdater;
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
use function array_map;
final class GetMastersWithFilterHandler implements MessageHandlerInterface
{
private MasterPaginatorInterface $masterPaginator;
private MasterResponseFactory $responseFactory;
private BeautyMasterResponseDistanceUpdater $beautyMasterResponseDistanceUpdater;
public function __construct(
MasterPaginatorInterface $masterPaginator,
MasterResponseFactory $responseFactory,
BeautyMasterResponseDistanceUpdater $beautyMasterResponseDistanceUpdater
) {
$this->masterPaginator = $masterPaginator;
$this->responseFactory = $responseFactory;
$this->beautyMasterResponseDistanceUpdater = $beautyMasterResponseDistanceUpdater;
}
public function __invoke(GetMastersWithFilterQuery $query): PaginateResponse
{
$pagination = $this->masterPaginator->findAllMasterForOfferQueryByFilter($query);
$masters = array_map(
[$this->responseFactory, 'create'],
(array) $pagination->getItems(),
);
$currentUserPosition = $query->getCurrentUserPosition();
if (null === $currentUserPosition) {
return new PaginateResponse(
$masters,
$pagination->getTotalItemCount(),
);
}
$updatedMasters = [];
foreach ($masters as $master) {
$updatedMasters[] = $this->beautyMasterResponseDistanceUpdater->updateMasterResponse($master, $currentUserPosition);
}
return new PaginateResponse(
$updatedMasters,
$pagination->getTotalItemCount(),
);
}
}