vendor/pimcore/data-importer/src/Controller/ConfigDataObjectController.php line 583

Open in your IDE?
  1. <?php
  2. /**
  3.  * Pimcore
  4.  *
  5.  * This source file is available under two different licenses:
  6.  * - GNU General Public License version 3 (GPLv3)
  7.  * - Pimcore Commercial License (PCL)
  8.  * Full copyright and license information is available in
  9.  * LICENSE.md which is distributed with this source code.
  10.  *
  11.  *  @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  12.  *  @license    http://www.pimcore.org/license     GPLv3 and PCL
  13.  */
  14. namespace Pimcore\Bundle\DataImporterBundle\Controller;
  15. use Cron\CronExpression;
  16. use League\Flysystem\FilesystemOperator;
  17. use Pimcore\Bundle\AdminBundle\Helper\QueryParams;
  18. use Pimcore\Bundle\DataHubBundle\Configuration\Dao;
  19. use Pimcore\Bundle\DataImporterBundle\DataSource\Interpreter\InterpreterFactory;
  20. use Pimcore\Bundle\DataImporterBundle\DataSource\Loader\DataLoaderFactory;
  21. use Pimcore\Bundle\DataImporterBundle\DataSource\Loader\PushLoader;
  22. use Pimcore\Bundle\DataImporterBundle\Exception\InvalidConfigurationException;
  23. use Pimcore\Bundle\DataImporterBundle\Mapping\MappingConfigurationFactory;
  24. use Pimcore\Bundle\DataImporterBundle\Mapping\Type\ClassificationStoreDataTypeService;
  25. use Pimcore\Bundle\DataImporterBundle\Mapping\Type\TransformationDataTypeService;
  26. use Pimcore\Bundle\DataImporterBundle\Preview\PreviewService;
  27. use Pimcore\Bundle\DataImporterBundle\Processing\ImportPreparationService;
  28. use Pimcore\Bundle\DataImporterBundle\Processing\ImportProcessingService;
  29. use Pimcore\Bundle\DataImporterBundle\Settings\ConfigurationPreparationService;
  30. use Pimcore\Controller\Traits\JsonHelperTrait;
  31. use Pimcore\Controller\UserAwareController;
  32. use Pimcore\Logger;
  33. use Pimcore\Model\DataObject;
  34. use Pimcore\Model\DataObject\QuantityValue\Unit;
  35. use Pimcore\Translation\Translator;
  36. use Symfony\Component\HttpFoundation\JsonResponse;
  37. use Symfony\Component\HttpFoundation\Request;
  38. use Symfony\Component\Routing\Annotation\Route;
  39. /**
  40.  * @Route("/admin/pimcoredataimporter/dataobject/config")
  41.  */
  42. class ConfigDataObjectController extends UserAwareController
  43. {
  44.     use JsonHelperTrait;
  45.     public const CONFIG_NAME 'plugin_datahub_config';
  46.     /**
  47.      * @var PreviewService
  48.      */
  49.     protected $previewService;
  50.     /**
  51.      * ConfigDataObjectController constructor.
  52.      *
  53.      * @param PreviewService $previewService
  54.      */
  55.     public function __construct(PreviewService $previewService)
  56.     {
  57.         $this->previewService $previewService;
  58.     }
  59.     /**
  60.      * @Route("/save")
  61.      *
  62.      * @throws \Exception
  63.      */
  64.     public function saveAction(Request $request): ?JsonResponse
  65.     {
  66.         $this->checkPermission(self::CONFIG_NAME);
  67.         try {
  68.             $data $request->get('data');
  69.             $modificationDate $request->get('modificationDate'0);
  70.             if ($modificationDate Dao::getConfigModificationDate()) {
  71.                 throw new \Exception('The configuration was modified during editing, please reload the configuration and make your changes again');
  72.             }
  73.             $dataDecoded json_decode($datatrue);
  74.             $name $dataDecoded['general']['name'];
  75.             $dataDecoded['general']['active'] = $dataDecoded['general']['active'] ?? false;
  76.             $config Dao::getByName($name);
  77.             if (!$config->isAllowed('update')) {
  78.                 throw $this->createAccessDeniedHttpException();
  79.             }
  80.             $config->setConfiguration($dataDecoded);
  81.             // @phpstan-ignore-next-line isAllowed return can changed now
  82.             if ($config->isAllowed('read') && $config->isAllowed('update')) {
  83.                 $config->save();
  84.                 return $this->json(['success' => true'modificationDate' => Dao::getConfigModificationDate()]);
  85.             } else {
  86.                 return $this->json(['success' => false'permissionError' => true]);
  87.             }
  88.         } catch (\Exception $e) {
  89.             return $this->json(['success' => false'message' => $e->getMessage()]);
  90.         }
  91.     }
  92.     /**
  93.      * @param string $configName
  94.      * @param array $config
  95.      * @param InterpreterFactory $interpreterFactory
  96.      *
  97.      * @return array
  98.      */
  99.     protected function loadAvailableColumnHeaders(
  100.         string $configName,
  101.         array $config,
  102.         InterpreterFactory $interpreterFactory
  103.     ) {
  104.         $previewFilePath $this->previewService->getLocalPreviewFile($configName$this->getPimcoreUser());
  105.         if (is_file($previewFilePath)) {
  106.             try {
  107.                 $interpreter $interpreterFactory->loadInterpreter($configName$config['interpreterConfig'], $config['processingConfig']);
  108.                 $dataPreview $interpreter->previewData($previewFilePath);
  109.                 return $dataPreview->getDataColumnHeaders();
  110.             } catch (\Exception $e) {
  111.                 Logger::warning($e);
  112.             }
  113.         }
  114.         return [];
  115.     }
  116.     /**
  117.      * @Route("/get")
  118.      *
  119.      * @param Request $request
  120.      * @param ConfigurationPreparationService $configurationPreparationService
  121.      * @param InterpreterFactory $interpreterFactory
  122.      *
  123.      * @return JsonResponse
  124.      *
  125.      * @throws \Exception
  126.      */
  127.     public function getAction(Request $request,
  128.         ConfigurationPreparationService $configurationPreparationService,
  129.         InterpreterFactory $interpreterFactory
  130.     ): JsonResponse {
  131.         $this->checkPermission(self::CONFIG_NAME);
  132.         $name $request->get('name');
  133.         $config $configurationPreparationService->prepareConfiguration($name);
  134.         return new JsonResponse(
  135.             [
  136.                 'name' => $name,
  137.                 'configuration' => $config,
  138.                 'userPermissions' => $config['userPermissions'],
  139.                 'modificationDate' => Dao::getConfigModificationDate(),
  140.                 'columnHeaders' => $this->loadAvailableColumnHeaders($name$config$interpreterFactory)
  141.             ]
  142.         );
  143.     }
  144.     /**
  145.      * @Route("/upload-preview", methods={"POST"})
  146.      *
  147.      * @param Request $request
  148.      *
  149.      * @return JsonResponse
  150.      *
  151.      * @throws \Exception
  152.      */
  153.     public function uploadPreviewDataAction(Request $request)
  154.     {
  155.         try {
  156.             if (array_key_exists('Filedata'$_FILES)) {
  157.                 $filename $_FILES['Filedata']['name'];
  158.                 $sourcePath $_FILES['Filedata']['tmp_name'];
  159.             } else {
  160.                 throw new \Exception('The filename of the preview data is empty');
  161.             }
  162.             if (is_file($sourcePath) && filesize($sourcePath) < 1) {
  163.                 throw new \Exception('File is empty!');
  164.             } elseif (!is_file($sourcePath)) {
  165.                 throw new \Exception('Something went wrong, please check upload_max_filesize and post_max_size in your php.ini and write permissions of your temporary directories.');
  166.             }
  167.             if (filesize($sourcePath) > 10485760) { //10 MB
  168.                 throw new \Exception('File it too big for preview file, please create a smaller one');
  169.             }
  170.             $this->previewService->writePreviewFile($request->get('config_name'), $sourcePath$this->getPimcoreUser());
  171.             @unlink($sourcePath);
  172.             return new JsonResponse(['success' => true]);
  173.         } catch (\Exception $e) {
  174.             Logger::error($e);
  175.             return $this->jsonResponse([
  176.                 'success' => false,
  177.                 'message' => $e->getMessage(),
  178.             ]);
  179.         }
  180.     }
  181.     /**
  182.      * @Route("/copy-preview", methods={"POST"})
  183.      *
  184.      * @param Request $request
  185.      * @param ConfigurationPreparationService $configurationPreparationService
  186.      * @param DataLoaderFactory $dataLoaderFactory
  187.      *
  188.      * @return JsonResponse
  189.      *
  190.      * @throws \Exception
  191.      */
  192.     public function copyPreviewDataAction(
  193.         Request $request,
  194.         ConfigurationPreparationService $configurationPreparationService,
  195.         DataLoaderFactory $dataLoaderFactory
  196.     ) {
  197.         try {
  198.             $configName $request->get('config_name');
  199.             $currentConfig $request->get('current_config');
  200.             $config $configurationPreparationService->prepareConfiguration($configName$currentConfig);
  201.             $loader $dataLoaderFactory->loadDataLoader($config['loaderConfig']);
  202.             if ($loader instanceof PushLoader) {
  203.                 throw new \Exception('Cannot copy data from push loader for preview.');
  204.             }
  205.             $sourcePath $loader->loadData();
  206.             if (is_file($sourcePath) && filesize($sourcePath) < 1) {
  207.                 throw new \Exception('File is empty!');
  208.             } elseif (!is_file($sourcePath)) {
  209.                 throw new \Exception('Something went wrong, please check upload_max_filesize and post_max_size in your php.ini and write permissions of your temporary directories.');
  210.             }
  211.             if (filesize($sourcePath) > 10485760) { //10 MB
  212.                 throw new \Exception('File it too big for preview file, please create a smaller one');
  213.             }
  214.             $this->previewService->writePreviewFile($request->get('config_name'), $sourcePath$this->getPimcoreUser());
  215.             $loader->cleanup();
  216.             return new JsonResponse(['success' => true]);
  217.         } catch (\Exception $e) {
  218.             Logger::error($e);
  219.             return $this->jsonResponse([
  220.                 'success' => false,
  221.                 'message' => $e->getMessage(),
  222.             ]);
  223.         }
  224.     }
  225.     /**
  226.      * @Route("/load-preview-data", methods={"POST"})
  227.      *
  228.      * @param Request $request
  229.      * @param ConfigurationPreparationService $configurationPreparationService
  230.      * @param InterpreterFactory $interpreterFactory
  231.      * @param Translator $translator
  232.      *
  233.      * @return JsonResponse
  234.      *
  235.      * @throws \Exception
  236.      */
  237.     public function loadDataPreviewAction(
  238.         Request $request,
  239.         ConfigurationPreparationService $configurationPreparationService,
  240.         InterpreterFactory $interpreterFactory,
  241.         Translator $translator
  242.     ) {
  243.         $configName $request->get('config_name');
  244.         $currentConfig $request->get('current_config');
  245.         $recordNumber intval($request->get('record_number'));
  246.         $dataPreview null;
  247.         $hasData false;
  248.         $errorMessage '';
  249.         $previewFilePath $this->previewService->getLocalPreviewFile($configName$this->getPimcoreUser());
  250.         if (is_file($previewFilePath)) {
  251.             $config $configurationPreparationService->prepareConfiguration($configName$currentConfig);
  252.             $mappedColumns = [];
  253.             foreach (($config['mappingConfig'] ?? []) as $mapping) {
  254.                 if (isset($mapping['dataSourceIndex']) && is_array($mapping['dataSourceIndex'])) {
  255.                     $mappedColumns array_merge($mappedColumns$mapping['dataSourceIndex']);
  256.                 }
  257.             }
  258.             $mappedColumns array_unique($mappedColumns);
  259.             try {
  260.                 $interpreter $interpreterFactory->loadInterpreter($configName$config['interpreterConfig'], $config['processingConfig']);
  261.                 if ($interpreter->fileValid($previewFilePath)) {
  262.                     $dataPreview $interpreter->previewData($previewFilePath$recordNumber$mappedColumns);
  263.                     $hasData true;
  264.                 } else {
  265.                     $errorMessage $translator->trans('plugin_pimcore_datahub_data_importer_configpanel_preview_error_invalid_file', [], 'admin');
  266.                 }
  267.             } catch (\Exception $e) {
  268.                 Logger::error($e);
  269.                 $errorMessage $translator->trans('plugin_pimcore_datahub_data_importer_configpanel_preview_error_prefix', [], 'admin') . ': ' $e->getMessage();
  270.             }
  271.         }
  272.         return new JsonResponse([
  273.             'dataPreview' => $dataPreview $dataPreview->getDataPreview() : [],
  274.             'previewRecordIndex' => $dataPreview $dataPreview->getRecordNumber() : 0,
  275.             'hasData' => $hasData,
  276.             'errorMessage' => $errorMessage
  277.         ]);
  278.     }
  279.     /**
  280.      * @Route("/load-column-headers", methods={"POST"})
  281.      *
  282.      * @param Request $request
  283.      * @param ConfigurationPreparationService $configurationPreparationService
  284.      * @param InterpreterFactory $interpreterFactory
  285.      *
  286.      * @return JsonResponse
  287.      *
  288.      * @throws \Pimcore\Bundle\DataImporterBundle\Exception\InvalidConfigurationException|\Exception
  289.      */
  290.     public function loadAvailableColumnHeadersAction(
  291.         Request $request,
  292.         ConfigurationPreparationService $configurationPreparationService,
  293.         InterpreterFactory $interpreterFactory
  294.     ) {
  295.         $configName $request->get('config_name');
  296.         $currentConfig $request->get('current_config');
  297.         $config $configurationPreparationService->prepareConfiguration($configName$currentConfig);
  298.         return new JsonResponse([
  299.             'columnHeaders' => $this->loadAvailableColumnHeaders($configName$config$interpreterFactory)
  300.         ]);
  301.     }
  302.     /**
  303.      * @Route("/load-transformation-result", methods={"POST"})
  304.      *
  305.      * @param Request $request
  306.      * @param ConfigurationPreparationService $configurationPreparationService
  307.      * @param MappingConfigurationFactory $factory
  308.      * @param InterpreterFactory $interpreterFactory
  309.      * @param ImportProcessingService $importProcessingService
  310.      *
  311.      * @return JsonResponse
  312.      *
  313.      * @throws InvalidConfigurationException|\Exception
  314.      */
  315.     public function loadTransformationResultPreviewsAction(
  316.         Request $request,
  317.         ConfigurationPreparationService $configurationPreparationService,
  318.         MappingConfigurationFactory $factory,
  319.         InterpreterFactory $interpreterFactory,
  320.         ImportProcessingService $importProcessingService
  321.     ) {
  322.         $configName $request->get('config_name');
  323.         $currentConfig $request->get('current_config');
  324.         $recordNumber intval($request->get('current_preview_record'));
  325.         $config $configurationPreparationService->prepareConfiguration($configName$currentConfig);
  326.         $previewFilePath $this->previewService->getLocalPreviewFile($configName$this->getPimcoreUser());
  327.         $importDataRow = [];
  328.         $transformationResults = [];
  329.         $errorMessage '';
  330.         try {
  331.             if (is_file($previewFilePath)) {
  332.                 $interpreter $interpreterFactory->loadInterpreter($configName$config['interpreterConfig'], $config['processingConfig']);
  333.                 $dataPreview $interpreter->previewData($previewFilePath$recordNumber);
  334.                 $importDataRow $dataPreview->getRawData();
  335.             }
  336.             $mapping $factory->loadMappingConfiguration($configName$config['mappingConfig'], true);
  337.             foreach ($mapping as $index => $mappingConfiguration) {
  338.                 $transformationResults[] = $importProcessingService->generateTransformationResultPreview($importDataRow$mappingConfiguration);
  339.             }
  340.         } catch (\Exception $e) {
  341.             Logger::error($e);
  342.             $errorMessage $e->getMessage();
  343.         }
  344.         return new JsonResponse([
  345.             'transformationResultPreviews' => $transformationResults,
  346.             'errorMessage' => $errorMessage
  347.         ]);
  348.     }
  349.     /**
  350.      * @Route("/calculate-transformation-result-type", methods={"POST"})
  351.      *
  352.      * @param Request $request
  353.      * @param MappingConfigurationFactory $factory
  354.      * @param ImportProcessingService $importProcessingService
  355.      *
  356.      * @return JsonResponse
  357.      */
  358.     public function calculateTransformationResultTypeAction(
  359.         Request $request,
  360.         MappingConfigurationFactory $factory,
  361.         ImportProcessingService $importProcessingService
  362.     ) {
  363.         try {
  364.             $currentConfig json_decode($request->get('current_config'), true);
  365.             $configName $request->get('config_name');
  366.             $mappingConfiguration $factory->loadMappingConfigurationItem($configName$currentConfigtrue);
  367.             return new JsonResponse($importProcessingService->evaluateTransformationResultDataType($mappingConfiguration));
  368.         } catch (InvalidConfigurationException $e) {
  369.             return new JsonResponse('ERROR: ' $e->getMessage());
  370.         }
  371.     }
  372.     /**
  373.      * @Route("/load-class-attributes", methods={"GET"})
  374.      *
  375.      * @param Request $request
  376.      * @param TransformationDataTypeService $transformationDataTypeService
  377.      *
  378.      * @return JsonResponse
  379.      *
  380.      * @throws \Exception
  381.      */
  382.     public function loadDataObjectAttributesAction(Request $requestTransformationDataTypeService $transformationDataTypeService)
  383.     {
  384.         $classId $request->get('class_id');
  385.         if (empty($classId)) {
  386.             return new JsonResponse([]);
  387.         }
  388.         $loadAdvancedRelations boolval($request->get('load_advanced_relations'false));
  389.         $includeSystemRead boolval($request->get('system_read'false));
  390.         $includeSystemWrite boolval($request->get('system_write'false));
  391.         $transformationTargetType $request->get('transformation_result_type', [TransformationDataTypeService::DEFAULT_TYPETransformationDataTypeService::NUMERIC]);
  392.         return new JsonResponse([
  393.             'attributes' => $transformationDataTypeService->getPimcoreDataTypes($classId$transformationTargetType$includeSystemRead$includeSystemWrite$loadAdvancedRelations)
  394.         ]);
  395.     }
  396.     /**
  397.      * @Route("/load-class-classificationstore-attributes", methods={"GET"})
  398.      *
  399.      * @param Request $request
  400.      * @param TransformationDataTypeService $transformationDataTypeService
  401.      *
  402.      * @return JsonResponse
  403.      */
  404.     public function loadDataObjectClassificationStoreAttributesAction(Request $requestTransformationDataTypeService $transformationDataTypeService)
  405.     {
  406.         $classId $request->get('class_id');
  407.         if (empty($classId)) {
  408.             return new JsonResponse([]);
  409.         }
  410.         return new JsonResponse([
  411.             'attributes' => $transformationDataTypeService->getClassificationStoreAttributes($classId)
  412.         ]);
  413.     }
  414.     /**
  415.      * @Route("/load-class-classificationstore-keys", methods={"GET"})
  416.      *
  417.      * @param Request $request
  418.      * @param ClassificationStoreDataTypeService $classificationStoreDataTypeService
  419.      *
  420.      * @return JsonResponse
  421.      *
  422.      * @throws \Exception
  423.      */
  424.     public function loadDataObjectClassificationStoreKeysAction(Request $requestClassificationStoreDataTypeService $classificationStoreDataTypeService)
  425.     {
  426.         $sortParams QueryParams::extractSortingSettings(['sort' => $request->get('sort')]);
  427.         $list $classificationStoreDataTypeService->listClassificationStoreKeyList(
  428.             strip_tags($request->get('class_id')),
  429.             strip_tags($request->get('field_name')),
  430.             strip_tags($request->get('transformation_result_type')),
  431.             $sortParams['orderKey'] ?? 'name',
  432.             $sortParams['order'] ?? 'ASC',
  433.             intval($request->get('start')),
  434.             intval($request->get('limit')),
  435.             strip_tags($request->get('searchfilter')),
  436.             strip_tags($request->get('filter'))
  437.         );
  438.         $data = [];
  439.         foreach ($list as $config) {
  440.             $item = [
  441.                 'keyId' => $config->getKeyId(),
  442.                 'groupId' => $config->getGroupId(),
  443.                 'keyName' => $config->getName(),
  444.                 'keyDescription' => $config->getDescription(),
  445.                 'id' => $config->getGroupId() . '-' $config->getKeyId(),
  446.                 'sorter' => $config->getSorter(),
  447.             ];
  448.             $groupConfig DataObject\Classificationstore\GroupConfig::getById($config->getGroupId());
  449.             if ($groupConfig) {
  450.                 $item['groupName'] = $groupConfig->getName();
  451.             }
  452.             $data[] = $item;
  453.         }
  454.         return new JsonResponse([
  455.             'success' => true,
  456.             'data' => $data,
  457.             'total' => $list->getTotalCount()
  458.         ]);
  459.     }
  460.     /**
  461.      * @Route("/load-class-classificationstore-key-name", methods={"GET"})
  462.      *
  463.      * @param Request $request
  464.      *
  465.      * @return JsonResponse
  466.      *
  467.      * @throws \Exception
  468.      */
  469.     public function loadDataObjectClassificationStoreKeyNameAction(Request $request)
  470.     {
  471.         $keyId $request->get('key_id');
  472.         $keyParts explode('-'$keyId);
  473.         if (count($keyParts) == 2) {
  474.             $keyGroupRelation DataObject\Classificationstore\KeyGroupRelation::getByGroupAndKeyId((int)$keyParts[0], (int)$keyParts[1]);
  475.             $group DataObject\Classificationstore\GroupConfig::getById($keyGroupRelation->getGroupId());
  476.             if ($keyGroupRelation && $group) {
  477.                 return new JsonResponse([
  478.                     'groupName' => $group->getName(),
  479.                     'keyName' => $keyGroupRelation->getName()
  480.                 ]);
  481.             }
  482.         }
  483.         return new JsonResponse([
  484.             'keyId' => $keyId
  485.         ]);
  486.     }
  487.     /**
  488.      * @Route("/start-import", methods={"PUT"})
  489.      *
  490.      * @param Request $request
  491.      * @param ImportPreparationService $importPreparationService
  492.      *
  493.      * @return JsonResponse
  494.      */
  495.     public function startBatchImportAction(Request $requestImportPreparationService $importPreparationService)
  496.     {
  497.         $configName $request->get('config_name');
  498.         $success $importPreparationService->prepareImport($configNametrue);
  499.         return new JsonResponse([
  500.             'success' => $success
  501.         ]);
  502.     }
  503.     /**
  504.      * @Route("/check-import-progress", methods={"GET"})
  505.      *
  506.      * @param Request $request
  507.      * @param ImportProcessingService $importProcessingService
  508.      *
  509.      * @return JsonResponse
  510.      */
  511.     public function checkImportProgressAction(Request $requestImportProcessingService $importProcessingService)
  512.     {
  513.         $configName $request->get('config_name');
  514.         return new JsonResponse($importProcessingService->getImportStatus($configName));
  515.     }
  516.     /**
  517.      * @Route("/check-crontab", methods={"GET"})
  518.      *
  519.      * @param Request $request
  520.      *
  521.      * @return JsonResponse
  522.      */
  523.     public function isCronExpressionValidAction(Request $request)
  524.     {
  525.         $message '';
  526.         $success true;
  527.         $cronExpression $request->get('cron_expression');
  528.         if (!empty($cronExpression)) {
  529.             try {
  530.                 new CronExpression($cronExpression);
  531.             } catch (\Exception $e) {
  532.                 $success false;
  533.                 $message $e->getMessage();
  534.             }
  535.         }
  536.         return new JsonResponse([
  537.             'success' => $success,
  538.             'message' => $message
  539.         ]);
  540.     }
  541.     /**
  542.      * @Route("/cancel-execution", methods={"PUT"})
  543.      *
  544.      * @param Request $request
  545.      * @param ImportProcessingService $importProcessingService
  546.      *
  547.      * @return JsonResponse
  548.      */
  549.     public function cancelExecutionAction(Request $requestImportProcessingService $importProcessingService)
  550.     {
  551.         $configName $request->get('config_name');
  552.         $importProcessingService->cancelImportAndCleanupQueue($configName);
  553.         return new JsonResponse([
  554.             'success' => true
  555.         ]);
  556.     }
  557.     /**
  558.      * @Route("/upload-import-file", methods={"POST"})
  559.      *
  560.      * @param Request $request
  561.      * @param FilesystemOperator $pimcoreDataImporterUploadStorage
  562.      *
  563.      * @return JsonResponse
  564.      *
  565.      * @throws \League\Flysystem\FilesystemException
  566.      */
  567.     public function uploadImportFileAction(Request $requestFilesystemOperator $pimcoreDataImporterUploadStorage)
  568.     {
  569.         try {
  570.             if (array_key_exists('Filedata'$_FILES)) {
  571.                 $filename $_FILES['Filedata']['name'];
  572.                 $sourcePath $_FILES['Filedata']['tmp_name'];
  573.             } else {
  574.                 throw new \Exception('The filename of the upload data is empty');
  575.             }
  576.             $target $this->getImportFilePath($request->get('config_name'));
  577.             $pimcoreDataImporterUploadStorage->write($targetfile_get_contents($sourcePath));
  578.             @unlink($sourcePath);
  579.             return new JsonResponse(['success' => true]);
  580.         } catch (\Exception $e) {
  581.             Logger::error($e);
  582.             return $this->jsonResponse([
  583.                 'success' => false,
  584.                 'message' => $e->getMessage(),
  585.             ]);
  586.         }
  587.     }
  588.     /**
  589.      * @param string $configName
  590.      *
  591.      * @return string
  592.      *
  593.      * @throws \Exception
  594.      */
  595.     protected function getImportFilePath(string $configName): string
  596.     {
  597.         $configuration Dao::getByName($configName);
  598.         if (!$configuration) {
  599.             throw new \Exception('Configuration ' $configName ' does not exist.');
  600.         }
  601.         $filePath $configuration->getName() . '/upload.import';
  602.         return $filePath;
  603.     }
  604.     /**
  605.      * @Route("/has-import-file-uploaded", methods={"GET"})
  606.      *
  607.      * @param Request $request
  608.      * @param Translator $translator
  609.      * @param FilesystemOperator $pimcoreDataImporterUploadStorage
  610.      *
  611.      * @return JsonResponse
  612.      */
  613.     public function hasImportFileUploadedAction(Request $requestTranslator $translatorFilesystemOperator $pimcoreDataImporterUploadStorage)
  614.     {
  615.         try {
  616.             $importFile $this->getImportFilePath($request->get('config_name'));
  617.             if ($pimcoreDataImporterUploadStorage->fileExists($importFile)) {
  618.                 return new JsonResponse(['success' => true'filePath' => $importFile'message' => $translator->trans('plugin_pimcore_datahub_data_importer_configpanel_type_upload_exists', [], 'admin')]);
  619.             }
  620.             return new JsonResponse(['success' => false'message' => $translator->trans('plugin_pimcore_datahub_data_importer_configpanel_type_upload_not_exists', [], 'admin')]);
  621.         } catch (\Exception $e) {
  622.             Logger::error($e);
  623.             return $this->jsonResponse([
  624.                 'success' => false,
  625.                 'message' => $e->getMessage(),
  626.             ]);
  627.         }
  628.     }
  629.     /**
  630.      * @Route("/load-unit-data", methods={"GET"})
  631.      *
  632.      * @param Request $request
  633.      *
  634.      * @return JsonResponse
  635.      */
  636.     public function loadUnitDataAction(Request $request): JsonResponse
  637.     {
  638.         $unitList = new Unit\Listing();
  639.         $unitList->setOrderKey('abbreviation');
  640.         $data = [];
  641.         foreach ($unitList as $unit) {
  642.             $data[] = ['unitId' => $unit->getId(), 'abbreviation' => $unit->getAbbreviation()];
  643.         }
  644.         return new JsonResponse(['UnitList' => $data]);
  645.     }
  646. }