<?php
namespace App\Controller;
use App\Exception\ValidationException;
use App\Service\ActionAttemptManager;
use App\Service\Emailer;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Translation\TranslatorInterface;
class FrontendController extends AbstractController
{
function contactForm(Request $request) {
$session = $request->getSession();
$keys = $session->get('captcha_whitelist_key', []);
if (!in_array('contact', $keys)) {
$keys[] = 'contact';
}
$session->set('captcha_whitelist_key', $keys);
return $this->render('incs/contact.html.twig');
}
/**
* @Route("/contact", methods={"POST"})
*/
function contact(Request $request, Emailer $emailer, TranslatorInterface $translator, ActionAttemptManager $attemptManager) {
$body = $request->getContent();
$json = json_decode($body, true);
$ipGood = $attemptManager->checkIpCategory($request->getClientIp());
if (!$ipGood) {
throw new ValidationException('', $translator->trans('err.ip_blocked'));
}
// check captcha
$captchaReq = $json['captcha'];
$captchaSession = $request->getSession()->get('contact');
$captchaSession = $captchaSession['phrase'] ?? null;
if ($captchaSession !== $captchaReq) {
throw new ValidationException('captcha', $translator->trans('err.captcha_invalid'));
}
$emailer->sendContactMessage($json);
return $this->json([
'success' => true,
'data' => $json
]);
}
function localeRedirect(Request $request) {
return $this->redirectToRoute('home', ['_locale' => $request->getLocale()]);
}
function languageBar(Request $request) {
$availableLocales = explode('|', $this->getParameter('available_locales'));
return $this->render('incs/languageBar.html.twig', [
'locale' => $request->getLocale(),
'available_locales' => $availableLocales,
]);
}
/**
* @Route("/translations", name="json_translations")
*/
function jsTranslations(Request $request, TranslatorInterface $translator) {
$locale = $request->getLocale();
$catalog = $translator->getCatalogue($locale);
$catalogs = $catalog->all();
$messages = $catalogs['messages'];
if (isset($catalogs['menu'])) {
$messages = array_merge($messages, $catalogs['menu']);
}
$messagesOut = '';
foreach ($messages as $key => $trans) {
$trans = str_replace(['@', '"'], ['{\'@\'}', '\"'], $trans);
$messagesOut .= '"' . $key . '": "' . $trans . '",';
}
$out = 'const APP_TRANSLATIONS = {"' . $locale . '": {' . $messagesOut . '}}';
$response = new Response($out, 200, [
'Content-Type' => 'application/javascript; charset=UTF-8',
]);
$response->setCharset('utf-8');
return $response;
}
/**
* @Route("/translations.json")
*/
function jsonTranslations(Request $request, TranslatorInterface $translator) {
$locale = $request->getLocale();
$catalog = $translator->getCatalogue($locale);
$catalogs = $catalog->all();
$messages = $catalogs['messages'];
if (isset($catalogs['menu'])) {
$messages = array_merge($messages, $catalogs['menu']);
}
$messagesOut = [];
foreach ($messages as $key => $trans) {
$trans = str_replace('@', '{\'@\'}', $trans);
$messagesOut[$key] = $trans;
}
return $this->json($messagesOut);
}
}