<?php namespace Wrm\Events\Domain\DestinationData; use TYPO3\CMS\Core\Resource\ResourceFactory; use TYPO3\CMS\Extbase\Configuration\ConfigurationManager; use TYPO3\CMS\Extbase\Persistence\Generic\Session; use Wrm\Events\Domain\Model\Import; /** * This is only for legacy imports where folder is not configured by TCA and provided in TYPO3 way, * but provided as plain string which was resolved to default storyage within import service. * * Should be dropped once old import command is dropped. */ class LegacyImportFactory { /** * @var ImportFactory */ private $importFactory; /** * @var ResourceFactory */ private $resourceFactory; /** * @var ConfigurationManager */ private $configurationManager; /** * @var Session */ private $extbasePersistenceSession; public function __construct( ImportFactory $importFactory, ResourceFactory $resourceFactory, ConfigurationManager $configurationManager, Session $extbasePersistenceSession ) { $this->importFactory = $importFactory; $this->resourceFactory = $resourceFactory; $this->configurationManager = $configurationManager; $this->extbasePersistenceSession = $extbasePersistenceSession; } public function createFromArray(array $configuration): Import { $result = array_map('strval', $configuration); $result['uid'] = $this->getUniqueUid(); $result['files_folder'] = $this->migrateFileFolder($result['files_folder'] ?? ''); $result['region'] = $result['region_uid']; unset($result['region_uid']); $result = $this->addCategorySettings($result); return $this->importFactory->create($result); } private function getUniqueUid(): string { do { // Only temporary solution as long as legacy exists. // Cool solution would be to fetch highest uid + 100, but that's to much for now. // Also this will vanish in future. $uid = (string) random_int(999, PHP_INT_MAX); } while ($this->extbasePersistenceSession->hasIdentifier($uid, Import::class)); return $uid; } private function migrateFileFolder(string $fileFolder): string { $storage = $this->resourceFactory->getDefaultStorage(); if ($storage === null) { throw new \Exception('No default storage defined. Cancel import.', 1643290642); } $uid = $storage->getUid(); return $uid . ':/' . trim($fileFolder, '/') . '/'; } private function addCategorySettings(array $result): array { $settings = $this->configurationManager->getConfiguration( ConfigurationManager::CONFIGURATION_TYPE_SETTINGS, 'Events', 'Pi1' ); $result['categories_pid'] = $settings['destinationData']['categoriesPid'] ?? ''; $result['category_parent'] = $settings['destinationData']['categoryParentUid'] ?? ''; return $result; } }