<?php
declare(strict_types=1);
namespace App\Controller;
use App\Entity\Card;
use App\Entity\Collection;
use App\Entity\User;
use App\Repository\UserRepository;
use Cocur\Slugify\Slugify;
use Knp\Bundle\SnappyBundle\Snappy\Response\PdfResponse;
use Knp\Snappy\Pdf;
use League\Csv\Writer;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\Routing\Annotation\Route;
class HomeController extends AbstractController
{
#[Route(path: '/download-user-data', name: 'download_user_data')]
public function downloadUserData(UserRepository $userRepository)
{
/** @var User $user */
$user = $this->getUser();
$response = new JsonResponse($userRepository->exportUser($user));
$response->setEncodingOptions($response->getEncodingOptions() | JSON_PRETTY_PRINT);
$response->setSharedMaxAge(60 * 10);
$response->headers->set('Content-Disposition', 'attachment; filename="cortex_user_data.json"');
return $response;
}
#[Route(path: '/export-collection/csv/{collection}', name: 'export_collection_csv')]
public function exportCollectionCsv(Collection $collection)
{
$csv = Writer::createFromFileObject(new \SplTempFileObject());
foreach ($collection->getCards() as $card) {
$csv->insertOne([
$card->getFrontText(),
$card->getBackText(),
]);
}
$response = new StreamedResponse();
$response->setCallback(fn() => print($csv->getContent()));
$response->headers->set('Content-Type', 'text/csv; charset=utf-8');
$response->headers->set(
'Content-Disposition',
'attachment; filename="' . $collection->getTitle() . '.csv"'
);
return $response;
}
#[Route(path: '/export-collection/pdf/{collection}', name: 'export_collection_pdf')]
public function exportCollectionPdf(Collection $collection, Pdf $snappy)
{
$slugify = new Slugify();
return new PdfResponse(
$snappy->getOutputFromHtml(
$this->renderView('collection/export-pdf.html.twig', ['collection' => $collection])
),
$slugify->slugify($collection->getTitle()) . '.pdf'
);
}
// page d'accueil (serve votre app React/Twig pour route '/')
#[Route(path: '/', name: 'home')]
// catch-all pour le front React, excluant login, logout, api, admin, _wdt, _profiler
#[Route(
path: '/{reactRouting}',
name: 'react_routing',
defaults: ['reactRouting' => null],
requirements: ['reactRouting' => '^(?!(login|logout|api|admin|_wdt|_profiler)).+']
)]
public function index()
{
return $this->render('home/index.html.twig', [
'controller_name' => 'HomeController',
]);
}
}