src/Controller/VingeanneController.php line 50

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Service\VingeanneArchiveService;
  4. use App\Service\ArticleExportFileService;
  5. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\HttpFoundation\Response;
  8. use Symfony\Component\HttpFoundation\JsonResponse;
  9. class VingeanneController extends AbstractController
  10. {
  11.     private VingeanneArchiveService $vingeanneService;
  12.     private ArticleExportFileService $articleFileService;
  13.     public function __construct(
  14.         VingeanneArchiveService $vingeanneService,
  15.         ArticleExportFileService $articleFileService
  16.     ) {
  17.         $this->vingeanneService $vingeanneService;
  18.         $this->articleFileService $articleFileService;
  19.     }
  20.     /**
  21.      * Page d'accueil Vingeanne (Dashboard)
  22.      */
  23.     public function indexAction(): Response
  24.     {
  25.         try {
  26.             $stats $this->vingeanneService->getStatistics();
  27.         } catch (\Exception $e) {
  28.             $stats = [
  29.                 'total' => 0,
  30.                 'rea' => 0,
  31.                 'off' => 0,
  32.                 'inconnu' => 0,
  33.                 'error' => $e->getMessage()
  34.             ];
  35.         }
  36.         return $this->render('@SyliusAdmin/Vingeanne/index.html.twig', [
  37.             'stats' => $stats
  38.         ]);
  39.     }
  40.     /**
  41.      * Files list page
  42.      */
  43.     public function filesListAction(): Response
  44.     {
  45.         return $this->render('@SyliusAdmin/Vingeanne/files_list.html.twig');
  46.     }
  47.     /**
  48.      * Load files via AJAX (API endpoint)
  49.      */
  50.     public function loadFilesAction(Request $request): JsonResponse
  51.     {
  52.         try {
  53.             $filters = [
  54.                 'type' => $request->query->get('type'),
  55.                 'name' => $request->query->get('name'),
  56.                 'dateFrom' => $request->query->get('dateFrom'),
  57.                 'dateTo' => $request->query->get('dateTo'),
  58.             ];
  59.             $page max(1, (int) $request->query->get('page'1));
  60.             $limit max(1min(100, (int) $request->query->get('limit'50)));
  61.             $offset = ($page 1) * $limit;
  62.             $result $this->vingeanneService->listFiles($filters$limit$offset);
  63.             
  64.             $data = [];
  65.             foreach ($result['data'] as $file) {
  66.                 $data[] = [
  67.                     'name' => $file['name'],
  68.                     'type' => $file['type'],
  69.                     'size' => $file['sizeFormatted'],
  70.                     'createdAt' => $file['createdAtFormatted'],
  71.                     'createdAtRaw' => $file['createdAt'] ? $file['createdAt']->format('Y-m-d H:i:s') : null,
  72.                 ];
  73.             }
  74.             $total $result['total'];
  75.             $pages $limit ? (int) ceil($total $limit) : 0;
  76.             return new JsonResponse([
  77.                 'success' => true,
  78.                 'data' => $data,
  79.                 'pagination' => [
  80.                     'total' => $total,
  81.                     'page' => $page,
  82.                     'limit' => $limit,
  83.                     'pages' => $pages
  84.                 ]
  85.             ]);
  86.         } catch (\Exception $e) {
  87.             return new JsonResponse([
  88.                 'success' => false,
  89.                 'error' => 'Erreur lors du chargement des fichiers: ' $e->getMessage()
  90.             ], Response::HTTP_INTERNAL_SERVER_ERROR);
  91.         }
  92.     }
  93.     /**
  94.      * Download a file
  95.      */
  96.     public function downloadFileAction(string $filename): Response
  97.     {
  98.         try {
  99.             $result $this->vingeanneService->downloadFile($filename);
  100.             if (!$result) {
  101.                 return new Response('Fichier introuvable ou erreur lors du tĂ©lĂ©chargement'Response::HTTP_NOT_FOUND);
  102.             }
  103.             $response = new Response($result['content']);
  104.             $response->headers->set('Content-Type''text/plain; charset=UTF-8');
  105.             $response->headers->set('Content-Disposition''attachment; filename="' $result['name'] . '"');
  106.             return $response;
  107.         } catch (\Exception $e) {
  108.             return new Response('Erreur: ' $e->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR);
  109.         }
  110.     }
  111.     /**
  112.      * Articles export files list page
  113.      */
  114.     public function articlesListAction(): Response
  115.     {
  116.         try {
  117.             $stats $this->articleFileService->getStatistics('articles/vingeanne');
  118.         } catch (\Exception $e) {
  119.             $stats = ['total' => 0'totalSize' => '0 B''error' => $e->getMessage()];
  120.         }
  121.         return $this->render('@SyliusAdmin/Vingeanne/articles_list.html.twig', [
  122.             'stats' => $stats
  123.         ]);
  124.     }
  125.     /**
  126.      * Load article files via AJAX
  127.      */
  128.     public function loadArticleFilesAction(Request $request): JsonResponse
  129.     {
  130.         try {
  131.             $filters = [
  132.                 'name' => $request->query->get('name'),
  133.                 'dateFrom' => $request->query->get('dateFrom'),
  134.                 'dateTo' => $request->query->get('dateTo'),
  135.             ];
  136.             $page max(1, (int) $request->query->get('page'1));
  137.             $limit max(1min(100, (int) $request->query->get('limit'50)));
  138.             $offset = ($page 1) * $limit;
  139.             $result $this->articleFileService->listArticleFiles('articles/vingeanne'$filters$limit$offset);
  140.             
  141.             $total $result['total'];
  142.             $pages $limit ? (int) ceil($total $limit) : 0;
  143.             return new JsonResponse([
  144.                 'success' => true,
  145.                 'data' => $result['data'],
  146.                 'pagination' => [
  147.                     'total' => $total,
  148.                     'page' => $page,
  149.                     'limit' => $limit,
  150.                     'pages' => $pages
  151.                 ]
  152.             ]);
  153.         } catch (\Exception $e) {
  154.             return new JsonResponse([
  155.                 'success' => false,
  156.                 'error' => 'Erreur lors du chargement des fichiers: ' $e->getMessage()
  157.             ], Response::HTTP_INTERNAL_SERVER_ERROR);
  158.         }
  159.     }
  160.     /**
  161.      * Download an article export file
  162.      */
  163.     public function downloadArticleFileAction(string $filename): Response
  164.     {
  165.         try {
  166.             $result $this->articleFileService->downloadFile('articles/vingeanne'$filename);
  167.             if (!$result) {
  168.                 return new Response('Fichier introuvable'Response::HTTP_NOT_FOUND);
  169.             }
  170.             $response = new Response($result['content']);
  171.             $response->headers->set('Content-Type''text/plain; charset=UTF-8');
  172.             $response->headers->set('Content-Disposition''attachment; filename="' $result['name'] . '"');
  173.             return $response;
  174.         } catch (\Exception $e) {
  175.             return new Response('Erreur: ' $e->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR);
  176.         }
  177.     }
  178. }