<?php
declare(strict_types=1);
namespace BitBag\OpenMarketplace\Component\Core\Shop\Controller\Vendor;
use BitBag\OpenMarketplace\Component\Elasticsearch\Finder\VendorProductsFinderInterface;
use BitBag\OpenMarketplace\Component\Elasticsearch\Form\Resolver\ListProductsFacetsResolverInterface;
use BitBag\OpenMarketplace\Component\Elasticsearch\Form\Type\ListProductsType;
use BitBag\OpenMarketplace\Component\Elasticsearch\Provider\RedirectResponseProviderInterface;
use BitBag\OpenMarketplace\Component\Vendor\Entity\VendorInterface;
use BitBag\OpenMarketplace\Component\Vendor\Repository\VendorRepositoryInterface;
use Sylius\Component\Core\Formatter\StringInflector;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Twig\Environment;
final class IndexAction
{
public function __construct(
private VendorRepositoryInterface $vendorRepository,
private VendorProductsFinderInterface $vendorProductsFinder,
private Environment $twig,
private FormFactoryInterface $formFactory,
private ListProductsFacetsResolverInterface $facetsResolver,
private RedirectResponseProviderInterface $redirectResponseProvider,
) {
}
public function __invoke(Request $request): Response
{
$vendorSlug = $request->get('vendor_slug');
$redirectResponse = $this->redirectResponseProvider->provide($request, [
'vendor_slug' => $vendorSlug,
]);
if (null !== $redirectResponse) {
return $redirectResponse;
}
$vendor = $this->vendorRepository->findOneBySlug($vendorSlug);
if (!$vendor instanceof VendorInterface || false === $vendor->isEnabled()) {
throw new NotFoundHttpException(sprintf('Vendor with slug "%s" was not found.', $vendorSlug));
}
$data = [
'vendor_name' => StringInflector::nameToLowercaseCode($vendor->getCompanyName() ?? ''),
'name' => null,
];
$form = $this->formFactory->create(ListProductsType::class, $data, [
'facets_resolver' => $this->facetsResolver,
]);
$form->handleRequest($request);
$data = array_merge(
$data,
$form->getData(),
$request->query->all(),
);
$products = $this->vendorProductsFinder->find($data);
return new Response($this->twig->render('Context/Vendor/VendorPage/index.html.twig', [
'form' => $form->createView(),
'products' => $products,
'vendor' => $vendor,
]));
}
}