<?php
declare(strict_types=1);
namespace AppBundle\Controller;
use AppBundle\Form\ContactFormType;
use AppBundle\Service\ReCaptchaService;
use Exception;
use Pimcore\Logger;
use Pimcore\Mail;
use Pimcore\Model\Document\Email;
use Pimcore\Translation\Translator;
use function Sentry\captureException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class ContactController 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('Contact/contact_mail.html.twig', $params);
}
public function defaultAction(Request $request, Translator $translator): Response
{
$form = $this->createForm(ContactFormType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
try {
$this->sendContactMail($data, $request, $translator);
$this->addFlash('success', $translator->trans('app.general.gemini.contactform.success'));
$form = $this->createForm(ContactFormType::class);
} catch (Exception $ex) {
captureException($ex);
Logger::error('Contact form mail error: ' . $ex->getMessage(), ['exception' => $ex]);
$this->addFlash('error', $ex->getMessage());
}
} elseif ($form->isSubmitted() && !$form->isValid()) {
$this->addFlash('error', $translator->trans('app.general.gemini.contactform.error'));
}
return $this->render('Contact/default.html.twig', [
'form' => $form->createView(),
'errors' => $form->getErrors(),
'googleRecaptchaSiteKey' => getenv('GOOGLE_RECAPTCHA_SITE_KEY') ?: '',
]);
}
/**
* @throws Exception
*/
private function sendContactMail(array $data, Request $request, Translator $translator): void
{
$mailTemplate = $this->document->getProperty('geminiContactMailTemplate');
$mailTarget = $this->document->getProperty('geminiContactMailTarget');
$recaptchaVerified = $this->reCaptchaService->verify((string) $request->get('g-recaptcha-response'));
if (empty($mailTemplate) || empty($mailTarget)) {
throw new Exception($translator->trans('app.general.gemini.contactform.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.contactform.contactemailsubject'));
$mail->from('stronakorporacyjna@gemini.pl');
$target = $this->getMailTarget($data['topic']);
if ($target) {
$mail->addTo($target);
} else {
$mail->addTo($mailTarget);
}
if (!empty($data['contactFile'])) {
$mail->createAttachment(file_get_contents($data['contactFile']->getPathname()), $data['contactFile']->getMimeType(), $data['contactFile']->getClientOriginalName());
}
try {
Logger::info('Contact mail sending to: ' . $mailTarget . ', topic: ' . ($data['topic'] ?? ''));
$mail->send();
} catch (Exception $ex) {
captureException($ex);
Logger::error('Contact mail send failed: ' . $ex->getMessage(), ['exception' => $ex]);
throw new Exception($translator->trans('app.general.gemini.contactform.mailnotsenterror'), $ex->getCode(), $ex);
}
}
private function getMailTarget(string $type)
{
$mailTargetSuppliers = $this->document->getProperty('geminiContactSuppliersMailTarget');
$mailTargetMedia = $this->document->getProperty('geminiContactMediaMailTarget');
$mailTargetRenting = $this->document->getProperty('geminiContactRentingMailTarget');
$mailTargetGDPR = $this->document->getProperty('geminiContactGdprMailTarget');
$mailTargetOffice = $this->document->getProperty('geminiContactOfficeMailTarget');
switch ($type) {
case 'office':
return $mailTargetOffice;
case 'suppliers':
return $mailTargetSuppliers;
case 'media':
return $mailTargetMedia;
case 'renting':
return $mailTargetRenting;
case 'GDPR':
return $mailTargetGDPR;
}
return null;
}
}