<?php
namespace App\Controller\Frontend;
use App\Application\Artikel\ArtikelFrontendData;
use App\Application\Artikel\ArtikelService;
use App\Application\Artikel\ArtikelServiceQuery;
use App\Application\Dossier\DossierFrontendData;
use App\Application\Dossier\DossierService;
use App\Entity\Dossier\Exceptions\DossierNotExistsException;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
#[Route(path: '/dossier')]
#[Cache(expires: '+10 minutes')]
class DossierController extends AbstractController
{
#[Route(path: '/', name: 'fe.dossiers')]
public function dossiers(DossierService $dossierService, ArtikelService $artikelService): Response
{
$dossiers = $dossierService->findAll(new DossierFrontendData());
// fetch first article for each dossier
foreach ($dossiers as $key => $dossier) {
$dossiers[$key]['artikel'] = [];
$query = new ArtikelServiceQuery(1, 1);
$query->addFilterOneOfStatusOnly(['publiziert']);
$query->addFilterOneOfDossierOnly([$dossier['id']]);
$query->addSort('publish_at', 'desc');
$res = $artikelService->findArtikels(new ArtikelFrontendData(), $query);
if ($res) {
$dossiers[$key]['artikel'] = reset($res);
}
}
return $this->render('frontend/dossier/dossiers.html.twig', [
'dossiers' => $dossiers,
]);
}
#[Route(path: '/{slug}', name: 'fe.dossier-artikel')]
public function dossierArtikel(Request $request, $slug, DossierService $dossierService, ArtikelService $artikelService): Response
{
// Validierung aller möglichen URL-Parameter sonst Fehler (Page- und ApiClientCache Cache Schutz)
if (($urlParams = array_keys($request->query->all())) && ($diff_ = array_diff($urlParams, ['pg']))) {
throw $this->createNotFoundException(sprintf('Suche mit nicht konfiguriertem URL Parameter abgesetzt: %s', implode(',', $diff_)));
}
// Ende
$pageSize = 12;
$pageNumber = $request->query->getInt('pg', 1);
try {
$dossier = $dossierService->getDossierBySlug($slug, new DossierFrontendData());
} catch (DossierNotExistsException $exception) {
throw $this->createNotFoundException('Dossier does not exist');
}
$query = new ArtikelServiceQuery($pageSize, $pageNumber, false);
$query->addFilterOneOfStatusOnly(['publiziert']);
$query->addFilterOneOfDossierOnly([$dossier['id']]);
$query->addSort('publish_at', 'desc');
$artikels = $artikelService->findArtikels(new ArtikelFrontendData(), $query);
$paging = [
'page_size' => $query->getPageSize(),
'page_curr' => $query->getPageNr(),
'page_prev' => $query->getPageNr() == 1 ? null : $query->getPageNr() - 1,
'page_next' => $query->getPageNextExist() ? $query->getPageNr() + 1 : null,
];
return $this->render('frontend/dossier/dossier_artikel.html.twig', [
'dossier' => $dossier,
'artikels' => $artikels,
'paging' => $paging,
]);
}
}