<?php
namespace App\Controller;
use App\Form\FundForm;
use App\Service\TessituraBundle\AddNotAvailableException;
use App\Service\TessituraBundle\CartService;
use App\Service\TessituraBundle\Entity\CateringItemPerformance;
use App\Service\TessituraBundle\FundService;
use App\Service\TessituraBundle\Item\CartItemContribution;
use App\Service\TessituraBundle\PackageService;
use App\Service\TessituraSDK\TessituraClient;
use App\Service\TessituraSDK\TessituraClientException;
use Psr\Cache\CacheItemPoolInterface;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Cache\Adapter\TagAwareAdapterInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Form\FormError;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Exception\InvalidCsrfTokenException;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\SerializerInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
class FundController extends AbstractController
{
/**
* @var TessituraClient
*/
private $client;
/**
* @var Serializer
*/
private $serializer;
/**
* @var CacheItemPoolInterface|TagAwareAdapterInterface
*/
private $cache;
/**
* @var TranslatorInterface
*/
private $translator;
/**
* @var ParameterBagInterface
*/
private $params;
/**
* CartController constructor.
*
* @param TessituraClient $client
* @param SerializerInterface $serializer
* @param ContainerInterface $container
* @param TranslatorInterface $translator
* @param ParameterBagInterface $params
*/
public function __construct(
TessituraClient $client,
SerializerInterface $serializer,
ContainerInterface $container,
TranslatorInterface $translator,
ParameterBagInterface $params
) {
$this->client = $client;
$this->serializer = $serializer;
$this->container = $container;
$this->cache = $container->get('cache.app');
$this->translator = $translator;
$this->params = $params;
}
/**
* @Route(
* "/{_locale}/fund/",
* name="fund",
* defaults={
* "_locale": "fi"
* },
* requirements={
* "_locale": "fi|sv|en"
* }
* )
* @param Request $request
* @param CartService $cartService
*
* @return \Symfony\Component\HttpFoundation\Response
*/
public function fundAction(Request $request, FundService $fundService, CartService $cartService)
{
$items = $fundService->getAvailable();
$items = array_filter($items, function ($item) {
// remove opera beyond (15)
// remove ballet slippers fund (16)
$removedFunds = [15, 16];
if (!in_array($item->getId(), $removedFunds)) {
return $item;
}
});
$orderedItems = $fundService->orderItems($items);
$defaultDonationValues = $this->params->get('app.default_donation_amounts');
$formViews = $this->createFundForms($orderedItems);
return $this->render('page/fund.html.twig', [
'ordered_items' => $orderedItems,
'items' => $items,
'amounts' => $defaultDonationValues,
'forms' => $formViews
]);
}
/**
* @param array $items
* @return array
*/
public function createFundForms(array $items)
{
$forms = [];
foreach ($items as $i => $array) {
$forms[] = array_map(function ($item) {
return $this->createForm(FundForm::class, [$item->getId()])->createView();
}, $array);
}
return $forms;
}
/**
* @Route(
* "/{_locale}/fund/api/v1/fund-add/{fundId}/",
* name="post-api-fund-add",
* defaults={
* "_locale": "fi"
* },
* requirements={
* "_locale": "fi|sv|en"
* },
* methods={"POST"}
* )
* @param Request $request
* @param CartService $cartService
* @param $fundId
*
* @return JsonResponse
* @throws \Psr\Cache\InvalidArgumentException
*/
public function addToCartAction(Request $request, CartService $cartService, $fundId)
{
$amount = $request->get('amount');
$token = $request->get('token');
$fundId = (int) $fundId;
if (!$this->isCsrfTokenValid($fundId, $token)) {
throw new InvalidCsrfTokenException('Invalid CSRF token.');
}
if ($amount > $this->params->get('tessitura.donation_max_value')) {
return new JsonResponse([
'success' => false,
'message' => $this->translator->trans('fund_add_failure')
]);
}
try {
$cartService->evaluateFundsInCart(CartItemContribution::class, $fundId);
} catch (AddNotAvailableException $exception) {
if ($fundId == $this->params->get('tessitura.donation_fund')) {
return new JsonResponse([
'success' => false,
'message' => $this->translator->trans('fund_in_cart_error')
]);
} else {
return new JsonResponse([
'success' => false,
'message' => $this->translator->trans('fund_other_in_cart_error')
]);
}
}
try {
$cartService->addContribution($amount, $fundId);
} catch (TessituraClientException $exception) {
return new JsonResponse([
'success' => false,
'message' => $this->translator->trans('fund_add_failure')
]);
}
return new JsonResponse([
'success' => true,
'redirect' => $this->generateUrl('cart'),
]);
}
}