<?php
declare(strict_types=1);
namespace Slivki\MessageHandler\Query\Beauty\Offer;
use Slivki\Entity\GeoLocation;
use Slivki\Message\Query\Beauty\Offer\GetMastersQuery;
use Slivki\Repository\Beauty\Masters\BeautyMasterRepositoryInterface;
use Slivki\Repository\Offer\OfferRepositoryInterface;
use Slivki\Response\Beauty\Offer\Factory\MasterResponseFactory;
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
use function array_map;
final class GetMastersHandler implements MessageHandlerInterface
{
private OfferRepositoryInterface $offerRepository;
private BeautyMasterRepositoryInterface $beautyMasterRepository;
private MasterResponseFactory $responseFactory;
public function __construct(
OfferRepositoryInterface $offerRepository,
BeautyMasterRepositoryInterface $beautyMasterRepository,
MasterResponseFactory $responseFactory
) {
$this->offerRepository = $offerRepository;
$this->beautyMasterRepository = $beautyMasterRepository;
$this->responseFactory = $responseFactory;
}
public function __invoke(GetMastersQuery $query): array
{
$offer = $this->offerRepository->getById($query->getOfferId());
$geoLocationIds = array_map(
static fn (GeoLocation $geoLocation): int => $geoLocation->getID(),
$offer->getGeoLocations()->toArray(),
);
return array_map(
[$this->responseFactory, 'create'],
$this->beautyMasterRepository->findByGeoLocationIds($geoLocationIds),
);
}
}