<?php
namespace App\Controller\Frontend;
use App\Application\Content\ContentFrontendData;
use App\Application\Content\ContentService;
use App\Application\Einsendung\EinsendungService;
use App\Entity\Einsendung\Leserbrief;
use App\Entity\Einsendung\Nachruf;
use App\Entity\Einsendung\Todesanzeige;
use App\Entity\Einsendung\Vereinsbeitrag;
use App\Form\Einsendung\LeserbriefType;
use App\Form\Einsendung\NachrufType;
use App\Form\Einsendung\TodesanzeigeType;
use App\Form\Einsendung\VereinsbeitragType;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Finder\Finder;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Validator\Constraints\Image;
use Symfony\Component\Validator\Validator\ValidatorInterface;
#[Route(path: '/einsendungen')]
class EinsendungController extends AbstractController
{
#[Route(path: '/', name: 'fe.page_einsendungen')]
public function einsendungen(ContentService $contentService): Response
{
$content = $contentService->getContentByCode('EINSENDUNGEN', new ContentFrontendData(), true);
return $this->render('frontend/page/page-template.html.twig', [
'h1_title' => 'Einsendungen',
'content' => $content,
]);
}
#[Route(path: '/einsendung-ok', name: 'fe.einsendung_ok')]
public function meldenOk(): Response
{
return $this->render('frontend/einsendung/einsendung-ok.html.twig');
}
#[Route(path: '/leserbrief', name: 'fe.einsendung_leserbrief')]
public function leserbrief(
Request $request,
EinsendungService $einsendungService
): Response {
$leserbrief = new Leserbrief();
$form = $this->createForm(LeserbriefType::class, $leserbrief);
$form->handleRequest($request);
// dump($form->getData());
if ($form->isSubmitted() && $form->isValid()) {
$einsendungService->sendLeserbrief($leserbrief);
return $this->redirectToRoute('fe.einsendung_ok');
}
return $this->render('frontend/einsendung/einsendung.html.twig', [
'entity' => $leserbrief,
'form' => $form->createView(),
'template' => 'leserbrief.html.twig',
]);
}
#[Route(path: '/vereinsbeitrag', name: 'fe.einsendung_vereinsbeitrag')]
public function vereinsbeitrag(
Request $request,
EinsendungService $einsendungService
): Response {
$vereinsbeitrag = new Vereinsbeitrag();
$form = $this->createForm(VereinsbeitragType::class, $vereinsbeitrag);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$einsendungService->sendVereinsbeitrag($vereinsbeitrag);
return $this->redirectToRoute('fe.einsendung_ok');
}
return $this->render('frontend/einsendung/einsendung.html.twig', [
'entity' => $vereinsbeitrag,
'form' => $form->createView(),
'template' => 'vereinsbeitrag.html.twig',
]);
}
#[Route(path: '/todesanzeige', name: 'fe.einsendung_todesanzeigen')]
public function todesanzeige(
Request $request,
EinsendungService $einsendungService
): Response {
$todesanzeige = new Todesanzeige();
$form = $this->createForm(TodesanzeigeType::class, $todesanzeige);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$einsendungService->sendTodesanzeige($todesanzeige);
return $this->redirectToRoute('fe.einsendung_ok');
}
return $this->render('frontend/einsendung/einsendung.html.twig', [
'entity' => $todesanzeige,
'form' => $form->createView(),
'template' => 'todesanzeige.html.twig',
]);
}
#[Route(path: '/nachruf', name: 'fe.einsendung_nachruf')]
public function nachruf(
Request $request,
EinsendungService $einsendungService
): Response {
$nachruf = new Nachruf();
$form = $this->createForm(NachrufType::class, $nachruf);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$einsendungService->sendNachruf($nachruf);
return $this->redirectToRoute('fe.einsendung_ok');
}
return $this->render('frontend/einsendung/einsendung.html.twig', [
'entity' => $nachruf,
'form' => $form->createView(),
'template' => 'nachruf.html.twig',
]);
}
#[Route(path: '/fileupload/{action}', name: 'fe.einsendung_jqueryfileupload')]
public function jqueryFileUpload(Request $request, $action, LoggerInterface $logger, ValidatorInterface $validator, KernelInterface $kernel): JsonResponse
{
if (!$action) {
throw new \InvalidArgumentException('Action nicht definiert! Benötigt zur korrekten Ablage des hochgeladenen Files auf dem Server.');
}
$return_ = [
'success' => null,
'msg' => '',
'uploadedFileWebPath' => null,
'requestQueryParams' => $request->query->all(), // Alle URL Übergabeparameter zurückgeben zur möglichen Hilfe und Weiterverwendung in Frontend
];
try {
/**
* @var UploadedFile $uploadedFile
*/
foreach ($request->files as $uploadedFile) {
switch ($action) {
case 'IMAGE_FRONTEND':
$uuid = $request->query->get('uuid');
$formGroupId = $request->query->get('formGroupId');
if (!$uuid) {
throw new \InvalidArgumentException('URL Parameter "uuid" leer oder nicht vorhanden!');
}
// Validierung Bildupload
$violations = $validator->validate($uploadedFile, [
new Image(['maxSize' => '5Mi', 'maxWidth' => 5120, 'mimeTypes' => ['image/jpeg', 'image/png', 'image/gif']]), // 5120 als Schutz
]);
if (0 !== count($violations)) {
$return_['success'] = false;
foreach ($violations as $violation) {
$return_['msg'] .= $violation->getMessage();
}
} else {
$saveDirPath = $kernel->getProjectDir().'/var/data/public/einsendung/images';
// directory protection/security for overloading: delete all images bevor
$fs = new Filesystem();
if ($fs->exists($saveDirPath)) {
// Lösche Dateien mit derselben UID. Gibt Probleme wenn mehrere Files
// $finder = new Finder();
// $finder->files()->in($saveDirPath)->name('*'.$uuid.'*');
// foreach ($finder as $file) {
// $fs->remove($file->getPathname());
// }
// Lösche alle Dateien die älter als 1 Stunde
$finder = new Finder();
$finder->files()->in($saveDirPath)->date('before 1 hour ago');
foreach ($finder as $file) {
$fs->remove($file->getPathname());
}
}
// end
// Erstelle neuen "sauberen", fixen Filename
$newFileName = $uuid.'-'.mt_rand(1000, 9999).'.'.$uploadedFile->getClientOriginalExtension();
$webPathToFile = $request->getBasePath().'/data/einsendung/images/'.$newFileName;
// Datei in Projektverzeichnis speichern
$uploadedFile->move($saveDirPath, $newFileName);
// Webpath zum hochgeladenen File
$return_['filename'] = $newFileName;
$return_['success'] = true;
$return_['uploadedFileWebPath'] = $webPathToFile;
}
break;
default:
throw new \InvalidArgumentException('File-Action "'.$action.'" nicht definiert oder ungültig!');
}
}
} catch (\InvalidArgumentException $e) {
$return_['success'] = false;
$return_['msg'] = $e->getMessage();
} catch (\Exception $e) {
$logger->critical($e->getMessage());
$return_['success'] = false;
$return_['msg'] = 'Es ist ein Fehler beim Dateiupload passiert. Bitte versuchen Sie es noch einmal.';
}
return new JsonResponse($return_);
}
}