<?php
/*
* This file was created by developers working at BitBag
* Do you need more information about us and what we do? Visit our https://bitbag.io website!
* We are hiring developers from all over the world. Join us and start your new, exciting adventure and become part of us: https://bitbag.io/career
*/
declare(strict_types=1);
namespace BitBag\SyliusElasticsearchPlugin\Controller\Action\Api;
use BitBag\SyliusElasticsearchPlugin\Controller\Response\DTO\Item;
use BitBag\SyliusElasticsearchPlugin\Controller\Response\ItemsResponse;
use BitBag\SyliusElasticsearchPlugin\Finder\NamedProductsFinderInterface;
use BitBag\SyliusElasticsearchPlugin\Transformer\Product\TransformerInterface;
use Sylius\Component\Core\Model\ProductInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
final class ListProductsByPartialNameAction
{
/** @var NamedProductsFinderInterface */
private $namedProductsFinder;
/** @var TransformerInterface */
private $productSlugTransformer;
/** @var TransformerInterface */
private $productChannelPriceTransformer;
/** @var TransformerInterface */
private $productImageTransformer;
public function __construct(
NamedProductsFinderInterface $namedProductsFinder,
TransformerInterface $productSlugResolver,
TransformerInterface $productChannelPriceResolver,
TransformerInterface $productImageResolver
) {
$this->namedProductsFinder = $namedProductsFinder;
$this->productSlugTransformer = $productSlugResolver;
$this->productChannelPriceTransformer = $productChannelPriceResolver;
$this->productImageTransformer = $productImageResolver;
}
public function __invoke(Request $request): Response
{
$itemsResponse = ItemsResponse::createEmpty();
if (null === $request->query->get('query')) {
return JsonResponse::create($itemsResponse->toArray());
}
$products = $this->namedProductsFinder->findByNamePart($request->query->get('query'));
/** @var ProductInterface $product */
foreach ($products as $product) {
if (null === $productMainTaxon = $product->getMainTaxon()) {
continue;
}
$itemsResponse->addItem(new Item(
$productMainTaxon->getName(),
$product->getName(),
$product->getShortDescription(),
$this->productSlugTransformer->transform($product),
$this->productChannelPriceTransformer->transform($product),
$this->productImageTransformer->transform($product)
));
}
return JsonResponse::create($itemsResponse->toArray());
}
}