<?php
declare(strict_types=1);
namespace AppBundle\Controller;
use AppBundle\Form\MediaFormType;
use AppBundle\Service\ReCaptchaService;
use AppBundle\Website\LinkGenerator\MediaArticleLinkGenerator;
use Exception;
use Pimcore\Logger;
use Pimcore\Mail;
use Pimcore\Model\DataObject\MediaArticle;
use Pimcore\Model\DataObject\MediaArticle\Listing;
use Pimcore\Model\Document\Email;
use Pimcore\Translation\Translator;
use function Sentry\captureException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Annotation\Route;
class MediaController extends BaseController
{
private ReCaptchaService $reCaptchaService;
public function __construct(ReCaptchaService $reCaptchaService)
{
$this->reCaptchaService = $reCaptchaService;
}
public function mailAction(Request $request): Response
{
$params = [];
foreach ($request->attributes->all() as $key => $value) {
if (str_starts_with((string) $key, '_')) {
continue;
}
$params[$key] = $value;
}
return $this->render('Media/media_mail.html.twig', $params);
}
public function listAction(Request $request): Response
{
$keyword = $request->get('keyword');
$category = $request->get('category');
$mediaList = new Listing();
$mediaList->setOrderKey('date');
$mediaList->setOrder('desc');
return $this->render('Media/list.html.twig', [
'mediaList' => $mediaList,
'keyword' => $keyword,
'category' => $category,
]);
}
public function searchAction(Request $request, Translator $translator): Response
{
$keyword = $request->get('keyword');
$category = $request->get('category');
$message = null;
$mediaList = new Listing();
$mediaList->setOrderKey('date');
$mediaList->setOrder('desc');
if ($keyword && $category) {
$mediaList->setCondition('(title LIKE :keyword OR introtext LIKE :keyword OR content LIKE :keyword) AND category = :category', ['keyword' => '%' . $keyword . '%', 'category' => $category]);
} elseif (!$keyword && $category) {
$mediaList->setCondition('category = ?', $category);
} elseif ($keyword && !$category) {
$mediaList->setCondition('(title LIKE :keyword OR introtext LIKE :keyword OR content LIKE :keyword)', ['keyword' => '%' . $keyword . '%']);
}
if (0 == $mediaList->getTotalCount()) {
$mediaList = null;
$message = $translator->trans('app.general.gemini.media.search.error.noresults');
}
return $this->render('Media/search.html.twig', [
'mediaList' => $mediaList,
'keyword' => $keyword,
'category' => $category,
'message' => $message,
]);
}
/**
* @Route("{mediaarticles}/{articleslug}", name="mediaarticle-detail", defaults={"pathjoboffer"=""}, requirements={"mediaarticles":"media/artykuly", "articleslug"="[\w-]+"})
*/
public function detailAction(Request $request, MediaArticleLinkGenerator $mediaArticleLinkGenerator): Response
{
$keyword = $request->get('keyword');
$category = $request->get('category');
$urlSlug = $request->get('articleslug');
$article = MediaArticle::getByUrlSlug($urlSlug, ['limit' => 1]);
if (!($article instanceof MediaArticle && ($article->isPublished() || $this->verifyPreviewRequest($request, $article)))) {
throw new NotFoundHttpException('Article not found.');
}
return $this->render('Media/detail.html.twig', [
'article' => $article,
'keyword' => $keyword,
'category' => $category,
]);
}
public function defaultAction(Request $request, Translator $translator): Response
{
$keyword = $request->get('keyword');
$category = $request->get('category');
$mediaList = new Listing();
$mediaList->setOrderKey('date');
$mediaList->setOrder('desc');
$mediaList->setLimit(7);
$form = $this->createForm(MediaFormType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
try {
$this->sendMediaMail($data, $request, $translator);
$this->addFlash('success', $translator->trans('app.general.gemini.mediaform.success'));
$form = $this->createForm(MediaFormType::class);
} catch (Exception $ex) {
$this->addFlash('error', $ex->getMessage());
}
} elseif ($form->isSubmitted() && !$form->isValid()) {
$this->addFlash('error', $translator->trans('app.general.gemini.mediaform.error'));
}
return $this->render('Media/default.html.twig', [
'mediaList' => $mediaList,
'form' => $form->createView(),
'errors' => $form->getErrors(),
'keyword' => $keyword,
'category' => $category,
'googleRecaptchaSiteKey' => getenv('GOOGLE_RECAPTCHA_SITE_KEY') ?: '',
]);
}
/**
* @throws Exception
*/
private function sendMediaMail(array $data, Request $request, Translator $translator): void
{
$mailTemplate = $this->document->getProperty('geminiMediaMailTemplate');
$mailTarget = $this->document->getProperty('geminiMediaMailTarget');
$recaptchaVerified = $this->reCaptchaService->verify((string) $request->get('g-recaptcha-response'));
if (empty($mailTemplate) || empty($mailTarget)) {
throw new Exception($translator->trans('app.general.gemini.mediaform.formconfigurationerror'));
}
if (!$recaptchaVerified) {
throw new Exception($translator->trans('app.general.gemini.recaptcha.error'));
}
$mail = new Mail();
$mail->disableLogging();
$mail->setDocument(Email::getByPath($mailTemplate));
$mail->setParams($data);
$mail->setSubject($translator->trans('app.general.gemini.mediaform.mediamailsubject'));
$mail->from('stronakorporacyjna@gemini.pl');
$mail->addTo($mailTarget);
try {
Logger::info('Media mail sending to: ' . $mailTarget);
$mail->send();
} catch (Exception $ex) {
captureException($ex);
Logger::error('Media mail send failed: ' . $ex->getMessage(), ['exception' => $ex]);
throw new Exception($translator->trans('app.general.gemini.mediaform.mailnotsenterror'), $ex->getCode(), $ex);
}
}
}