mirror of
https://github.com/werkraum-media/thuecat.git
synced 2024-12-27 14:26:11 +01:00
WIP|Prevent endless loops
This commit is contained in:
parent
45eda76e98
commit
d988d4bd33
6 changed files with 114 additions and 10 deletions
|
@ -143,13 +143,14 @@ class Importer
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($urlProvider->getUrls() as $url) {
|
foreach ($urlProvider->getUrls() as $url) {
|
||||||
|
$this->logger->info('Process url.', ['url' => $url]);
|
||||||
$this->importResourceByUrl($url);
|
$this->importResourceByUrl($url);
|
||||||
|
$this->logger->info('Finished url.', ['url' => $url]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function importResourceByUrl(string $url): void
|
private function importResourceByUrl(string $url): void
|
||||||
{
|
{
|
||||||
$this->logger->info('Process url.', ['url' => $url]);
|
|
||||||
if ($this->import->handledRemoteId($url)) {
|
if ($this->import->handledRemoteId($url)) {
|
||||||
$this->logger->notice('Skip Url as we already handled it during import.', ['url' => $url]);
|
$this->logger->notice('Skip Url as we already handled it during import.', ['url' => $url]);
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -46,6 +46,7 @@ use WerkraumMedia\ThueCat\Domain\Import\Model\Entity;
|
||||||
use WerkraumMedia\ThueCat\Domain\Import\Model\GenericEntity;
|
use WerkraumMedia\ThueCat\Domain\Import\Model\GenericEntity;
|
||||||
use WerkraumMedia\ThueCat\Domain\Import\ResolveForeignReference;
|
use WerkraumMedia\ThueCat\Domain\Import\ResolveForeignReference;
|
||||||
use WerkraumMedia\ThueCat\Domain\Model\Backend\ImportConfiguration;
|
use WerkraumMedia\ThueCat\Domain\Model\Backend\ImportConfiguration;
|
||||||
|
use WerkraumMedia\ThueCat\Domain\Model\Backend\RequestedImportType;
|
||||||
use WerkraumMedia\ThueCat\Domain\Repository\Backend\OrganisationRepository;
|
use WerkraumMedia\ThueCat\Domain\Repository\Backend\OrganisationRepository;
|
||||||
use WerkraumMedia\ThueCat\Domain\Repository\Backend\ParkingFacilityRepository;
|
use WerkraumMedia\ThueCat\Domain\Repository\Backend\ParkingFacilityRepository;
|
||||||
use WerkraumMedia\ThueCat\Domain\Repository\Backend\TownRepository;
|
use WerkraumMedia\ThueCat\Domain\Repository\Backend\TownRepository;
|
||||||
|
@ -109,6 +110,14 @@ class GeneralConverter implements Converter
|
||||||
Organisation::class => 'tx_thuecat_organisation',
|
Organisation::class => 'tx_thuecat_organisation',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string[]
|
||||||
|
*/
|
||||||
|
private $tablesAllowedWithoutManager = [
|
||||||
|
'tx_thuecat_organisation',
|
||||||
|
'tx_thuecat_town',
|
||||||
|
];
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
ResolveForeignReference $resolveForeignReference,
|
ResolveForeignReference $resolveForeignReference,
|
||||||
Importer $importer,
|
Importer $importer,
|
||||||
|
@ -200,8 +209,11 @@ class GeneralConverter implements Converter
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($tableName !== 'tx_thuecat_organisation' && $this->getManagerUid($entity) === '') {
|
if (
|
||||||
$this->logger->info('Skipped conversion of entity, is not an organisation and no manager was available', [
|
in_array($tableName, $this->tablesAllowedWithoutManager) === false
|
||||||
|
&& $this->getManagerUid($entity) === ''
|
||||||
|
) {
|
||||||
|
$this->logger->info('Skipped conversion of entity, is not an record type that is allowed without manager and no manager was available', [
|
||||||
'remoteId' => $entity->getId(),
|
'remoteId' => $entity->getId(),
|
||||||
]);
|
]);
|
||||||
return false;
|
return false;
|
||||||
|
@ -259,19 +271,28 @@ class GeneralConverter implements Converter
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getManagerUid(object $entity): string
|
private function getManagerUid(Minimum $entity): string
|
||||||
{
|
{
|
||||||
|
if ($this->importConfiguration->getRequestedImportType()->equals(RequestedImportType::MANAGER)) {
|
||||||
|
$this->logger->info('Skipped fetching manager uid. We already try to import a manager and do not import managers for managers.', ['url' => $entity->getId()]);
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
method_exists($entity, 'getManagedBy') === false
|
method_exists($entity, 'getManagedBy') === false
|
||||||
|| !$entity->getManagedBy() instanceof ForeignReference
|
|| !$entity->getManagedBy() instanceof ForeignReference
|
||||||
) {
|
) {
|
||||||
|
$this->logger->info('Skipped fetching manager uid. The entity did not provide a getManagedBy method or the method did not return a ForeignReference.', ['url' => $entity->getId()]);
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->logger->info('Start import for manager.', ['urls' => ResolveForeignReference::convertToRemoteIds([$entity->getManagedBy()])]);
|
||||||
$this->importer->importConfiguration(
|
$this->importer->importConfiguration(
|
||||||
ImportConfiguration::createFromBaseWithForeignReferences(
|
ImportConfiguration::createFromBaseWithForeignReferences(
|
||||||
$this->importConfiguration,
|
$this->importConfiguration,
|
||||||
[$entity->getManagedBy()]
|
[$entity->getManagedBy()],
|
||||||
|
[],
|
||||||
|
RequestedImportType::MANAGER
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
$manager = $this->organisationRepository->findOneByRemoteId(
|
$manager = $this->organisationRepository->findOneByRemoteId(
|
||||||
|
@ -281,20 +302,27 @@ class GeneralConverter implements Converter
|
||||||
return $manager ? (string)$manager->getUid() : '';
|
return $manager ? (string)$manager->getUid() : '';
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getTownUid(object $entity): string
|
private function getTownUid(Minimum $entity): string
|
||||||
{
|
{
|
||||||
|
if ($this->importConfiguration->getRequestedImportType()->equals(RequestedImportType::TOWN)) {
|
||||||
|
$this->logger->info('Skipped fetching town uid. We already try to import a town and do not import town for town.', ['url' => $entity->getId()]);
|
||||||
|
return '';
|
||||||
|
}
|
||||||
if (
|
if (
|
||||||
$entity instanceof Town
|
$entity instanceof Town
|
||||||
|| method_exists($entity, 'getContainedInPlaces') === false
|
|| method_exists($entity, 'getContainedInPlaces') === false
|
||||||
) {
|
) {
|
||||||
|
$this->logger->info('Skipped fetching town uid. The entity did not provide a getContainedInPlaces method or was a town itself.', ['url' => $entity->getId()]);
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->logger->info('Start import for town.', ['urls' => ResolveForeignReference::convertToRemoteIds($entity->getContainedInPlaces())]);
|
||||||
$this->importer->importConfiguration(
|
$this->importer->importConfiguration(
|
||||||
ImportConfiguration::createFromBaseWithForeignReferences(
|
ImportConfiguration::createFromBaseWithForeignReferences(
|
||||||
$this->importConfiguration,
|
$this->importConfiguration,
|
||||||
$entity->getContainedInPlaces(),
|
$entity->getContainedInPlaces(),
|
||||||
['thuecat:Town']
|
['thuecat:Town'],
|
||||||
|
RequestedImportType::TOWN
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
$town = $this->townRepository->findOneByEntity($entity);
|
$town = $this->townRepository->findOneByEntity($entity);
|
||||||
|
@ -307,6 +335,7 @@ class GeneralConverter implements Converter
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->logger->info('Start import for parking facilities near by.', ['urls' => ResolveForeignReference::convertToRemoteIds($entity->getParkingFacilitiesNearBy())]);
|
||||||
$this->importer->importConfiguration(
|
$this->importer->importConfiguration(
|
||||||
ImportConfiguration::createFromBaseWithForeignReferences(
|
ImportConfiguration::createFromBaseWithForeignReferences(
|
||||||
$this->importConfiguration,
|
$this->importConfiguration,
|
||||||
|
@ -320,7 +349,7 @@ class GeneralConverter implements Converter
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getAccessibilitySpecification(
|
private function getAccessibilitySpecification(
|
||||||
object $entity,
|
Minimum $entity,
|
||||||
string $language
|
string $language
|
||||||
): string {
|
): string {
|
||||||
if (
|
if (
|
||||||
|
|
|
@ -66,11 +66,22 @@ class ImportConfiguration extends AbstractEntity implements ImportConfigurationI
|
||||||
/**
|
/**
|
||||||
* @var string[]
|
* @var string[]
|
||||||
*/
|
*/
|
||||||
protected $allowedTypes = [];
|
private $allowedTypes = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var RequestedImportType
|
||||||
|
*/
|
||||||
|
private $requestedImportType = null;
|
||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->initializeObject();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function initializeObject(): void
|
||||||
{
|
{
|
||||||
$this->logs = new ObjectStorage();
|
$this->logs = new ObjectStorage();
|
||||||
|
$this->requestedImportType = new RequestedImportType();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getTitle(): string
|
public function getTitle(): string
|
||||||
|
@ -142,6 +153,11 @@ class ImportConfiguration extends AbstractEntity implements ImportConfigurationI
|
||||||
return $this->allowedTypes;
|
return $this->allowedTypes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getRequestedImportType(): RequestedImportType
|
||||||
|
{
|
||||||
|
return $this->requestedImportType;
|
||||||
|
}
|
||||||
|
|
||||||
public function getSyncScopeId(): string
|
public function getSyncScopeId(): string
|
||||||
{
|
{
|
||||||
return $this->getConfigurationValueFromFlexForm('syncScopeId');
|
return $this->getConfigurationValueFromFlexForm('syncScopeId');
|
||||||
|
@ -181,12 +197,14 @@ class ImportConfiguration extends AbstractEntity implements ImportConfigurationI
|
||||||
public static function createFromBaseWithForeignReferences(
|
public static function createFromBaseWithForeignReferences(
|
||||||
self $base,
|
self $base,
|
||||||
array $foreignReferences,
|
array $foreignReferences,
|
||||||
array $allowedTypes = []
|
array $allowedTypes = [],
|
||||||
|
string $requestedImportType = ''
|
||||||
): self {
|
): self {
|
||||||
$configuration = clone $base;
|
$configuration = clone $base;
|
||||||
$configuration->urls = ResolveForeignReference::convertToRemoteIds($foreignReferences);
|
$configuration->urls = ResolveForeignReference::convertToRemoteIds($foreignReferences);
|
||||||
$configuration->type = 'static';
|
$configuration->type = 'static';
|
||||||
$configuration->allowedTypes = $allowedTypes;
|
$configuration->allowedTypes = $allowedTypes;
|
||||||
|
$configuration->requestedImportType = new RequestedImportType($requestedImportType);
|
||||||
return $configuration;
|
return $configuration;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
42
Classes/Domain/Model/Backend/RequestedImportType.php
Normal file
42
Classes/Domain/Model/Backend/RequestedImportType.php
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Daniel Siepmann <coding@daniel-siepmann.de>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||||
|
* 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace WerkraumMedia\ThueCat\Domain\Model\Backend;
|
||||||
|
|
||||||
|
use TYPO3\CMS\Core\Type\Enumeration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates that a domain specific type was requested to be imported.
|
||||||
|
*
|
||||||
|
* This can be used for further checks during import, e.g. abort recursive imports if a manager needs a manager.
|
||||||
|
*/
|
||||||
|
class RequestedImportType extends Enumeration
|
||||||
|
{
|
||||||
|
const __default = self::NONE;
|
||||||
|
|
||||||
|
const NONE = '';
|
||||||
|
|
||||||
|
const MANAGER = 'manager';
|
||||||
|
|
||||||
|
const TOWN = 'town';
|
||||||
|
}
|
|
@ -15,3 +15,4 @@ Those changes are documented so we know what to do once we drop an older version
|
||||||
:reversed:
|
:reversed:
|
||||||
|
|
||||||
Maintenance/PHP/*
|
Maintenance/PHP/*
|
||||||
|
Maintenance/TYPO3/*
|
||||||
|
|
13
Documentation/Maintenance/TYPO3/11.5.rst
Normal file
13
Documentation/Maintenance/TYPO3/11.5.rst
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
TYPO3 11.5
|
||||||
|
==========
|
||||||
|
|
||||||
|
Changes that should happen once we drop TYPO3 11.5.
|
||||||
|
|
||||||
|
Remove ``initializeObject()`` methods
|
||||||
|
-------------------------------------
|
||||||
|
|
||||||
|
Those are necessary prior v12 in order to properly initialize none re-constructed
|
||||||
|
data within Extbase models.
|
||||||
|
This vanished with v12 where ``makeInstance()`` is used which will call the ``__construct()`` method.
|
||||||
|
|
||||||
|
The content of the method should move to ``__construct()`` and the method should be removed.
|
Loading…
Reference in a new issue