<?php
declare(strict_types=1);
namespace BitBag\OpenMarketplace\Component\ProductComparer\Controller;
use BitBag\OpenMarketplace\Component\Core\Common\Helper\FlashHelperInterface;
use BitBag\OpenMarketplace\Component\Product\Entity\ProductInterface;
use BitBag\OpenMarketplace\Component\Product\Repository\ProductRepositoryInterface;
use BitBag\OpenMarketplace\Component\ProductComparer\Event\MissingCookieException;
use BitBag\OpenMarketplace\Component\ProductComparer\Manager\ProductComparerManagerInterface;
use RuntimeException;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
final class AddToCompareAction
{
public function __construct(
private ProductRepositoryInterface $productRepository,
private ProductComparerManagerInterface $productComparerManager,
private FlashHelperInterface $flashHelper,
) {
}
public function __invoke(Request $request): Response
{
$product = $this->productRepository->find($request->get('productId'));
if (!$product instanceof ProductInterface) {
$this->flashHelper->addFlashMessage(
FlashHelperInterface::ERROR,
'app.product_compare.fail',
);
return $this->generateResponse($request);
}
try {
$this->productComparerManager->addProductToCompare($product);
} catch (RuntimeException) {
$this->flashHelper->addFlashMessage(
FlashHelperInterface::ERROR,
'app.product_compare.fail',
);
return $this->generateResponse($request);
} catch (MissingCookieException) {
$this->flashHelper->addFlashMessage(
FlashHelperInterface::ERROR,
'app.product_compare.missing_cookie',
);
return $this->generateResponse($request);
}
$this->flashHelper->addFlashMessage(
FlashHelperInterface::SUCCESS,
'app.product_compare.added',
);
return $this->generateResponse($request);
}
private function generateResponse(Request $request): Response
{
/** @var string $referer */
$referer = $request->headers->get('referer');
return new RedirectResponse($referer);
}
}