From 5e25c7160a2a4fd05daa8728f635d1c4b66930a7 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sun, 3 Feb 2019 00:10:41 +0100 Subject: [PATCH] Draft uploader --- Controller/ApiController.php | 163 ++++++++++++++++------------ Models/Report.php | 4 +- Theme/Backend/helper-single.tpl.php | 2 +- 3 files changed, 97 insertions(+), 72 deletions(-) diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 2bddf20..25cb077 100644 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -16,10 +16,13 @@ namespace Modules\Helper\Controller; use Modules\Media\Models\Collection; use Modules\Media\Models\CollectionMapper; +use Modules\Media\Models\NullCollection; use Modules\Media\Models\MediaMapper; use Modules\Helper\Models\PermissionState; +use Modules\Helper\Models\NullReport; use Modules\Helper\Models\Report; use Modules\Helper\Models\ReportMapper; +use Modules\Helper\Models\NullTemplate; use Modules\Helper\Models\Template; use Modules\Helper\Models\TemplateDataType; use Modules\Helper\Models\TemplateMapper; @@ -82,6 +85,31 @@ final class ApiController extends Controller } $view = $this->createView($template, $request, $response); + $this->setHelperResponseHeader($view, $template->getName(), $request, $response); + + if ($request->getData('download') !== null) { + $response->getHeader()->setDownloadable($template->getName(), (string) $request->getData('type')); + } + + $response->set('export', $view); + } + + /** + * Set header for report/template + * + * @param View $view Template view + * @param string $name Template name + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + private function setHelperResponseHeader(View $view, string $name, RequestAbstract $request, ResponseAbstract $response) : void + { switch ($request->getData('type')) { case 'pdf': $response->getHeader()->set('Content-Type', MimeType::M_PDF, true); @@ -92,7 +120,7 @@ final class ApiController extends Controller case 'xlsx': $response->getHeader()->set( 'Content-disposition', 'attachment; filename="' - . $template->getName() . '.' + . $name . '.' . ((string) $request->getData('type')) . '"' , true); @@ -107,21 +135,21 @@ final class ApiController extends Controller $response->getHeader()->set('Content-Type', 'text/html; charset=utf-8'); $view->setTemplate('/' . \substr($view->getData('tcoll')['template']->getPath(), 0, -8)); } - - if ($request->getData('download') !== null) { - $response->getHeader()->set('Content-Type', MimeType::M_BIN, true); - $response->getHeader()->set('Content-Transfer-Encoding', 'Binary', true); - $response->getHeader()->set( - 'Content-disposition', 'attachment; filename="' - . $template->getName() . '.' - . ((string) $request->getData('type')) - . '"' - , true); - } - - $response->set('export', $view); } + /** + * Create view from template + * + * @param Template $template Template to create view from + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * + * @return View + * + * @api + * + * @since 1.0.0 + */ private function createView(Template $template, RequestAbstract $request, ResponseAbstract $response) : View { $tcoll = []; @@ -170,7 +198,6 @@ final class ApiController extends Controller $report = $report === false ? new NullReport() : $report; if (!($report instanceof NullReport)) { - /** @var Media[] $files */ $files = $report->getSource()->getSources(); foreach ($files as $media) { @@ -202,20 +229,40 @@ final class ApiController extends Controller */ public function apiTemplateCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void { - $collectionId = $this->createMediaCollectionFromRequest($request); - $template = $this->createTemplateFromRequest($request, $collectionId); + $collection = $this->createMediaCollectionFromRequest($request); + $template = $this->createTemplateFromRequest($request, $collection->getId()); $this->createModel($request, $template, TemplateMapper::class, 'template'); $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Template', 'Template successfully created', $template); } - private function createMediaCollectionFromRequest(RequestAbstract $request) : int + /** + * Method to create media collection from request. + * + * @param RequestAbstract $request Request + * + * @return Collection + * + * @since 1.0.0 + */ + private function createMediaCollectionFromRequest(RequestAbstract $request) : Collection { if ($request->getData('media-list') === null) { - return -1; + return new NullCollection(); + } + + $files = $request->getData('media-list'); + if (\is_array($files)) { + if (\stripos($files[0] ?? '', '[') === 0) { + $files = \array_merge($files, \json_decode($files[0], true)); + unset($files[0]); + } elseif ($files[0] === '') { + unset($files[0]); + } + } elseif (\is_string($files)) { + $files = \json_decode($files, true); } - $files = \json_decode((string) $request->getData('media-list'), true); // TODO: make sure this user has permissions for provided files /* Create collection */ @@ -226,9 +273,20 @@ final class ApiController extends Controller $mediaCollection->setCreatedBy($request->getHeader()->getAccount()); $mediaCollection->setSources($files); - return (int) CollectionMapper::create($mediaCollection); + CollectionMapper::create($mediaCollection); + + return $mediaCollection; } + /** + * Method to create template from request. + * + * @param RequestAbstract $request Request + * + * @return Template + * + * @since 1.0.0 + */ private function createTemplateFromRequest(RequestAbstract $request, int $collectionId) : Template { $expected = $request->getData('expected'); @@ -239,7 +297,7 @@ final class ApiController extends Controller $helperTemplate->setDescriptionRaw((string) ($request->getData('description') ?? '')); if ($collectionId > 0) { - $helperTemplate->setSource((int) $collectionId); + $helperTemplate->setSource($collectionId); } $helperTemplate->setStandalone((bool) $request->getData('standalone') ?? false); @@ -264,65 +322,32 @@ final class ApiController extends Controller public function apiReportCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void { // todo: check permission here + $collection = $this->createMediaCollectionFromRequest($request); - $this->handleTemplateDatabaseFromRequest($request); - $collectionId = $this->createMediaCollectionFromRequest($request); - - $report = $this->createReportFromRequest($request, $response, $collectionId); + $report = $this->createReportFromRequest($request, $response, $collection->getId()); $this->createModel($request, $report, ReportMapper::class, 'report'); $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Report', 'Report successfully created', $report); } + /** + * Method to create report from request. + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param int $collectionId Id of media collection + * + * @return Report + * + * @since 1.0.0 + */ private function createReportFromRequest(RequestAbstract $request, ResponseAbstract $response, int $collectionId) : Report { $helperReport = new Report(); $helperReport->setTitle((string) ($request->getData('name'))); - $helperReport->setSource((int) $collectionId); + $helperReport->setSource($collectionId); $helperReport->setTemplate((int) $request->getData('template')); $helperReport->setCreatedBy($request->getHeader()->getAccount()); return $helperReport; } - - private function handleTemplateDatabaseFromRequest(RequestAbstract $request) : void - { - $files = \json_decode((string) ($request->getData('files'))); - - // TODO: make sure user has permission for files - // TODO: make sure user has permission for template - - /* Init Template */ - $template = TemplateMapper::get((int) $request->getData('template')); - - if ($template->getDatatype() === TemplateDataType::GLOBAL_DB) { - $templateFiles = MediaMapper::get($template->getSource()); - - foreach ($templateFiles as $templateFile) { - $dbFile = MediaMapper::get($templateFile); - - // Found centralized db - if ($dbFile->getExtension() === '.sqlite') { - $this->app->dbPool->create('helper_1', ['db' => 'sqlite', 'path' => $dbFile->getPath()]); - $csvDbMapper = new CsvDatabaseMapper($this->app->dbPool->get('helper_1')); - $excelDbMapper = new ExcelDatabaseMapper($this->app->dbPool->get('helper_1')); - $csvDbMapper->autoIdentifyCsvSettings(true); - - foreach ($files as $file) { - $mediaFile = MediaMapper::get($file); - - if (StringUtils::endsWith($mediaFile->getFilename(), '.db') && $mediaFile->getExtension() === '.csv') { - $csvDbMapper->addSource($mediaFile->getPath()); - } elseif (StringUtils::endsWith($mediaFile->getFilename(), '.db') && ($mediaFile->getExtension() === '.xls' || $mediaFile->getExtension() === '.xlsx')) { - $excelDbMapper->addSource($mediaFile->getPath()); - } - } - - $csvDbMapper->insert(); - $excelDbMapper->insert(); - - break; - } - } - } - } } diff --git a/Models/Report.php b/Models/Report.php index 9b3a9da..544cf27 100644 --- a/Models/Report.php +++ b/Models/Report.php @@ -260,7 +260,7 @@ class Report implements \JsonSerializable } /** - * @param mixed $source Report source + * @param \Modules\Media\Models\Collection|int $source Report source * * @return void * @@ -272,7 +272,7 @@ class Report implements \JsonSerializable } /** - * @return mixed + * @return \Modules\Media\Models\Collection|int * * @since 1.0.0 */ diff --git a/Theme/Backend/helper-single.tpl.php b/Theme/Backend/helper-single.tpl.php index 6fd3fd5..5970267 100644 --- a/Theme/Backend/helper-single.tpl.php +++ b/Theme/Backend/helper-single.tpl.php @@ -28,7 +28,7 @@ echo $this->getData('nav')->render(); ?>
- +