diff --git a/Controller/ExportController.php b/Controller/ExportController.php index 266dba194..06600d14a 100644 --- a/Controller/ExportController.php +++ b/Controller/ExportController.php @@ -33,6 +33,8 @@ use Chill\MainBundle\Export\ExportManager; use Psr\Log\LoggerInterface; use Symfony\Component\HttpFoundation\Session\SessionInterface; use Symfony\Component\Form\FormFactoryInterface; +use Chill\MainBundle\Redis\ChillRedis; +use Symfony\Component\Translation\TranslatorInterface; /** * ExportController is the controller use for exporting data. @@ -66,16 +68,32 @@ class ExportController extends Controller */ protected $formFactory; + /** + * + * @var ChillRedis + */ + protected $redis; + + /** + * + * @var TranslatorInterface + */ + protected $translator; + public function __construct( + ChillRedis $chillRedis, ExportManager $exportManager, FormFactoryInterface $formFactory, LoggerInterface $logger, - SessionInterface $session + SessionInterface $session, + TranslatorInterface $translator ) { + $this->redis = $chillRedis; $this->exportManager = $exportManager; $this->formFactory = $formFactory; $this->logger = $logger; $this->session = $session; + $this->translator = $translator; } @@ -393,9 +411,8 @@ class ExportController extends Controller } /** - * Gather data stored in session from previous steps, and redirect - * to the `generate` action, compiling data from previous step in the URL - * (to obtain a GET HTTP query). + * Gather data stored in session from previous steps, store it inside redis + * and redirect to the `generate` action. * * The data from previous steps is removed from session. * @@ -415,6 +432,17 @@ class ExportController extends Controller 'alias' => $alias, 'step' => $this->getNextStep('generate', $export, true) )); } + + $parameters = [ + 'formatter' => $dataFormatter ?? [], + 'export' => $dataExport ?? [], + 'centers' => $dataCenters ?? [], + 'alias' => $alias + ]; + unset($parameters['_token']); + $key = md5(uniqid(rand(), false)); + + $this->redis->setEx($key, 3600, \serialize($parameters)); // remove data from session $this->session->remove('export_step_raw'); @@ -422,16 +450,7 @@ class ExportController extends Controller $this->session->remove('formatter_step_raw'); $this->session->remove('formatter_step'); - $redirectParameters = array_merge( - $dataFormatter ?? [], - $dataExport ?? [], - $dataCenters ?? [], - array('alias' => $alias) - ); - unset($redirectParameters['_token']); - - return $this->redirectToRoute('chill_main_export_download', - $redirectParameters); + return $this->redirectToRoute('chill_main_export_download', [ 'key' => $key, 'alias' => $alias ]); } /** @@ -447,44 +466,65 @@ class ExportController extends Controller { /* @var $exportManager \Chill\MainBundle\Export\ExportManager */ $exportManager = $this->exportManager; - $export = $exportManager->getExport($alias); - - $formCenters = $this->createCreateFormExport($alias, 'generate_centers'); - $formCenters->handleRequest($request); - $dataCenters = $formCenters->getData(); - - $formExport = $this->createCreateFormExport($alias, 'generate_export', $dataCenters); - $formExport->handleRequest($request); - $dataExport = $formExport->getData(); - - if ($export instanceof \Chill\MainBundle\Export\ExportInterface) { - $formFormatter = $this->createCreateFormExport($alias, 'generate_formatter', - $dataExport); - $formFormatter->handleRequest($request); - $dataFormatter = $formFormatter->getData(); - } + $key = $request->query->get('key', null); + + list($dataCenters, $dataExport, $dataFormatter) = $this->rebuildData($key); $r = $exportManager->generate( $alias, $dataCenters['centers'], $dataExport['export'], - isset($dataFormatter) ? $dataFormatter['formatter'] : [] + $dataFormatter !== NULL ? $dataFormatter['formatter'] : [] ); return $r; } + + protected function rebuildData($key) + { + if ($key === NULL) { + throw $this->createHttpNotFoundException("key does not exists"); + } + + if ($this->redis->exists($key) !== 1) { + $this->addFlash('error', $this->translator->trans("This report is not available any more")); + throw $this->createHttpNotFoundException("key does not exists"); + } + + $serialized = $this->redis->get($key); + + if ($serialized === false) { + throw new \LogicException("the key could not be reached from redis"); + } + + $rawData = \unserialize($serialized); + $alias = $rawData['alias']; + + $formCenters = $this->createCreateFormExport($alias, 'generate_centers'); + $formCenters->submit($rawData['centers']); + $dataCenters = $formCenters->getData(); + + $formExport = $this->createCreateFormExport($alias, 'generate_export', $dataCenters); + $formExport->submit($rawData['export']); + $dataExport = $formExport->getData(); + + if (count($rawData['formatter']) > 0) { + $formFormatter = $this->createCreateFormExport($alias, 'generate_formatter', + $dataExport); + $formFormatter->submit($rawData['formatter']); + $dataFormatter = $formFormatter->getData(); + } + + return [$dataCenters, $dataExport, $dataFormatter ?? null]; + } public function downloadResultAction(Request $request, $alias) { /* @var $exportManager \Chill\MainBundle\Export\ExportManager */ $exportManager = $this->exportManager; - $formCenters = $this->createCreateFormExport($alias, 'generate_centers'); - $formCenters->handleRequest($request); - $dataCenters = $formCenters->getData(); - - $formExport = $this->createCreateFormExport($alias, 'generate_export', $dataCenters); - $formExport->handleRequest($request); - $dataExport = $formExport->getData(); + $key = $request->query->get('key', null); + + list($dataCenters, $dataExport, $dataFormatter) = $this->rebuildData($key); $formatterAlias = $exportManager->getFormatterAlias($dataExport['export']); if ($formatterAlias !== null) {