vendor/pimcore/data-hub-simple-rest/src/Service/AbstractService.php line 85

Open in your IDE?
  1. <?php
  2. /**
  3.  * Pimcore
  4.  *
  5.  * This source file is available under following license:
  6.  * - Pimcore Commercial License (PCL)
  7.  *
  8.  *  @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  9.  *  @license    http://www.pimcore.org/license     PCL
  10.  */
  11. namespace Pimcore\Bundle\DataHubSimpleRestBundle\Service;
  12. use Pimcore\Bundle\DataHubBundle\Configuration;
  13. use Pimcore\Bundle\DataHubBundle\Configuration\Dao;
  14. use Pimcore\Bundle\DataHubSimpleRestBundle\Exception\InvalidRequestException;
  15. use Pimcore\Bundle\DataHubSimpleRestBundle\MappingAndDataExtractor\AbstractMappingAndDataExtractor;
  16. use Pimcore\Bundle\DataHubSimpleRestBundle\MappingAndDataExtractor\DataExtractorFactory;
  17. use Pimcore\Bundle\DataHubSimpleRestBundle\Queue\QueueService;
  18. use Pimcore\Model\Asset;
  19. use Pimcore\Model\Asset\Folder;
  20. use Pimcore\Model\DataObject\Concrete;
  21. use Pimcore\Model\Element\ElementInterface;
  22. use Psr\Log\LoggerAwareTrait;
  23. use Symfony\Component\Lock\LockFactory;
  24. class AbstractService
  25. {
  26.     use LoggerAwareTrait;
  27.     /**
  28.      * @var IndexHandler
  29.      *
  30.      */
  31.     protected $indexHandler;
  32.     /**
  33.      * @var DataExtractorFactory
  34.      */
  35.     protected $dataExtractorFactory;
  36.     /**
  37.      * @var array
  38.      */
  39.     protected $dataExtractors;
  40.     /**
  41.      * @var QueueService
  42.      */
  43.     protected $queueService;
  44.     /**
  45.      * @var string
  46.      */
  47.     protected $indexNamePrefix;
  48.     /**
  49.      * @var array
  50.      */
  51.     protected $dataHubConfig null;
  52.     /**
  53.      * @var LockFactory
  54.      */
  55.     protected $lockFactory;
  56.     public function __construct(
  57.         QueueService $queueService,
  58.         IndexHandler $indexHandler,
  59.         DataExtractorFactory $dataExtractorFactory,
  60.         string $indexNamePrefix,
  61.         /*LockFactory */ $lockFactory
  62.     ) {
  63.         $this->queueService $queueService;
  64.         $this->indexHandler $indexHandler;
  65.         $this->dataExtractorFactory $dataExtractorFactory;
  66.         $this->indexNamePrefix $indexNamePrefix;
  67.         $this->lockFactory $lockFactory;
  68.     }
  69.     /**
  70.      * @return array
  71.      */
  72.     public function getDataHubConfig(): array
  73.     {
  74.         if ($this->dataHubConfig === null) {
  75.             $simpleRestConfigurations = [];
  76.             /**
  77.              * @var Configuration[] $allDataHubConfiguations
  78.              */
  79.             $allDataHubConfiguations Dao::getList();
  80.             foreach ($allDataHubConfiguations as $dataHubConfig) {
  81.                 //TODO move this to config once more similar adapters are implemented
  82.                 if (in_array($dataHubConfig->getType(), ['simpleRest''ciHub'])) {
  83.                     $simpleRestConfigurations[$dataHubConfig->getName()] = $dataHubConfig->getConfiguration();
  84.                 }
  85.             }
  86.             $this->dataHubConfig $simpleRestConfigurations;
  87.         }
  88.         return $this->dataHubConfig;
  89.     }
  90.     /**
  91.      * @param array $dataHubConfig
  92.      */
  93.     public function setDataHubConfig(array $dataHubConfig): void
  94.     {
  95.         $this->dataHubConfig $dataHubConfig;
  96.     }
  97.     /**
  98.      * @param string|null $configName
  99.      * @param bool $forceDisabled
  100.      *
  101.      * @return array
  102.      */
  103.     protected function getConfigsToProcess(string $configName nullbool $forceDisabled false): array
  104.     {
  105.         $configsToProcess $configName;
  106.         if (empty($configsToProcess)) {
  107.             $configsToProcess array_keys($this->getDataHubConfig());
  108.         }
  109.         if (!is_array($configsToProcess)) {
  110.             $configsToProcess = [$configsToProcess];
  111.         }
  112.         if (!$forceDisabled) {
  113.             $configsToProcess array_filter($configsToProcess, function ($config) {
  114.                 return $this->getDataHubConfig()[$config]['general']['active'] ?? false;
  115.             });
  116.         }
  117.         return $configsToProcess;
  118.     }
  119.     /**
  120.      * @param string $configName
  121.      *
  122.      * @return AbstractMappingAndDataExtractor[]
  123.      *
  124.      * @throws InvalidRequestException
  125.      */
  126.     protected function getDataExtractorsForConfig(string $configName): array
  127.     {
  128.         $config $this->getDataHubConfig()[$configName] ?? null;
  129.         if (empty($config)) {
  130.             throw new InvalidRequestException("Invalid or unknown config name '$configName'.");
  131.         }
  132.         if (isset($this->dataExtractors[$configName])) {
  133.             return $this->dataExtractors[$configName];
  134.         }
  135.         $fieldsForAggregations = [];
  136.         foreach ($config['labelSettings'] ?? [] as $setting) {
  137.             if ($setting['useInAggs'] ?? false) {
  138.                 $fieldsForAggregations[$setting['id']] = true;
  139.             }
  140.         }
  141.         $dataExtractors = [];
  142.         if ($config['schema']['assets']['enabled'] ?? false) {
  143.             $dataExtractors[DataExtractorFactory::DATA_EXTRACTOR_TYPE_ASSET] = $this->dataExtractorFactory->buildDataExtractor(
  144.                 $configName,
  145.                 DataExtractorFactory::DATA_EXTRACTOR_TYPE_ASSET,
  146.                 $config['schema']['assets'],
  147.                 $config['workspaces']['asset'] ?? [],
  148.                 $fieldsForAggregations,
  149.                 $this->indexNamePrefix
  150.             );
  151.             $dataExtractors[DataExtractorFactory::DATA_EXTRACTOR_TYPE_ASSET_FOLDER] = $this->dataExtractorFactory->buildDataExtractor(
  152.                 $configName,
  153.                 DataExtractorFactory::DATA_EXTRACTOR_TYPE_ASSET_FOLDER,
  154.                 $config['schema']['assets'],
  155.                 $config['workspaces']['asset'] ?? [],
  156.                 $fieldsForAggregations,
  157.                 $this->indexNamePrefix
  158.             );
  159.         }
  160.         if ($config['schema']['dataObjectClasses']) {
  161.             foreach ($config['schema']['dataObjectClasses'] as $objectClassConfig) {
  162.                 //include thumbnails from assets (if existing)
  163.                 $objectClassConfig['assets']['thumbnails'] = $config['schema']['assets']['thumbnails'] ?? [];
  164.                 $objectClassConfig['assets']['allowOriginalImage'] = $config['schema']['assets']['allowOriginalImage'] ?? false;
  165.                 $dataExtractors[$objectClassConfig['id']] = $this->dataExtractorFactory->buildDataExtractor(
  166.                     $configName,
  167.                     $objectClassConfig['id'],
  168.                     $objectClassConfig,
  169.                     $config['workspaces']['object'] ?? [],
  170.                     $fieldsForAggregations,
  171.                     $this->indexNamePrefix
  172.                 );
  173.             }
  174.             $dataExtractors[DataExtractorFactory::DATA_EXTRACTOR_TYPE_OBJECT_FOLDER] = $this->dataExtractorFactory->buildDataExtractor(
  175.                 $configName,
  176.                 DataExtractorFactory::DATA_EXTRACTOR_TYPE_OBJECT_FOLDER,
  177.                 [],
  178.                 $config['workspaces']['object'] ?? [],
  179.                 $fieldsForAggregations,
  180.                 $this->indexNamePrefix
  181.             );
  182.         }
  183.         $this->dataExtractors[$configName] = $dataExtractors;
  184.         return $dataExtractors;
  185.     }
  186.     /**
  187.      * @param string $configName
  188.      * @param string $entityType
  189.      *
  190.      * @return AbstractMappingAndDataExtractor|null
  191.      *
  192.      * @throws InvalidRequestException
  193.      */
  194.     protected function getDataExtractorForConfigAndEntityType(string $configNamestring $entityType): ?AbstractMappingAndDataExtractor
  195.     {
  196.         return $this->getDataExtractorsForConfig($configName)[$entityType] ?? null;
  197.     }
  198.     /**
  199.      * @param string $configName
  200.      * @param string $entityType
  201.      *
  202.      * @return AbstractMappingAndDataExtractor[]
  203.      *
  204.      * @throws InvalidRequestException
  205.      */
  206.     protected function getDataExtractorCollectionForConfigAndType(string $configNamestring $entityType): array
  207.     {
  208.         $allDataExtractors $this->getDataExtractorsForConfig($configName);
  209.         if ($entityType === DataExtractorFactory::DATA_EXTRACTOR_TYPE_ASSET || $entityType === DataExtractorFactory::DATA_EXTRACTOR_TYPE_ASSET_FOLDER) {
  210.             return array_filter([
  211.                 DataExtractorFactory::DATA_EXTRACTOR_TYPE_ASSET => $allDataExtractors[DataExtractorFactory::DATA_EXTRACTOR_TYPE_ASSET] ?? null,
  212.                 DataExtractorFactory::DATA_EXTRACTOR_TYPE_ASSET_FOLDER => $allDataExtractors[DataExtractorFactory::DATA_EXTRACTOR_TYPE_ASSET_FOLDER] ?? null
  213.             ]);
  214.         } else {
  215.             $result = [];
  216.             foreach ($allDataExtractors as $dataExtractorType => $dataExtractor) {
  217.                 if ($dataExtractorType !== DataExtractorFactory::DATA_EXTRACTOR_TYPE_ASSET && $dataExtractorType !== DataExtractorFactory::DATA_EXTRACTOR_TYPE_ASSET_FOLDER) {
  218.                     $result[$dataExtractorType] = $dataExtractor;
  219.                 }
  220.             }
  221.             return $result;
  222.         }
  223.     }
  224.     /**
  225.      * @param ElementInterface $element
  226.      *
  227.      * @return string
  228.      *
  229.      * @throws \Exception
  230.      */
  231.     public function getEntityTypeForElement(ElementInterface $element): string
  232.     {
  233.         if ($element instanceof Folder) {
  234.             return DataExtractorFactory::DATA_EXTRACTOR_TYPE_ASSET_FOLDER;
  235.         } elseif ($element instanceof Asset) {
  236.             return DataExtractorFactory::DATA_EXTRACTOR_TYPE_ASSET;
  237.         } elseif ($element instanceof \Pimcore\Model\DataObject\Folder) {
  238.             return DataExtractorFactory::DATA_EXTRACTOR_TYPE_OBJECT_FOLDER;
  239.         } elseif ($element instanceof Concrete) {
  240.             return $element->getClassName();
  241.         } else {
  242.             throw new \Exception('Invalid element type for element ' $element->getType());
  243.         }
  244.     }
  245.     /**
  246.      * @param string $configName
  247.      * @param string $token
  248.      *
  249.      * @return bool
  250.      *
  251.      * @throws InvalidRequestException
  252.      */
  253.     public function validateToken(string $configNamestring $token): bool
  254.     {
  255.         $config $this->getDataHubConfig()[$configName] ?? null;
  256.         if (empty($config) || !$config['general']['active']) {
  257.             throw new InvalidRequestException("Invalid or unknown config name '$configName'.");
  258.         }
  259.         $endpointToken $config['deliverySettings']['apikey'] ?? null;
  260.         if ($endpointToken == null || $endpointToken !== $token) {
  261.             return false;
  262.         }
  263.         return true;
  264.     }
  265. }