Draft uploader

This commit is contained in:
Dennis Eichhorn 2019-02-03 00:10:41 +01:00
parent cc3b997f92
commit 5e25c7160a
3 changed files with 97 additions and 72 deletions

View File

@ -16,10 +16,13 @@ namespace Modules\Helper\Controller;
use Modules\Media\Models\Collection; use Modules\Media\Models\Collection;
use Modules\Media\Models\CollectionMapper; use Modules\Media\Models\CollectionMapper;
use Modules\Media\Models\NullCollection;
use Modules\Media\Models\MediaMapper; use Modules\Media\Models\MediaMapper;
use Modules\Helper\Models\PermissionState; use Modules\Helper\Models\PermissionState;
use Modules\Helper\Models\NullReport;
use Modules\Helper\Models\Report; use Modules\Helper\Models\Report;
use Modules\Helper\Models\ReportMapper; use Modules\Helper\Models\ReportMapper;
use Modules\Helper\Models\NullTemplate;
use Modules\Helper\Models\Template; use Modules\Helper\Models\Template;
use Modules\Helper\Models\TemplateDataType; use Modules\Helper\Models\TemplateDataType;
use Modules\Helper\Models\TemplateMapper; use Modules\Helper\Models\TemplateMapper;
@ -82,6 +85,31 @@ final class ApiController extends Controller
} }
$view = $this->createView($template, $request, $response); $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')) { switch ($request->getData('type')) {
case 'pdf': case 'pdf':
$response->getHeader()->set('Content-Type', MimeType::M_PDF, true); $response->getHeader()->set('Content-Type', MimeType::M_PDF, true);
@ -92,7 +120,7 @@ final class ApiController extends Controller
case 'xlsx': case 'xlsx':
$response->getHeader()->set( $response->getHeader()->set(
'Content-disposition', 'attachment; filename="' 'Content-disposition', 'attachment; filename="'
. $template->getName() . '.' . $name . '.'
. ((string) $request->getData('type')) . ((string) $request->getData('type'))
. '"' . '"'
, true); , true);
@ -107,21 +135,21 @@ final class ApiController extends Controller
$response->getHeader()->set('Content-Type', 'text/html; charset=utf-8'); $response->getHeader()->set('Content-Type', 'text/html; charset=utf-8');
$view->setTemplate('/' . \substr($view->getData('tcoll')['template']->getPath(), 0, -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 private function createView(Template $template, RequestAbstract $request, ResponseAbstract $response) : View
{ {
$tcoll = []; $tcoll = [];
@ -170,7 +198,6 @@ final class ApiController extends Controller
$report = $report === false ? new NullReport() : $report; $report = $report === false ? new NullReport() : $report;
if (!($report instanceof NullReport)) { if (!($report instanceof NullReport)) {
/** @var Media[] $files */
$files = $report->getSource()->getSources(); $files = $report->getSource()->getSources();
foreach ($files as $media) { foreach ($files as $media) {
@ -202,20 +229,40 @@ final class ApiController extends Controller
*/ */
public function apiTemplateCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void public function apiTemplateCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void
{ {
$collectionId = $this->createMediaCollectionFromRequest($request); $collection = $this->createMediaCollectionFromRequest($request);
$template = $this->createTemplateFromRequest($request, $collectionId); $template = $this->createTemplateFromRequest($request, $collection->getId());
$this->createModel($request, $template, TemplateMapper::class, 'template'); $this->createModel($request, $template, TemplateMapper::class, 'template');
$this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Template', 'Template successfully created', $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) { 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 // TODO: make sure this user has permissions for provided files
/* Create collection */ /* Create collection */
@ -226,9 +273,20 @@ final class ApiController extends Controller
$mediaCollection->setCreatedBy($request->getHeader()->getAccount()); $mediaCollection->setCreatedBy($request->getHeader()->getAccount());
$mediaCollection->setSources($files); $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 private function createTemplateFromRequest(RequestAbstract $request, int $collectionId) : Template
{ {
$expected = $request->getData('expected'); $expected = $request->getData('expected');
@ -239,7 +297,7 @@ final class ApiController extends Controller
$helperTemplate->setDescriptionRaw((string) ($request->getData('description') ?? '')); $helperTemplate->setDescriptionRaw((string) ($request->getData('description') ?? ''));
if ($collectionId > 0) { if ($collectionId > 0) {
$helperTemplate->setSource((int) $collectionId); $helperTemplate->setSource($collectionId);
} }
$helperTemplate->setStandalone((bool) $request->getData('standalone') ?? false); $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 public function apiReportCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void
{ {
// todo: check permission here // todo: check permission here
$collection = $this->createMediaCollectionFromRequest($request);
$this->handleTemplateDatabaseFromRequest($request); $report = $this->createReportFromRequest($request, $response, $collection->getId());
$collectionId = $this->createMediaCollectionFromRequest($request);
$report = $this->createReportFromRequest($request, $response, $collectionId);
$this->createModel($request, $report, ReportMapper::class, 'report'); $this->createModel($request, $report, ReportMapper::class, 'report');
$this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Report', 'Report successfully created', $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 private function createReportFromRequest(RequestAbstract $request, ResponseAbstract $response, int $collectionId) : Report
{ {
$helperReport = new Report(); $helperReport = new Report();
$helperReport->setTitle((string) ($request->getData('name'))); $helperReport->setTitle((string) ($request->getData('name')));
$helperReport->setSource((int) $collectionId); $helperReport->setSource($collectionId);
$helperReport->setTemplate((int) $request->getData('template')); $helperReport->setTemplate((int) $request->getData('template'));
$helperReport->setCreatedBy($request->getHeader()->getAccount()); $helperReport->setCreatedBy($request->getHeader()->getAccount());
return $helperReport; 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;
}
}
}
}
} }

View File

@ -260,7 +260,7 @@ class Report implements \JsonSerializable
} }
/** /**
* @param mixed $source Report source * @param \Modules\Media\Models\Collection|int $source Report source
* *
* @return void * @return void
* *
@ -272,7 +272,7 @@ class Report implements \JsonSerializable
} }
/** /**
* @return mixed * @return \Modules\Media\Models\Collection|int
* *
* @since 1.0.0 * @since 1.0.0
*/ */