<?php
namespace App\Controller\Frontend;
use App\Application\Content\ContentFrontendData;
use App\Application\Content\ContentService;
use App\Application\InseratFormular\InseratFormularService;
use App\Entity\InseratFormular\Anschlagbrett;
use App\Entity\InseratFormular\Kleininserat;
use App\Form\InserateFormular\AnschlagbrettType;
use App\Form\InserateFormular\KleinInseratType;
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;
class InseratController extends AbstractController
{
#[Route(path: '/aschlagbraett', name: 'fe.page_aschlagbraett')]
public function aschlagbraett(ContentService $contentService): Response
{
$content = $contentService->getContentByCode('ASCHLAGBRAETT', new ContentFrontendData(), true);
return $this->render('frontend/page/page-template.html.twig', [
'h1_title' => 'Aschlagbrätt',
'content' => $content,
]);
}
#[Route(path: '/aschlagbraett/formular', name: 'fe.formular_anschlagbrett')]
public function anschlagbrettFormular(
Request $request,
InseratFormularService $inseratFormularService
): Response {
$anschlagbrett = new Anschlagbrett();
$form = $this->createForm(AnschlagbrettType::class, $anschlagbrett);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$inseratFormularService->sendAnschlagbrett($anschlagbrett);
return $this->redirectToRoute('fe.formular_anschlagbrett_gebucht');
}
return $this->render('frontend/inserat-formular/index.html.twig', [
'entity' => $anschlagbrett,
'form' => $form->createView(),
'template' => 'anschlagbrett.html.twig',
]);
}
#[Route(path: '/aschlagbraett/formular/gebucht', name: 'fe.formular_anschlagbrett_gebucht')]
public function anschlagbrettGebucht(): Response
{
return $this->render('frontend/inserat-formular/anschlagbrett-gebucht.html.twig');
}
#[Route(path: '/kleininserat', name: 'fe.page_kleininserat')]
public function kleininserat(ContentService $contentService): Response
{
$content = $contentService->getContentByCode('KLEININSERAT', new ContentFrontendData(), true);
return $this->render('frontend/page/page-template.html.twig', [
'h1_title' => 'Kleininserat',
'content' => $content,
]);
}
#[Route(path: '/kleininserat/formular', name: 'fe.formular_kleininserat')]
public function kleininseratFormular(
Request $request,
InseratFormularService $inseratFormularService
): Response {
$kleininserat = new Kleininserat();
$form = $this->createForm(KleinInseratType::class, $kleininserat);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$inseratFormularService->sendKleininserat($kleininserat);
return $this->redirectToRoute('fe.formular_kleininserat_gebucht');
}
return $this->render('frontend/inserat-formular/index.html.twig', [
'entity' => $kleininserat,
'form' => $form->createView(),
'template' => 'kleininserat.html.twig',
]);
}
#[Route(path: '/kleininserat/formular/gebucht', name: 'fe.formular_kleininserat_gebucht')]
public function kleininseratGebucht(): Response
{
return $this->render('frontend/inserat-formular/kleininserat-gebucht.html.twig');
}
#[Route(path: '/inserat-formular/fileupload/{action}', name: 'fe.inserat_formular_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/inserat-formular/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/inserat-formular/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_);
}
}