<?php
namespace App\Controller;
use App\Form\ContactType;
use App\Service\APIKiwi;
use JMS\Serializer\SerializerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Response;
use JMS\Serializer\SerializationContext;
use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
class ContactController extends AbstractController
{
/**
* @var APIKiwi
*/
private APIKiwi $APIKiwi;
/**
* @var SerializerInterface
*/
private SerializerInterface $serializer;
/**
* @var LoggerInterface
*/
private LoggerInterface $logger;
/**
* @var TranslatorInterface
*/
private TranslatorInterface $translator;
/**
* ContactController constructor.
* @param APIKiwi $APIKiwi
* @param SerializerInterface $serializer
* @param LoggerInterface $logger
* @param TranslatorInterface $translator
*/
public function __construct(
APIKiwi $APIKiwi,
SerializerInterface $serializer,
LoggerInterface $logger,
TranslatorInterface $translator
)
{
$this->APIKiwi = $APIKiwi;
$this->serializer = $serializer;
$this->logger = $logger;
$this->translator = $translator;
}
/**
* @Route("/contact", name="kiwi_contact")
* @param Request $request
* @return RedirectResponse|Response
* @throws TransportExceptionInterface
*/
public function index(Request $request)
{
$form = $this->createForm(ContactType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$contact = $this->serializer->serialize(
$form->getData(),
'json',
SerializationContext::create()->setGroups(
['contact']
)
);
try {
$response = $this->APIKiwi->postPublic($contact, 'contacts');
$response->getContent();
$this->addFlash('success', $this->translator->trans("default.contact_form.sent", [], "messages"));
return $this->redirectToRoute('kiwi_homepage');
} catch (ClientExceptionInterface $e) {
$content = json_decode($response->getContent(false), true);
if( isset($content['@type']) && $content['@type'] === 'ConstraintViolationList' && isset($content['violations'])) {
foreach ($content['violations'] as $violation) {
$this->addFlash(
'warning',
sprintf("%s : %s",
$this->translator->trans(sprintf('api.validation.properties.%s', $violation['propertyPath']), [], 'api'),
$this->translator->trans(sprintf('api.validation.codes.%s', $violation['code']), [], 'api')
)
);
}
} else {
$this->logger->error(sprintf("%s : %s", 'ClientException', $e->getMessage()), $e->getTrace());
$this->addFlash('warning', $this->translator->trans("api.validation.errors.generic", [], "api"));
}
} catch (\Exception $e) {
$this->logger->error(sprintf("%s : %s", get_class($e),$e->getMessage()), $e->getTrace());
$this->addFlash('warning', $this->translator->trans("api.validation.errors.generic", [], "api"));
}
}
return $this->render('contact/contact.html.twig', [
'form' => $form->createView(),
]);
}
}