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

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