diff --git a/CHANGELOG.md b/CHANGELOG.md index d91adce9f..a2e78a7de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # NEXT - #15568 - Switched to PHP Symfony service definitions +- #14598 - Introduced `MigrationConfiguration` service as a central place for internal configurations # 16.1.1 diff --git a/CHANGELOG_de-DE.md b/CHANGELOG_de-DE.md index 05e274dce..ad74947f3 100644 --- a/CHANGELOG_de-DE.md +++ b/CHANGELOG_de-DE.md @@ -1,6 +1,7 @@ # NEXT - #15568 - Umstellung auf PHP-Symfony-Service-Definitionen +- #14598 - `MigrationConfiguration` als zentrale Stelle für interne Konfigurationen eingeführt # 16.1.1 diff --git a/UPGRADE.md b/UPGRADE.md index 725077458..c2b85a000 100644 --- a/UPGRADE.md +++ b/UPGRADE.md @@ -1,3 +1,18 @@ +# NEXT + +- [BREAKING] - refactor!: centralize configuration into `MigrationConfiguration` service + - [BREAKING] Added required constructor parameter `SwagMigrationAssistant\Migration\MigrationConfiguration $migrationConfig` to `SwagMigrationAssistant\Migration\Media\Processor\HttpDownloadServiceBase` + - [BREAKING] Added required constructor parameter `SwagMigrationAssistant\Migration\MigrationConfiguration $migrationConfig` to `SwagMigrationAssistant\Profile\Shopware6\Media\HttpOrderDocumentGenerationService` + - [BREAKING] Removed constant `BUFFER_SIZE` from `SwagMigrationAssistant\Migration\Logging\LoggingService`, use `MigrationConfiguration::$MIGRATION_LOG_BUFFER_SIZE` instead + - [BREAKING] Removed constant `TRACE_ITEM_LIMIT` from `SwagMigrationAssistant\Migration\Logging\LoggingService`, use `MigrationConfiguration::$MIGRATION_LOG_EXCEPTION_TRACE_ITEM_LIMIT` instead + - [BREAKING] Removed constant `LOG_FETCH_LIMIT` from `SwagMigrationAssistant\Migration\History\HistoryService`, use `MigrationConfiguration::$MIGRATION_DEFAULT_FETCH_SIZE` instead + - [BREAKING] Removed constant `LOG_TIME_FORMAT` from `SwagMigrationAssistant\Migration\History\HistoryService` + - [BREAKING] Removed constant `BATCH_SIZE` from `SwagMigrationAssistant\Migration\MessageQueue\Handler\ResetChecksumHandler`, use `MigrationConfiguration::$MIGRATION_DEFAULT_BATCH_SIZE` instead + - [BREAKING] Removed constant `BATCH_SIZE` from `SwagMigrationAssistant\Migration\MessageQueue\Handler\Processor\CleanUpProcessor`, use `MigrationConfiguration::$MIGRATION_DEFAULT_BATCH_SIZE` instead + - [BREAKING] Removed constant `MEDIA_ERROR_THRESHOLD` from `SwagMigrationAssistant\Migration\MessageQueue\Handler\Processor\MediaProcessingProcessor`, use `MigrationConfiguration::$MIGRATION_DEFAULT_EXCEPTION_THRESHOLD` instead + - [BREAKING] Removed constant `MESSAGE_SIZE` from `SwagMigrationAssistant\Migration\MessageQueue\Handler\Processor\MediaProcessingProcessor`, use `MigrationConfiguration::$MIGRATION_MEDIA_PROCESSING_BATCH_SIZE` instead + - Added `SwagMigrationAssistant\Migration\MigrationConfiguration` service + # 16.0.0 - [BREAKING] [#124](https://github.com/shopware/SwagMigrationAssistant/pull/124) - refactor!: refactored log classes naming pattern diff --git a/src/DependencyInjection/migration.php b/src/DependencyInjection/migration.php index 7da7773e0..b5b10c4ee 100644 --- a/src/DependencyInjection/migration.php +++ b/src/DependencyInjection/migration.php @@ -78,6 +78,7 @@ use SwagMigrationAssistant\Migration\MessageQueue\Handler\ThemeAssignHandler; use SwagMigrationAssistant\Migration\MessageQueue\Handler\TruncateMigrationHandler; use SwagMigrationAssistant\Migration\MessageQueue\OrderCountIndexer; +use SwagMigrationAssistant\Migration\MigrationConfiguration; use SwagMigrationAssistant\Migration\MigrationContextFactory; use SwagMigrationAssistant\Migration\Premapping\PremappingReaderRegistry; use SwagMigrationAssistant\Migration\Profile\ProfileRegistry; @@ -95,10 +96,13 @@ return static function (ContainerConfigurator $container): void { $services = $container->services(); + $services->set(MigrationConfiguration::class); + $services->set(LoggingService::class) ->args([ service('swag_migration_logging.repository'), service('logger'), + service(MigrationConfiguration::class), ]) ->tag('kernel.reset', ['method' => 'reset']); @@ -275,6 +279,7 @@ ->args([ service('swag_migration_logging.repository'), service('swag_migration_run.repository'), + service(MigrationConfiguration::class), ]); $services->set(MigrationDataFetcher::class) @@ -322,6 +327,7 @@ service('swag_migration_media_file.repository'), service(FileSaver::class), service(LoggingService::class), + service(MigrationConfiguration::class), ]); $services->set(PremappingController::class) @@ -393,6 +399,7 @@ ->args([ service(Connection::class), service('messenger.default_bus'), + service(MigrationConfiguration::class), ]) ->tag('messenger.message_handler'); @@ -405,6 +412,7 @@ service('swag_migration_run.repository'), service(MigrationContextFactory::class), service(MigrationProcessorRegistry::class), + service(MigrationConfiguration::class), ]) ->tag('messenger.message_handler'); @@ -414,6 +422,7 @@ service('messenger.default_bus'), service('swag_migration_run.repository'), service(RunTransitionService::class), + service(MigrationConfiguration::class), ]) ->tag('messenger.message_handler'); @@ -463,6 +472,7 @@ ->args([ service(Connection::class), service('messenger.default_bus'), + service(MigrationConfiguration::class), ]) ->tag('shopware.migration.processor'); @@ -483,6 +493,7 @@ service(Connection::class), service(MediaFileProcessorRegistry::class), service(DataSetRegistry::class), + service(MigrationConfiguration::class), ]) ->tag('shopware.migration.processor'); diff --git a/src/DependencyInjection/shopware.php b/src/DependencyInjection/shopware.php index 2a547b9ec..e0dc2f43e 100644 --- a/src/DependencyInjection/shopware.php +++ b/src/DependencyInjection/shopware.php @@ -35,6 +35,7 @@ use SwagMigrationAssistant\Migration\Media\MediaFileService; use SwagMigrationAssistant\Migration\Media\Processor\BaseMediaService; use SwagMigrationAssistant\Migration\Media\Processor\HttpDownloadServiceBase; +use SwagMigrationAssistant\Migration\MigrationConfiguration; use SwagMigrationAssistant\Migration\Writer\AbstractWriter; use SwagMigrationAssistant\Profile\Shopware\Converter\AttributeConverter; use SwagMigrationAssistant\Profile\Shopware\Converter\CategoryAttributeConverter; @@ -227,7 +228,10 @@ $services->set(HttpOrderDocumentDownloadService::class) ->parent(HttpDownloadServiceBase::class) - ->args([service(ConnectionFactory::class)]) + ->args([ + service(ConnectionFactory::class), + service(MigrationConfiguration::class), + ]) ->tag('shopware.migration.media_file_processor'); $services->set(LocalOrderDocumentProcessor::class) @@ -252,7 +256,10 @@ $services->set(HttpEsdFileDownloadService::class) ->parent(HttpDownloadServiceBase::class) - ->args([service(ConnectionFactory::class)]) + ->args([ + service(ConnectionFactory::class), + service(MigrationConfiguration::class), + ]) ->tag('shopware.migration.media_file_processor'); $services->set(ShopwareConverter::class) diff --git a/src/DependencyInjection/shopware6.php b/src/DependencyInjection/shopware6.php index 6641079e4..ec2a59359 100644 --- a/src/DependencyInjection/shopware6.php +++ b/src/DependencyInjection/shopware6.php @@ -67,6 +67,7 @@ use SwagMigrationAssistant\Migration\Media\MediaFileService; use SwagMigrationAssistant\Migration\Media\Processor\BaseMediaService; use SwagMigrationAssistant\Migration\Media\Processor\HttpDownloadServiceBase; +use SwagMigrationAssistant\Migration\MigrationConfiguration; use SwagMigrationAssistant\Migration\Writer\AbstractWriter; use SwagMigrationAssistant\Profile\Shopware6\Converter\CategoryAssociationConverter; use SwagMigrationAssistant\Profile\Shopware6\Converter\CategoryCmsPageAssociationConverter; @@ -277,7 +278,10 @@ $services = $container->services(); $services->set(ConnectionFactory::class) - ->args([service('swag_migration_connection.repository')]); + ->args([ + service('swag_migration_connection.repository'), + service(MigrationConfiguration::class), + ]); $services->set(Shopware6ApiGateway::class) ->args([ @@ -1194,12 +1198,18 @@ $services->set(HttpOrderDocumentDownloadService::class) ->parent(HttpDownloadServiceBase::class) - ->args([service(ConnectionFactory::class)]) + ->args([ + service(ConnectionFactory::class), + service(MigrationConfiguration::class), + ]) ->tag('shopware.migration.media_file_processor'); $services->set(HttpProductDownloadService::class) ->parent(HttpDownloadServiceBase::class) - ->args([service(ConnectionFactory::class)]) + ->args([ + service(ConnectionFactory::class), + service(MigrationConfiguration::class), + ]) ->tag('shopware.migration.media_file_processor'); $services->set(HttpOrderDocumentGenerationService::class) @@ -1212,6 +1222,7 @@ service(MediaService::class), service(ConnectionFactory::class), service(Connection::class), + service(MigrationConfiguration::class), ]) ->tag('shopware.migration.media_file_processor'); }; diff --git a/src/DependencyInjection/subscriber.php b/src/DependencyInjection/subscriber.php index 05e6c8808..78de29a16 100644 --- a/src/DependencyInjection/subscriber.php +++ b/src/DependencyInjection/subscriber.php @@ -8,6 +8,7 @@ namespace Symfony\Component\DependencyInjection\Loader\Configurator; use SwagMigrationAssistant\Migration\Logging\LoggingService; +use SwagMigrationAssistant\Migration\MigrationConfiguration; use SwagMigrationAssistant\Migration\Run\RunTransitionService; use SwagMigrationAssistant\Migration\Subscriber\MediaDeletedSubscriber; use SwagMigrationAssistant\Migration\Subscriber\MessageQueueSubscriber; @@ -25,6 +26,7 @@ service('swag_migration_run.repository'), service(LoggingService::class), service(RunTransitionService::class), + service(MigrationConfiguration::class), ]) ->tag('kernel.event_subscriber'); }; diff --git a/src/Migration/History/HistoryService.php b/src/Migration/History/HistoryService.php index 8eae87db8..894efc0f0 100644 --- a/src/Migration/History/HistoryService.php +++ b/src/Migration/History/HistoryService.php @@ -7,6 +7,7 @@ namespace SwagMigrationAssistant\Migration\History; +use Shopware\Core\Defaults; use Shopware\Core\Framework\Context; use Shopware\Core\Framework\DataAbstractionLayer\EntityCollection; use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository; @@ -22,6 +23,7 @@ use SwagMigrationAssistant\Exception\MigrationException; use SwagMigrationAssistant\Migration\Logging\SwagMigrationLoggingCollection; use SwagMigrationAssistant\Migration\Logging\SwagMigrationLoggingEntity; +use SwagMigrationAssistant\Migration\MigrationConfiguration; use SwagMigrationAssistant\Migration\Run\MigrationProgress; use SwagMigrationAssistant\Migration\Run\SwagMigrationRunCollection; use SwagMigrationAssistant\Migration\Run\SwagMigrationRunEntity; @@ -29,9 +31,6 @@ #[Package('fundamentals@after-sales')] class HistoryService implements HistoryServiceInterface { - public const LOG_FETCH_LIMIT = 50; - public const LOG_TIME_FORMAT = 'Y-m-d H:i:s T'; - /** * @param EntityRepository $runRepo * @param EntityRepository $loggingRepo @@ -39,6 +38,7 @@ class HistoryService implements HistoryServiceInterface public function __construct( private readonly EntityRepository $loggingRepo, private readonly EntityRepository $runRepo, + private readonly MigrationConfiguration $migrationConfig, ) { } @@ -118,7 +118,7 @@ public function downloadLogsOfRun(string $runUuid, Context $context): \Closure $this->printLogEntry($logEntry); } - $offset += self::LOG_FETCH_LIMIT; + $offset += $this->migrationConfig->migrationDefaultFetchSize; } }; } @@ -131,7 +131,7 @@ private function printLogEntry(SwagMigrationLoggingEntity $logEntry): void \printf('Code: %s%s', $logEntry->getCode(), \PHP_EOL); \printf('Profile name: %s%s', $logEntry->getProfileName(), \PHP_EOL); \printf('Gateway name: %s%s', $logEntry->getGatewayName(), \PHP_EOL); - \printf('Created at: %s%s', $logEntry->getCreatedAt()?->format(self::LOG_TIME_FORMAT) ?? '-', \PHP_EOL); + \printf('Created at: %s%s', $logEntry->getCreatedAt()?->format(Defaults::STORAGE_DATE_TIME_FORMAT) ?? '-', \PHP_EOL); if ($logEntry->getEntityName()) { \printf('Entity: %s%s', $logEntry->getEntityName(), \PHP_EOL); @@ -217,7 +217,7 @@ private function getLogChunk(string $runUuid, int $offset, Context $context): En $criteria->addFilter(new EqualsFilter('userFixable', 0)); $criteria->addSorting(new FieldSorting('autoIncrement', FieldSorting::ASCENDING)); $criteria->setOffset($offset); - $criteria->setLimit(self::LOG_FETCH_LIMIT); + $criteria->setLimit($this->migrationConfig->migrationDefaultFetchSize); return $this->loggingRepo->search($criteria, $context)->getEntities(); } @@ -238,8 +238,8 @@ private function getPrefixLogInformation(SwagMigrationRunEntity $run): string $premapping = $connection->getPremapping(); } - $updatedAt = $run->getUpdatedAt()?->format(self::LOG_TIME_FORMAT) ?? '-'; - $createdAt = $run->getCreatedAt()?->format(self::LOG_TIME_FORMAT) ?? '-'; + $updatedAt = $run->getUpdatedAt()?->format(Defaults::STORAGE_DATE_TIME_FORMAT) ?? '-'; + $createdAt = $run->getCreatedAt()?->format(Defaults::STORAGE_DATE_TIME_FORMAT) ?? '-'; return \sprintf( '########## MIGRATION LOG ##########' . \PHP_EOL . \PHP_EOL @@ -260,7 +260,7 @@ private function getPrefixLogInformation(SwagMigrationRunEntity $run): string . 'Environment information (JSON):' . \PHP_EOL . '%s' . \PHP_EOL . \PHP_EOL . 'Pre-mapping (JSON):' . \PHP_EOL . '%s' . \PHP_EOL . \PHP_EOL . '########## LOG ENTRIES ##########' . \PHP_EOL, - \date(self::LOG_TIME_FORMAT), + \date(Defaults::STORAGE_DATE_TIME_FORMAT), $run->getId(), $run->getStepValue(), $createdAt, diff --git a/src/Migration/Logging/LoggingService.php b/src/Migration/Logging/LoggingService.php index 9db72d33a..8d27f98aa 100644 --- a/src/Migration/Logging/LoggingService.php +++ b/src/Migration/Logging/LoggingService.php @@ -12,15 +12,12 @@ use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository; use Shopware\Core\Framework\Log\Package; use SwagMigrationAssistant\Migration\Logging\Log\Builder\MigrationLogEntry; +use SwagMigrationAssistant\Migration\MigrationConfiguration; use Symfony\Contracts\Service\ResetInterface; #[Package('fundamentals@after-sales')] class LoggingService implements LoggingServiceInterface, ResetInterface { - final public const BUFFER_SIZE = 50; - - final public const TRACE_ITEM_LIMIT = 10; - /** * @var array> */ @@ -34,6 +31,7 @@ class LoggingService implements LoggingServiceInterface, ResetInterface public function __construct( private readonly EntityRepository $loggingRepo, private readonly LoggerInterface $logger, + private readonly MigrationConfiguration $migrationConfig, ) { } @@ -80,8 +78,8 @@ public function log(MigrationLogEntry $logEntry): self { $trace = $logEntry->getExceptionTrace(); - if ($trace !== null && \count($trace) > self::TRACE_ITEM_LIMIT) { - $trace = \array_slice($trace, 0, self::TRACE_ITEM_LIMIT); + if ($trace !== null && \count($trace) > $this->migrationConfig->migrationLogExceptionTraceItemLimit) { + $trace = \array_slice($trace, 0, $this->migrationConfig->migrationLogExceptionTraceItemLimit); } $this->buffer[] = [ @@ -101,7 +99,7 @@ public function log(MigrationLogEntry $logEntry): self 'exceptionTrace' => $trace, ]; - if (\count($this->buffer) >= self::BUFFER_SIZE) { + if (\count($this->buffer) >= $this->migrationConfig->migrationLogBufferSize) { $this->flush(); } diff --git a/src/Migration/Media/Processor/HttpDownloadServiceBase.php b/src/Migration/Media/Processor/HttpDownloadServiceBase.php index de3239a22..1c5983f21 100644 --- a/src/Migration/Media/Processor/HttpDownloadServiceBase.php +++ b/src/Migration/Media/Processor/HttpDownloadServiceBase.php @@ -32,7 +32,7 @@ use SwagMigrationAssistant\Migration\Media\MediaFileProcessorInterface; use SwagMigrationAssistant\Migration\Media\MediaProcessWorkloadStruct; use SwagMigrationAssistant\Migration\Media\SwagMigrationMediaFileCollection; -use SwagMigrationAssistant\Migration\MessageQueue\Handler\Processor\MediaProcessingProcessor; +use SwagMigrationAssistant\Migration\MigrationConfiguration; use SwagMigrationAssistant\Migration\MigrationContextInterface; /** @@ -49,6 +49,7 @@ public function __construct( EntityRepository $mediaFileRepo, private readonly FileSaver $fileSaver, private readonly LoggingServiceInterface $loggingService, + protected readonly MigrationConfiguration $migrationConfig, ) { parent::__construct($dbalConnection, $mediaFileRepo); } @@ -118,7 +119,7 @@ static function (MediaProcessWorkloadStruct $work) use ($uuid) { $work->setAdditionalData($additionalData); $work->setErrorCount($work->getErrorCount() + 1); - if ($work->getErrorCount() > MediaProcessingProcessor::MEDIA_ERROR_THRESHOLD) { + if ($work->getErrorCount() > $this->migrationConfig->migrationDefaultExceptionThreshold) { $failureUuids[] = $uuid; $work->setState(MediaProcessWorkloadStruct::ERROR_STATE); diff --git a/src/Migration/MessageQueue/Handler/MigrationProcessHandler.php b/src/Migration/MessageQueue/Handler/MigrationProcessHandler.php index a3ae98e5d..9b0793b38 100644 --- a/src/Migration/MessageQueue/Handler/MigrationProcessHandler.php +++ b/src/Migration/MessageQueue/Handler/MigrationProcessHandler.php @@ -13,6 +13,7 @@ use Shopware\Core\Framework\Log\Package; use SwagMigrationAssistant\Exception\MigrationException; use SwagMigrationAssistant\Migration\MessageQueue\Message\MigrationProcessMessage; +use SwagMigrationAssistant\Migration\MigrationConfiguration; use SwagMigrationAssistant\Migration\MigrationContextFactoryInterface; use SwagMigrationAssistant\Migration\Run\SwagMigrationRunCollection; use SwagMigrationAssistant\Migration\Run\SwagMigrationRunEntity; @@ -25,8 +26,6 @@ */ final class MigrationProcessHandler { - private int $batchSize = 100; - /** * @param EntityRepository $migrationRunRepo */ @@ -34,6 +33,7 @@ public function __construct( private readonly EntityRepository $migrationRunRepo, private readonly MigrationContextFactoryInterface $migrationContextFactory, private readonly MigrationProcessorRegistry $processorRegistry, + private readonly MigrationConfiguration $migrationConfig, ) { } @@ -47,7 +47,12 @@ public function __invoke(MigrationProcessMessage $message): void throw MigrationException::noRunProgressFound($run->getId()); } - $migrationContext = $this->migrationContextFactory->create($run, $progress->getCurrentEntityProgress(), $this->batchSize, $progress->getCurrentEntity()); + $migrationContext = $this->migrationContextFactory->create( + $run, + $progress->getCurrentEntityProgress(), + $this->migrationConfig->migrationDefaultBatchSize, + $progress->getCurrentEntity() + ); if ($migrationContext === null) { throw MigrationException::migrationContextNotCreated(); diff --git a/src/Migration/MessageQueue/Handler/Processor/CleanUpProcessor.php b/src/Migration/MessageQueue/Handler/Processor/CleanUpProcessor.php index f6c186d0f..a331745c1 100644 --- a/src/Migration/MessageQueue/Handler/Processor/CleanUpProcessor.php +++ b/src/Migration/MessageQueue/Handler/Processor/CleanUpProcessor.php @@ -14,6 +14,7 @@ use SwagMigrationAssistant\Migration\Data\SwagMigrationDataCollection; use SwagMigrationAssistant\Migration\Media\SwagMigrationMediaFileCollection; use SwagMigrationAssistant\Migration\MessageQueue\Message\MigrationProcessMessage; +use SwagMigrationAssistant\Migration\MigrationConfiguration; use SwagMigrationAssistant\Migration\MigrationContextInterface; use SwagMigrationAssistant\Migration\Run\MigrationProgress; use SwagMigrationAssistant\Migration\Run\MigrationStep; @@ -25,8 +26,6 @@ #[Package('fundamentals@after-sales')] class CleanUpProcessor extends AbstractProcessor { - public const BATCH_SIZE = 250; - /** * @param EntityRepository $migrationRunRepo * @param EntityRepository $migrationDataRepo @@ -39,6 +38,7 @@ public function __construct( RunTransitionServiceInterface $runTransitionService, private readonly Connection $connection, private readonly MessageBusInterface $bus, + private readonly MigrationConfiguration $migrationConfig, ) { parent::__construct( $migrationRunRepo, @@ -95,7 +95,7 @@ private function removeMigrationData(): int { return (int) $this->connection->createQueryBuilder() ->delete('swag_migration_data') - ->setMaxResults(self::BATCH_SIZE) + ->setMaxResults($this->migrationConfig->migrationDefaultBatchSize) ->executeStatement(); } diff --git a/src/Migration/MessageQueue/Handler/Processor/MediaProcessingProcessor.php b/src/Migration/MessageQueue/Handler/Processor/MediaProcessingProcessor.php index 16ce56703..c6e70abe6 100644 --- a/src/Migration/MessageQueue/Handler/Processor/MediaProcessingProcessor.php +++ b/src/Migration/MessageQueue/Handler/Processor/MediaProcessingProcessor.php @@ -28,6 +28,7 @@ use SwagMigrationAssistant\Migration\Media\MediaProcessWorkloadStruct; use SwagMigrationAssistant\Migration\Media\SwagMigrationMediaFileCollection; use SwagMigrationAssistant\Migration\MessageQueue\Message\MigrationProcessMessage; +use SwagMigrationAssistant\Migration\MigrationConfiguration; use SwagMigrationAssistant\Migration\MigrationContextInterface; use SwagMigrationAssistant\Migration\Run\MigrationProgress; use SwagMigrationAssistant\Migration\Run\MigrationStep; @@ -39,9 +40,6 @@ #[Package('fundamentals@after-sales')] class MediaProcessingProcessor extends AbstractProcessor { - final public const MEDIA_ERROR_THRESHOLD = 3; - final public const MESSAGE_SIZE = 10; - /** * @param EntityRepository $migrationRunRepo * @param EntityRepository $migrationDataRepo @@ -57,6 +55,7 @@ public function __construct( private readonly Connection $dbalConnection, private readonly MediaFileProcessorRegistryInterface $mediaFileProcessorRegistry, private readonly DataSetRegistry $dataSetRegistry, + private readonly MigrationConfiguration $migrationConfig, ) { parent::__construct( $migrationRunRepo, @@ -119,7 +118,7 @@ public function process( ++$currentCount; - if ($currentCount > self::MESSAGE_SIZE) { + if ($currentCount > $this->migrationConfig->migrationMediaProcessingBatchSize) { break; } @@ -203,7 +202,7 @@ private function processFailures( MediaFileProcessorInterface $processor, array $workload, ): void { - for ($i = 0; $i < self::MEDIA_ERROR_THRESHOLD; ++$i) { + for ($i = 0; $i < $this->migrationConfig->migrationDefaultExceptionThreshold; ++$i) { $errorWorkload = []; foreach ($workload as $item) { diff --git a/src/Migration/MessageQueue/Handler/ResetChecksumHandler.php b/src/Migration/MessageQueue/Handler/ResetChecksumHandler.php index 483af8053..10fcda85a 100644 --- a/src/Migration/MessageQueue/Handler/ResetChecksumHandler.php +++ b/src/Migration/MessageQueue/Handler/ResetChecksumHandler.php @@ -16,6 +16,7 @@ use SwagMigrationAssistant\Migration\DataSelection\DefaultEntities; use SwagMigrationAssistant\Migration\MessageQueue\Message\MigrationProcessMessage; use SwagMigrationAssistant\Migration\MessageQueue\Message\ResetChecksumMessage; +use SwagMigrationAssistant\Migration\MigrationConfiguration; use SwagMigrationAssistant\Migration\Run\MigrationProgress; use SwagMigrationAssistant\Migration\Run\MigrationStep; use SwagMigrationAssistant\Migration\Run\ProgressDataSetCollection; @@ -31,8 +32,6 @@ #[Package('fundamentals@after-sales')] final readonly class ResetChecksumHandler { - public const BATCH_SIZE = 250; - /** * @param EntityRepository $migrationRunRepo */ @@ -41,6 +40,7 @@ public function __construct( private MessageBusInterface $messageBus, private EntityRepository $migrationRunRepo, private RunTransitionServiceInterface $runTransitionService, + private MigrationConfiguration $migrationConfig, ) { } @@ -56,7 +56,7 @@ public function __invoke(ResetChecksumMessage $message): void $affectedRows = $this->resetChecksums($connectionId); $newProcessedCount = $message->getProcessedMappings() + $affectedRows; - $isCompleted = $affectedRows < self::BATCH_SIZE; + $isCompleted = $affectedRows < $this->migrationConfig->migrationDefaultBatchSize; if ($isCompleted) { $this->handleCompletion($message); @@ -115,7 +115,7 @@ private function resetChecksums(string $connectionId): int LIMIT :limit', [ 'connectionId' => Uuid::fromHexToBytes($connectionId), - 'limit' => self::BATCH_SIZE, + 'limit' => $this->migrationConfig->migrationDefaultBatchSize, ], [ 'connectionId' => ParameterType::BINARY, diff --git a/src/Migration/MessageQueue/Handler/TruncateMigrationHandler.php b/src/Migration/MessageQueue/Handler/TruncateMigrationHandler.php index 0dcc4dcc4..d1250132d 100644 --- a/src/Migration/MessageQueue/Handler/TruncateMigrationHandler.php +++ b/src/Migration/MessageQueue/Handler/TruncateMigrationHandler.php @@ -16,6 +16,7 @@ use SwagMigrationAssistant\Migration\Mapping\SwagMigrationMappingDefinition; use SwagMigrationAssistant\Migration\Media\SwagMigrationMediaFileDefinition; use SwagMigrationAssistant\Migration\MessageQueue\Message\TruncateMigrationMessage; +use SwagMigrationAssistant\Migration\MigrationConfiguration; use SwagMigrationAssistant\Migration\Run\SwagMigrationRunDefinition; use Symfony\Component\Messenger\Attribute\AsMessageHandler; use Symfony\Component\Messenger\MessageBusInterface; @@ -37,11 +38,10 @@ final class TruncateMigrationHandler SwagMigrationConnectionDefinition::ENTITY_NAME, ]; - private const BATCH_SIZE = 250; - public function __construct( private readonly Connection $connection, private readonly MessageBusInterface $bus, + private readonly MigrationConfiguration $migrationConfig, ) { } @@ -62,10 +62,10 @@ public function __invoke(TruncateMigrationMessage $message): void $currentTable = self::TABLE_TO_TRUNCATE[$currentStep]; $affectedRows = (int) $this->connection->executeStatement( - 'DELETE FROM ' . $currentTable . ' LIMIT ' . self::BATCH_SIZE + 'DELETE FROM ' . $currentTable . ' LIMIT ' . $this->migrationConfig->migrationDefaultBatchSize ); - if ($affectedRows >= self::BATCH_SIZE) { + if ($affectedRows >= $this->migrationConfig->migrationDefaultBatchSize) { $this->bus->dispatch(new TruncateMigrationMessage( $currentTable, )); diff --git a/src/Migration/MigrationConfiguration.php b/src/Migration/MigrationConfiguration.php new file mode 100644 index 000000000..b65e2e822 --- /dev/null +++ b/src/Migration/MigrationConfiguration.php @@ -0,0 +1,31 @@ + + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SwagMigrationAssistant\Migration; + +use Shopware\Core\Framework\Log\Package; + +/** + * @codeCoverageIgnore + */ +#[Package('fundamentals@after-sales')] +final readonly class MigrationConfiguration +{ + /** + * @internal + */ + public function __construct( + public int $migrationLogBufferSize = 50, + public int $migrationLogExceptionTraceItemLimit = 10, + public int $migrationDefaultBatchSize = 250, + public int $migrationMediaProcessingBatchSize = 10, + public int $migrationDefaultExceptionThreshold = 3, + public int $migrationDefaultFetchSize = 50, + public int $migrationRequestTimeout = 15, + ) { + } +} diff --git a/src/Migration/Subscriber/MessageQueueSubscriber.php b/src/Migration/Subscriber/MessageQueueSubscriber.php index 3e801f0a9..49abff1a9 100644 --- a/src/Migration/Subscriber/MessageQueueSubscriber.php +++ b/src/Migration/Subscriber/MessageQueueSubscriber.php @@ -16,6 +16,7 @@ use SwagMigrationAssistant\Migration\Logging\Log\RunMessageQueueExceptionLog; use SwagMigrationAssistant\Migration\Logging\LoggingServiceInterface; use SwagMigrationAssistant\Migration\MessageQueue\Message\MigrationProcessMessage; +use SwagMigrationAssistant\Migration\MigrationConfiguration; use SwagMigrationAssistant\Migration\Run\MigrationProgress; use SwagMigrationAssistant\Migration\Run\MigrationStep; use SwagMigrationAssistant\Migration\Run\RunTransitionServiceInterface; @@ -29,8 +30,6 @@ #[Package('fundamentals@after-sales')] class MessageQueueSubscriber implements EventSubscriberInterface { - private const MAX_EXCEPTION_COUNT = 3; - /** * @param EntityRepository $runRepo */ @@ -39,6 +38,7 @@ public function __construct( private EntityRepository $runRepo, private LoggingServiceInterface $loggingService, private readonly RunTransitionServiceInterface $runTransitionService, + private readonly MigrationConfiguration $migrationConfig, ) { } @@ -125,7 +125,7 @@ public function onWorkerMessageFailed(WorkerMessageFailedEvent $event): void * if so, transition to aborting automatically. * else, just save the new exception count and retry. */ - if ($progress->getExceptionCount() > self::MAX_EXCEPTION_COUNT) { + if ($progress->getExceptionCount() > $this->migrationConfig->migrationDefaultExceptionThreshold) { $this->runTransitionService->forceTransitionToRunStep($run->getId(), MigrationStep::ABORTING); $this->updateRun($run->getId(), $progress, $message->getContext()); } else { diff --git a/src/Profile/Shopware/Media/HttpEsdFileDownloadService.php b/src/Profile/Shopware/Media/HttpEsdFileDownloadService.php index a31fc6a61..47d489194 100644 --- a/src/Profile/Shopware/Media/HttpEsdFileDownloadService.php +++ b/src/Profile/Shopware/Media/HttpEsdFileDownloadService.php @@ -17,6 +17,7 @@ use SwagMigrationAssistant\Migration\Logging\LoggingServiceInterface; use SwagMigrationAssistant\Migration\Media\Processor\HttpDownloadServiceBase; use SwagMigrationAssistant\Migration\Media\SwagMigrationMediaFileCollection; +use SwagMigrationAssistant\Migration\MigrationConfiguration; use SwagMigrationAssistant\Migration\MigrationContextInterface; use SwagMigrationAssistant\Profile\Shopware\DataSelection\DataSet\ProductDownloadDataSet; use SwagMigrationAssistant\Profile\Shopware\Gateway\Api\ShopwareApiGateway; @@ -36,6 +37,7 @@ public function __construct( EntityRepository $mediaFileRepo, FileSaver $fileSaver, LoggingServiceInterface $loggingService, + MigrationConfiguration $migrationConfig, private readonly ConnectionFactoryInterface $connectionFactory, ) { parent::__construct( @@ -43,6 +45,7 @@ public function __construct( $mediaFileRepo, $fileSaver, $loggingService, + $migrationConfig ); } diff --git a/src/Profile/Shopware/Media/HttpMediaDownloadService.php b/src/Profile/Shopware/Media/HttpMediaDownloadService.php index 24294e4e9..49221f1c6 100644 --- a/src/Profile/Shopware/Media/HttpMediaDownloadService.php +++ b/src/Profile/Shopware/Media/HttpMediaDownloadService.php @@ -35,7 +35,9 @@ protected function getMediaEntity(): string protected function getHttpClient(MigrationContextInterface $migrationContext): ?HttpClientInterface { - return new HttpSimpleClient(); + return new HttpSimpleClient( + ['connect_timeout' => $this->migrationConfig->migrationRequestTimeout] + ); } protected function httpRequest(HttpClientInterface $client, array $additionalData): PromiseInterface diff --git a/src/Profile/Shopware/Media/HttpOrderDocumentDownloadService.php b/src/Profile/Shopware/Media/HttpOrderDocumentDownloadService.php index 5011c7db7..334202c87 100644 --- a/src/Profile/Shopware/Media/HttpOrderDocumentDownloadService.php +++ b/src/Profile/Shopware/Media/HttpOrderDocumentDownloadService.php @@ -17,6 +17,7 @@ use SwagMigrationAssistant\Migration\Logging\LoggingServiceInterface; use SwagMigrationAssistant\Migration\Media\Processor\HttpDownloadServiceBase; use SwagMigrationAssistant\Migration\Media\SwagMigrationMediaFileCollection; +use SwagMigrationAssistant\Migration\MigrationConfiguration; use SwagMigrationAssistant\Migration\MigrationContextInterface; use SwagMigrationAssistant\Profile\Shopware\DataSelection\DataSet\OrderDocumentDataSet; use SwagMigrationAssistant\Profile\Shopware\Gateway\Api\ShopwareApiGateway; @@ -36,6 +37,7 @@ public function __construct( EntityRepository $mediaFileRepo, FileSaver $fileSaver, LoggingServiceInterface $loggingService, + MigrationConfiguration $migrationConfig, private readonly ConnectionFactoryInterface $connectionFactory, ) { parent::__construct( @@ -43,6 +45,7 @@ public function __construct( $mediaFileRepo, $fileSaver, $loggingService, + $migrationConfig, ); } diff --git a/src/Profile/Shopware6/Gateway/Connection/ConnectionFactory.php b/src/Profile/Shopware6/Gateway/Connection/ConnectionFactory.php index 5c6019c1b..1b9a83e89 100644 --- a/src/Profile/Shopware6/Gateway/Connection/ConnectionFactory.php +++ b/src/Profile/Shopware6/Gateway/Connection/ConnectionFactory.php @@ -13,6 +13,7 @@ use Shopware\Core\Framework\Log\Package; use SwagMigrationAssistant\Migration\Connection\SwagMigrationConnectionCollection; use SwagMigrationAssistant\Migration\Gateway\HttpClientInterface; +use SwagMigrationAssistant\Migration\MigrationConfiguration; use SwagMigrationAssistant\Migration\MigrationContextInterface; #[Package('fundamentals@after-sales')] @@ -23,8 +24,10 @@ class ConnectionFactory implements ConnectionFactoryInterface /** * @param EntityRepository $connectionRepository */ - public function __construct(private readonly EntityRepository $connectionRepository) - { + public function __construct( + private readonly EntityRepository $connectionRepository, + private readonly MigrationConfiguration $migrationConfig, + ) { } public function createApiClient(MigrationContextInterface $migrationContext): ?HttpClientInterface @@ -37,7 +40,7 @@ public function createApiClient(MigrationContextInterface $migrationContext): ?H $options = [ 'base_uri' => \rtrim((string) $credentials['endpoint'], '/') . '/' . self::DEFAULT_API_ENDPOINT, - 'connect_timeout' => 15.0, + 'connect_timeout' => $this->migrationConfig->migrationRequestTimeout, ]; return new AuthClient( diff --git a/src/Profile/Shopware6/Media/HttpMediaDownloadService.php b/src/Profile/Shopware6/Media/HttpMediaDownloadService.php index 569a8b1ee..abb258d6f 100644 --- a/src/Profile/Shopware6/Media/HttpMediaDownloadService.php +++ b/src/Profile/Shopware6/Media/HttpMediaDownloadService.php @@ -34,6 +34,8 @@ protected function getMediaEntity(): string protected function getHttpClient(MigrationContextInterface $migrationContext): ?HttpClientInterface { - return new HttpSimpleClient(); + return new HttpSimpleClient( + ['connect_timeout' => $this->migrationConfig->migrationRequestTimeout], + ); } } diff --git a/src/Profile/Shopware6/Media/HttpOrderDocumentDownloadService.php b/src/Profile/Shopware6/Media/HttpOrderDocumentDownloadService.php index 6ceec2a88..6b1a128b8 100644 --- a/src/Profile/Shopware6/Media/HttpOrderDocumentDownloadService.php +++ b/src/Profile/Shopware6/Media/HttpOrderDocumentDownloadService.php @@ -16,6 +16,7 @@ use SwagMigrationAssistant\Migration\Logging\LoggingServiceInterface; use SwagMigrationAssistant\Migration\Media\Processor\HttpDownloadServiceBase; use SwagMigrationAssistant\Migration\Media\SwagMigrationMediaFileCollection; +use SwagMigrationAssistant\Migration\MigrationConfiguration; use SwagMigrationAssistant\Migration\MigrationContextInterface; use SwagMigrationAssistant\Profile\Shopware\Gateway\Api\ShopwareApiGateway; use SwagMigrationAssistant\Profile\Shopware6\DataSelection\DataSet\DocumentDataSet; @@ -33,6 +34,7 @@ public function __construct( EntityRepository $mediaFileRepo, FileSaver $fileSaver, LoggingServiceInterface $loggingService, + MigrationConfiguration $migrationConfig, private readonly ConnectionFactoryInterface $connectionFactory, ) { parent::__construct( @@ -40,6 +42,7 @@ public function __construct( $mediaFileRepo, $fileSaver, $loggingService, + $migrationConfig, ); } diff --git a/src/Profile/Shopware6/Media/HttpOrderDocumentGenerationService.php b/src/Profile/Shopware6/Media/HttpOrderDocumentGenerationService.php index a946ab944..9bd64a1be 100644 --- a/src/Profile/Shopware6/Media/HttpOrderDocumentGenerationService.php +++ b/src/Profile/Shopware6/Media/HttpOrderDocumentGenerationService.php @@ -30,7 +30,7 @@ use SwagMigrationAssistant\Migration\Media\MediaProcessWorkloadStruct; use SwagMigrationAssistant\Migration\Media\Processor\BaseMediaService; use SwagMigrationAssistant\Migration\Media\SwagMigrationMediaFileCollection; -use SwagMigrationAssistant\Migration\MessageQueue\Handler\Processor\MediaProcessingProcessor; +use SwagMigrationAssistant\Migration\MigrationConfiguration; use SwagMigrationAssistant\Migration\MigrationContextInterface; use SwagMigrationAssistant\Profile\Shopware\Gateway\Api\ShopwareApiGateway; use SwagMigrationAssistant\Profile\Shopware6\Gateway\Connection\ConnectionFactoryInterface; @@ -53,6 +53,7 @@ public function __construct( private readonly MediaService $mediaService, private readonly ConnectionFactoryInterface $connectionFactory, Connection $dbalConnection, + private readonly MigrationConfiguration $migrationConfig, ) { parent::__construct($dbalConnection, $migrationMediaFileRepo); } @@ -282,7 +283,7 @@ private function handleFailedRequest( $mappedWorkload->setAdditionalData($additionalData); $mappedWorkload->setErrorCount($mappedWorkload->getErrorCount() + 1); - if ($mappedWorkload->getErrorCount() > MediaProcessingProcessor::MEDIA_ERROR_THRESHOLD) { + if ($mappedWorkload->getErrorCount() > $this->migrationConfig->migrationDefaultExceptionThreshold) { $failureUuids[] = $uuid; $mappedWorkload->setState(MediaProcessWorkloadStruct::ERROR_STATE); diff --git a/src/Profile/Shopware6/Media/HttpProductDownloadService.php b/src/Profile/Shopware6/Media/HttpProductDownloadService.php index 5c1c5be32..6d3326f5e 100644 --- a/src/Profile/Shopware6/Media/HttpProductDownloadService.php +++ b/src/Profile/Shopware6/Media/HttpProductDownloadService.php @@ -16,6 +16,7 @@ use SwagMigrationAssistant\Migration\Logging\LoggingServiceInterface; use SwagMigrationAssistant\Migration\Media\Processor\HttpDownloadServiceBase; use SwagMigrationAssistant\Migration\Media\SwagMigrationMediaFileCollection; +use SwagMigrationAssistant\Migration\MigrationConfiguration; use SwagMigrationAssistant\Migration\MigrationContextInterface; use SwagMigrationAssistant\Profile\Shopware\DataSelection\DataSet\ProductDownloadDataSet; use SwagMigrationAssistant\Profile\Shopware\Gateway\Api\ShopwareApiGateway; @@ -33,6 +34,7 @@ public function __construct( EntityRepository $mediaFileRepo, FileSaver $fileSaver, LoggingServiceInterface $loggingService, + MigrationConfiguration $migrationConfig, private readonly ConnectionFactoryInterface $connectionFactory, ) { parent::__construct( @@ -40,6 +42,7 @@ public function __construct( $mediaFileRepo, $fileSaver, $loggingService, + $migrationConfig, ); } diff --git a/tests/Migration/Controller/StatusControllerTest.php b/tests/Migration/Controller/StatusControllerTest.php index 05d6d5ffa..bf94b36cf 100644 --- a/tests/Migration/Controller/StatusControllerTest.php +++ b/tests/Migration/Controller/StatusControllerTest.php @@ -34,6 +34,7 @@ use SwagMigrationAssistant\Migration\History\LogGroupingService; use SwagMigrationAssistant\Migration\Logging\LoggingService; use SwagMigrationAssistant\Migration\Mapping\MappingService; +use SwagMigrationAssistant\Migration\MigrationConfiguration; use SwagMigrationAssistant\Migration\MigrationContext; use SwagMigrationAssistant\Migration\MigrationContextFactory; use SwagMigrationAssistant\Migration\MigrationContextInterface; @@ -936,7 +937,7 @@ private function createStatusController(MigrationDataFetcherInterface $dataFetch static::getContainer()->get(ThemeService::class), $mappingService, static::getContainer()->get(Connection::class), - new LoggingService($loggingRepo, new NullLogger()), + new LoggingService($loggingRepo, new NullLogger(), new MigrationConfiguration()), static::getContainer()->get(TrackingEventClient::class), static::getContainer()->get('messenger.default_bus'), $migrationContextFactory, diff --git a/tests/Migration/Logging/LoggingServiceTest.php b/tests/Migration/Logging/LoggingServiceTest.php index cfe4df01e..c63ad6d58 100644 --- a/tests/Migration/Logging/LoggingServiceTest.php +++ b/tests/Migration/Logging/LoggingServiceTest.php @@ -21,6 +21,7 @@ use SwagMigrationAssistant\Migration\Logging\LoggingService; use SwagMigrationAssistant\Migration\Logging\SwagMigrationLoggingCollection; use SwagMigrationAssistant\Migration\Logging\SwagMigrationLoggingEntity; +use SwagMigrationAssistant\Migration\MigrationConfiguration; use SwagMigrationAssistant\Migration\Run\MigrationStep; #[Package('fundamentals@after-sales')] @@ -39,11 +40,14 @@ class LoggingServiceTest extends TestCase private string $runUuid; + private MigrationConfiguration $migrationConfiguration; + protected function setUp(): void { $this->context = Context::createDefaultContext(); $this->loggingRepo = static::getContainer()->get('swag_migration_logging.repository'); - $this->loggingService = new LoggingService($this->loggingRepo, new NullLogger()); + $this->migrationConfiguration = new MigrationConfiguration(); + $this->loggingService = new LoggingService($this->loggingRepo, new NullLogger(), $this->migrationConfiguration); $runRepo = static::getContainer()->get('swag_migration_run.repository'); $this->runUuid = Uuid::randomHex(); @@ -135,7 +139,7 @@ public function testDeconstructLoggingServiceFlushesBuffer(): void Uuid::randomHex(), ))->build(ConvertAssociationMissingLog::class); - $loggingService = new LoggingService($this->loggingRepo, new NullLogger()); + $loggingService = new LoggingService($this->loggingRepo, new NullLogger(), new MigrationConfiguration()); $loggingService->log($log); unset($loggingService); @@ -161,7 +165,7 @@ public function testResetFlushesBuffer(): void public function testBufferOverflowFlushesBuffer(): void { - for ($i = 0; $i < LoggingService::BUFFER_SIZE + 10; ++$i) { + for ($i = 0; $i < $this->migrationConfiguration->migrationLogBufferSize + 10; ++$i) { $log = (new MigrationLogBuilder( $this->runUuid, 'Profile name', @@ -173,20 +177,20 @@ public function testBufferOverflowFlushesBuffer(): void } $result = $this->loggingRepo->search(new Criteria(), $this->context); - static::assertSame(LoggingService::BUFFER_SIZE, $result->getTotal()); + static::assertSame($this->migrationConfiguration->migrationLogBufferSize, $result->getTotal()); $this->loggingService->flush(); $this->clearCacheData(); $result = $this->loggingRepo->search(new Criteria(), $this->context); - static::assertSame(LoggingService::BUFFER_SIZE + 10, $result->getTotal()); + static::assertSame($this->migrationConfiguration->migrationLogBufferSize + 10, $result->getTotal()); } public function testLimitExceptionTrace(): void { $trace = []; - for ($i = 0; $i < LoggingService::TRACE_ITEM_LIMIT + 5; ++$i) { + for ($i = 0; $i < $this->migrationConfiguration->migrationLogExceptionTraceItemLimit + 5; ++$i) { $trace[] = [ 'file' => __FILE__, 'type' => '->', @@ -215,6 +219,6 @@ public function testLimitExceptionTrace(): void $resultTrace = $resultLog->getExceptionTrace(); static::assertIsArray($resultTrace); - static::assertCount(LoggingService::TRACE_ITEM_LIMIT, $resultTrace); + static::assertCount($this->migrationConfiguration->migrationLogExceptionTraceItemLimit, $resultTrace); } } diff --git a/tests/Migration/Media/Process/DummyHttpDownloadService.php b/tests/Migration/Media/Process/DummyHttpDownloadService.php index 857d0bce5..71ec717d4 100644 --- a/tests/Migration/Media/Process/DummyHttpDownloadService.php +++ b/tests/Migration/Media/Process/DummyHttpDownloadService.php @@ -15,6 +15,7 @@ use SwagMigrationAssistant\Migration\Gateway\HttpClientInterface; use SwagMigrationAssistant\Migration\Logging\LoggingServiceInterface; use SwagMigrationAssistant\Migration\Media\Processor\HttpDownloadServiceBase; +use SwagMigrationAssistant\Migration\MigrationConfiguration; use SwagMigrationAssistant\Migration\MigrationContextInterface; #[Package('fundamentals@after-sales')] @@ -26,12 +27,14 @@ public function __construct( FileSaver $fileSaver, LoggingServiceInterface $loggingService, private readonly HttpClientInterface $httpClient, + MigrationConfiguration $migrationConfig, ) { parent::__construct( $dbalConnection, $mediaFileRepo, $fileSaver, $loggingService, + $migrationConfig, ); } diff --git a/tests/Migration/Media/Process/HttpDownloadServiceBaseTest.php b/tests/Migration/Media/Process/HttpDownloadServiceBaseTest.php index 5b3c91a7d..2c2f86d53 100644 --- a/tests/Migration/Media/Process/HttpDownloadServiceBaseTest.php +++ b/tests/Migration/Media/Process/HttpDownloadServiceBaseTest.php @@ -29,6 +29,7 @@ use SwagMigrationAssistant\Migration\Media\MediaProcessWorkloadStruct; use SwagMigrationAssistant\Migration\Media\SwagMigrationMediaFileCollection; use SwagMigrationAssistant\Migration\Media\SwagMigrationMediaFileDefinition; +use SwagMigrationAssistant\Migration\MigrationConfiguration; use SwagMigrationAssistant\Migration\MigrationContext; use SwagMigrationAssistant\Profile\Shopware6\Shopware6MajorProfile; use SwagMigrationAssistant\Test\Mock\Migration\Logging\DummyLoggingService; @@ -279,7 +280,8 @@ public function testProcessShouldCreateATempFile(): void $mediaFileRepo, $fileSaverMock, $this->loggingService, - $this->createHttpClientMock($mediaFiles) + $this->createHttpClientMock($mediaFiles), + new MigrationConfiguration(), ); $resultWorkload = $httpDownloadServiceBase->process($this->migrationContext, $this->context, $initialWorkload); @@ -326,7 +328,8 @@ private function createBase(array $migrationMedia, ?QueryBuilder $queryBuilder = $mediaFileRepo, $fileSaver, $this->loggingService, - $httpClient + $httpClient, + new MigrationConfiguration() ); } diff --git a/tests/Migration/MessageQueue/Handler/MigrationProcessHandlerTest.php b/tests/Migration/MessageQueue/Handler/MigrationProcessHandlerTest.php index 2353c63f4..6f377495d 100644 --- a/tests/Migration/MessageQueue/Handler/MigrationProcessHandlerTest.php +++ b/tests/Migration/MessageQueue/Handler/MigrationProcessHandlerTest.php @@ -21,6 +21,7 @@ use SwagMigrationAssistant\Migration\MessageQueue\Handler\MigrationProcessorRegistry; use SwagMigrationAssistant\Migration\MessageQueue\Handler\Processor\MigrationProcessorInterface; use SwagMigrationAssistant\Migration\MessageQueue\Message\MigrationProcessMessage; +use SwagMigrationAssistant\Migration\MigrationConfiguration; use SwagMigrationAssistant\Migration\MigrationContext; use SwagMigrationAssistant\Migration\MigrationContextFactoryInterface; use SwagMigrationAssistant\Migration\Run\MigrationProgress; @@ -40,7 +41,8 @@ protected function setUp(): void $this->migrationProcessHandler = new MigrationProcessHandler( $this->createMock(EntityRepository::class), $this->createMock(MigrationContextFactoryInterface::class), - $this->createMock(MigrationProcessorRegistry::class) + $this->createMock(MigrationProcessorRegistry::class), + new MigrationConfiguration(), ); } @@ -75,7 +77,8 @@ public function testInvokeWithoutRunProgress(): void $this->migrationProcessHandler = new MigrationProcessHandler( $repository, $this->createMock(MigrationContextFactoryInterface::class), - $this->createMock(MigrationProcessorRegistry::class) + $this->createMock(MigrationProcessorRegistry::class), + new MigrationConfiguration(), ); $message = new MigrationProcessMessage(Context::createDefaultContext(), Uuid::randomHex()); @@ -108,7 +111,8 @@ public function testInvokeWithoutMigrationContext(): void $this->migrationProcessHandler = new MigrationProcessHandler( $repository, $this->createMock(MigrationContextFactoryInterface::class), - $this->createMock(MigrationProcessorRegistry::class) + $this->createMock(MigrationProcessorRegistry::class), + new MigrationConfiguration(), ); $message = new MigrationProcessMessage(Context::createDefaultContext(), Uuid::randomHex()); @@ -154,7 +158,8 @@ public function testInvoke(): void $this->migrationProcessHandler = new MigrationProcessHandler( $repository, $migrationContextFactory, - $processorRegistry + $processorRegistry, + new MigrationConfiguration(), ); $message = new MigrationProcessMessage(Context::createDefaultContext(), Uuid::randomHex()); diff --git a/tests/Migration/MessageQueue/Handler/Processor/CleanUpProcessorTest.php b/tests/Migration/MessageQueue/Handler/Processor/CleanUpProcessorTest.php index aaeb4bb6c..7cfaa38f9 100644 --- a/tests/Migration/MessageQueue/Handler/Processor/CleanUpProcessorTest.php +++ b/tests/Migration/MessageQueue/Handler/Processor/CleanUpProcessorTest.php @@ -21,6 +21,7 @@ use SwagMigrationAssistant\Migration\Connection\SwagMigrationConnectionEntity; use SwagMigrationAssistant\Migration\MessageQueue\Handler\Processor\CleanUpProcessor; use SwagMigrationAssistant\Migration\MessageQueue\Message\MigrationProcessMessage; +use SwagMigrationAssistant\Migration\MigrationConfiguration; use SwagMigrationAssistant\Migration\MigrationContext; use SwagMigrationAssistant\Migration\Run\MigrationProgress; use SwagMigrationAssistant\Migration\Run\MigrationStep; @@ -58,7 +59,8 @@ protected function setUp(): void $this->createMock(EntityRepository::class), $this->runTransitionService, $this->dbalConnection, - $this->bus + $this->bus, + new MigrationConfiguration(), ); } diff --git a/tests/Migration/MessageQueue/Handler/Processor/MediaProcessingProcessorTest.php b/tests/Migration/MessageQueue/Handler/Processor/MediaProcessingProcessorTest.php index a5173b917..7bded29bb 100644 --- a/tests/Migration/MessageQueue/Handler/Processor/MediaProcessingProcessorTest.php +++ b/tests/Migration/MessageQueue/Handler/Processor/MediaProcessingProcessorTest.php @@ -30,6 +30,7 @@ use SwagMigrationAssistant\Migration\Media\MediaProcessWorkloadStruct; use SwagMigrationAssistant\Migration\Media\SwagMigrationMediaFileEntity; use SwagMigrationAssistant\Migration\MessageQueue\Handler\Processor\MediaProcessingProcessor; +use SwagMigrationAssistant\Migration\MigrationConfiguration; use SwagMigrationAssistant\Migration\MigrationContext; use SwagMigrationAssistant\Migration\Run\MigrationProgress; use SwagMigrationAssistant\Migration\Run\MigrationStep; @@ -118,6 +119,7 @@ protected function setUp(): void $this->dbalConnection, $this->createMock(MediaFileProcessorRegistryInterface::class), $this->createMock(DataSetRegistry::class), + new MigrationConfiguration(), ); } @@ -158,6 +160,7 @@ public function testTransitionsToNextStepIfNoMediaFiles(): void $this->createMock(Connection::class), $this->createMock(MediaFileProcessorRegistryInterface::class), $this->createMock(DataSetRegistry::class), + new MigrationConfiguration(), ); $this->processor->process( @@ -202,7 +205,8 @@ public function testHandlesDataSetNotFoundExceptionGracefully(): void $logging, $this->dbalConnection, $this->createMock(MediaFileProcessorRegistryInterface::class), - $dataSetRegistry + $dataSetRegistry, + new MigrationConfiguration(), ); $processor->process( @@ -253,7 +257,8 @@ public function testHandlesNoConnectionFoundException(): void $logging, $this->dbalConnection, $registry, - $dataSetRegistry + $dataSetRegistry, + new MigrationConfiguration(), ); $processor->process( @@ -310,7 +315,8 @@ public function testProcess(): void $this->createMock(LoggingService::class), $this->dbalConnection, $processorRegistry, - $dataSetRegistry + $dataSetRegistry, + new MigrationConfiguration(), ); $processor->process( @@ -379,7 +385,8 @@ public function testProcessRetriesUntilNoErrors(): void $this->createMock(LoggingService::class), $this->dbalConnection, $processorRegistry, - $dataSetRegistry + $dataSetRegistry, + new MigrationConfiguration(), ); $processor->process( @@ -457,7 +464,8 @@ public function testTransitionsIfAllMediaIsProcessed(): void $this->createMock(LoggingService::class), $this->dbalConnection, $processorRegistry, - $dataSetRegistry + $dataSetRegistry, + new MigrationConfiguration(), ); $processor->process( diff --git a/tests/Migration/MessageQueue/Handler/ResetChecksumHandlerTest.php b/tests/Migration/MessageQueue/Handler/ResetChecksumHandlerTest.php index 4b0a468b5..9f55efa80 100644 --- a/tests/Migration/MessageQueue/Handler/ResetChecksumHandlerTest.php +++ b/tests/Migration/MessageQueue/Handler/ResetChecksumHandlerTest.php @@ -23,6 +23,7 @@ use SwagMigrationAssistant\Migration\MessageQueue\Handler\ResetChecksumHandler; use SwagMigrationAssistant\Migration\MessageQueue\Message\MigrationProcessMessage; use SwagMigrationAssistant\Migration\MessageQueue\Message\ResetChecksumMessage; +use SwagMigrationAssistant\Migration\MigrationConfiguration; use SwagMigrationAssistant\Migration\Run\MigrationStep; use SwagMigrationAssistant\Migration\Run\RunTransitionServiceInterface; use SwagMigrationAssistant\Migration\Run\SwagMigrationRunCollection; @@ -48,18 +49,22 @@ class ResetChecksumHandlerTest extends TestCase private ResetChecksumHandler $handler; + private MigrationConfiguration $migrationConfiguration; + protected function setUp(): void { $this->connection = $this->createMock(Connection::class); $this->messageBus = $this->createMock(MessageBusInterface::class); $this->migrationRunRepo = $this->createMock(EntityRepository::class); $this->runTransitionService = $this->createMock(RunTransitionServiceInterface::class); + $this->migrationConfiguration = new MigrationConfiguration(); $this->handler = new ResetChecksumHandler( $this->connection, $this->messageBus, $this->migrationRunRepo, - $this->runTransitionService + $this->runTransitionService, + $this->migrationConfiguration, ); } @@ -159,7 +164,7 @@ public function testInvokeWithFullBatchDispatchesContinuation(): void ); $this->mockTotalCount(500); - $this->mockResetChecksumsOnly(ResetChecksumHandler::BATCH_SIZE); + $this->mockResetChecksumsOnly($this->migrationConfiguration->migrationDefaultBatchSize); $this->mockRunSearch($runId); $this->migrationRunRepo @@ -169,13 +174,15 @@ public function testInvokeWithFullBatchDispatchesContinuation(): void return $data[0]['id'] === $runId && isset($data[0]['progress']); })); + $batchSize = $this->migrationConfiguration->migrationDefaultBatchSize; + $this->messageBus ->expects($this->once()) ->method('dispatch') - ->with(static::callback(static function ($dispatchedMessage) use ($connectionId) { + ->with(static::callback(static function ($dispatchedMessage) use ($connectionId, $batchSize) { return $dispatchedMessage instanceof ResetChecksumMessage && $dispatchedMessage->getConnectionId() === $connectionId - && $dispatchedMessage->getProcessedMappings() === ResetChecksumHandler::BATCH_SIZE + && $dispatchedMessage->getProcessedMappings() === $batchSize && $dispatchedMessage->getTotalMappings() === 500; })) ->willReturnCallback(static fn ($msg) => new Envelope($msg)); @@ -193,8 +200,8 @@ public function testInvokeWithFullBatchResettingAllDispatchesContinuation(): voi $context, ); - $this->mockTotalCount(ResetChecksumHandler::BATCH_SIZE); - $this->mockResetChecksumsOnly(ResetChecksumHandler::BATCH_SIZE); + $this->mockTotalCount($this->migrationConfiguration->migrationDefaultBatchSize); + $this->mockResetChecksumsOnly($this->migrationConfiguration->migrationDefaultBatchSize); $this->messageBus ->expects($this->once()) @@ -266,7 +273,7 @@ public function testInvokePartOfAbortWithContinuation(): void ); $this->mockTotalCount(500); - $this->mockResetChecksumsOnly(ResetChecksumHandler::BATCH_SIZE); + $this->mockResetChecksumsOnly($this->migrationConfiguration->migrationDefaultBatchSize); $this->mockRunSearch($runId); $this->migrationRunRepo diff --git a/tests/Migration/MessageQueue/Handler/TruncateMigrationHandlerTest.php b/tests/Migration/MessageQueue/Handler/TruncateMigrationHandlerTest.php index d983c9787..97c598328 100644 --- a/tests/Migration/MessageQueue/Handler/TruncateMigrationHandlerTest.php +++ b/tests/Migration/MessageQueue/Handler/TruncateMigrationHandlerTest.php @@ -20,6 +20,7 @@ use SwagMigrationAssistant\Migration\Media\SwagMigrationMediaFileDefinition; use SwagMigrationAssistant\Migration\MessageQueue\Handler\TruncateMigrationHandler; use SwagMigrationAssistant\Migration\MessageQueue\Message\TruncateMigrationMessage; +use SwagMigrationAssistant\Migration\MigrationConfiguration; use SwagMigrationAssistant\Migration\Run\SwagMigrationRunDefinition; use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\MessageBusInterface; @@ -41,7 +42,8 @@ protected function setUp(): void $this->handler = new TruncateMigrationHandler( $this->connection, - $this->messageBus + $this->messageBus, + new MigrationConfiguration(), ); } @@ -243,7 +245,11 @@ public function testInvokeProcessesAllTablesInCorrectOrder(): void $connection = $this->createMock(Connection::class); $messageBus = $this->createMock(MessageBusInterface::class); - $handler = new TruncateMigrationHandler($connection, $messageBus); + $handler = new TruncateMigrationHandler( + $connection, + $messageBus, + new MigrationConfiguration() + ); if ($index < \count($expectedTables) - 1) { $connection diff --git a/tests/Migration/Services/MigrationDataWriterTest.php b/tests/Migration/Services/MigrationDataWriterTest.php index db11cc5d5..79dbdc921 100644 --- a/tests/Migration/Services/MigrationDataWriterTest.php +++ b/tests/Migration/Services/MigrationDataWriterTest.php @@ -64,6 +64,7 @@ use SwagMigrationAssistant\Migration\Mapping\SwagMigrationMappingDefinition; use SwagMigrationAssistant\Migration\Media\MediaFileService; use SwagMigrationAssistant\Migration\Media\SwagMigrationMediaFileCollection; +use SwagMigrationAssistant\Migration\MigrationConfiguration; use SwagMigrationAssistant\Migration\MigrationContext; use SwagMigrationAssistant\Migration\MigrationContextFactory; use SwagMigrationAssistant\Migration\Run\MigrationStep; @@ -309,7 +310,7 @@ public function initServices(): void new DummyThemeService($this->themeSalesChannelRepo), $this->mappingService, $this->dbConnection, - new LoggingService($this->loggingRepo, new NullLogger()), + new LoggingService($this->loggingRepo, new NullLogger(), new MigrationConfiguration()), static::getContainer()->get(TrackingEventClient::class), static::getContainer()->get('messenger.default_bus'), $migrationContextFactoryMock, diff --git a/tests/Migration/Subscriber/MessageQueueSubscriberTest.php b/tests/Migration/Subscriber/MessageQueueSubscriberTest.php index 843d4fb12..e31ee5f4f 100644 --- a/tests/Migration/Subscriber/MessageQueueSubscriberTest.php +++ b/tests/Migration/Subscriber/MessageQueueSubscriberTest.php @@ -18,6 +18,7 @@ use Shopware\Core\Test\Stub\DataAbstractionLayer\StaticEntityRepository; use Shopware\Core\Test\Stub\MessageBus\CollectingMessageBus; use SwagMigrationAssistant\Migration\MessageQueue\Message\MigrationProcessMessage; +use SwagMigrationAssistant\Migration\MigrationConfiguration; use SwagMigrationAssistant\Migration\Run\MigrationProgress; use SwagMigrationAssistant\Migration\Run\MigrationStep; use SwagMigrationAssistant\Migration\Run\ProgressDataSetCollection; @@ -83,6 +84,7 @@ public function testOnWorkerMessageFailed(MigrationStep $step, bool $isAborted, $repository, $dummyLoggingService, $dummyRunTransitionService, + new MigrationConfiguration(), ); $subscriber->onWorkerMessageFailed($event); @@ -208,7 +210,8 @@ public function testOnWorkerMessageFailedShouldRaiseExceptionCountAndAbortRunAnd $busMock, $repository, $dummyLoggingService, - $dummyRunTransitionService + $dummyRunTransitionService, + new MigrationConfiguration(), ); $subscriber->onWorkerMessageFailed($event); @@ -268,7 +271,8 @@ public function testOnWorkerMessageHandled(bool $noMessage, bool $noRun, bool $n $busMock, $repository, $dummyLoggingService, - $dummyRunTransitionService + $dummyRunTransitionService, + new MigrationConfiguration(), ); $subscriber->onWorkerMessageHandled($event); diff --git a/tests/MigrationServicesTrait.php b/tests/MigrationServicesTrait.php index 789ecb443..6a27cc265 100644 --- a/tests/MigrationServicesTrait.php +++ b/tests/MigrationServicesTrait.php @@ -50,6 +50,7 @@ use SwagMigrationAssistant\Migration\Mapping\Lookup\TaxLookup; use SwagMigrationAssistant\Migration\Mapping\MappingService; use SwagMigrationAssistant\Migration\Media\MediaFileServiceInterface; +use SwagMigrationAssistant\Migration\MigrationConfiguration; use SwagMigrationAssistant\Migration\Service\MigrationDataConverter; use SwagMigrationAssistant\Migration\Service\MigrationDataConverterInterface; use SwagMigrationAssistant\Migration\Service\MigrationDataFetcher; @@ -93,7 +94,8 @@ protected function getMigrationDataFetcher( ): MigrationDataFetcherInterface { $loggingService = new LoggingService( $loggingRepo, - new NullLogger() + new NullLogger(), + new MigrationConfiguration() ); $connectionFactory = new ConnectionFactory(); @@ -125,7 +127,8 @@ protected function getFailingMigrationDataFetcher( ): MigrationDataFetcherInterface { $loggingService = new LoggingService( $loggingRepo, - new NullLogger() + new NullLogger(), + new MigrationConfiguration() ); $connectionFactory = new ConnectionFactory(); @@ -164,7 +167,8 @@ protected function getMigrationDataConverter( ): MigrationDataConverterInterface { $loggingService = new LoggingService( $loggingRepo, - new NullLogger() + new NullLogger(), + new MigrationConfiguration() ); $validator = Validation::createValidator(); diff --git a/tests/Mock/Migration/Logging/DummyLoggingService.php b/tests/Mock/Migration/Logging/DummyLoggingService.php index a36177ad9..57729fd15 100644 --- a/tests/Mock/Migration/Logging/DummyLoggingService.php +++ b/tests/Mock/Migration/Logging/DummyLoggingService.php @@ -7,14 +7,27 @@ namespace SwagMigrationAssistant\Test\Mock\Migration\Logging; +use Psr\Log\NullLogger; use Shopware\Core\Framework\Log\Package; +use Shopware\Core\Test\Stub\DataAbstractionLayer\StaticEntityRepository; use SwagMigrationAssistant\Migration\Logging\LoggingService; +use SwagMigrationAssistant\Migration\Logging\SwagMigrationLoggingCollection; +use SwagMigrationAssistant\Migration\Logging\SwagMigrationLoggingDefinition; +use SwagMigrationAssistant\Migration\MigrationConfiguration; #[Package('fundamentals@after-sales')] class DummyLoggingService extends LoggingService { public function __construct() { + /** @var StaticEntityRepository $repository */ + $repository = new StaticEntityRepository([], new SwagMigrationLoggingDefinition()); + + parent::__construct( + $repository, + new NullLogger(), + new MigrationConfiguration(), + ); } public function getLoggingArray(): array diff --git a/tests/Profile/Shopware6/Gateway/Connection/ConnectionFactoryTests.php b/tests/Profile/Shopware6/Gateway/Connection/ConnectionFactoryTests.php index 56b7fbd29..b9ecf2b67 100644 --- a/tests/Profile/Shopware6/Gateway/Connection/ConnectionFactoryTests.php +++ b/tests/Profile/Shopware6/Gateway/Connection/ConnectionFactoryTests.php @@ -12,6 +12,7 @@ use Shopware\Core\Test\Stub\DataAbstractionLayer\StaticEntityRepository; use SwagMigrationAssistant\Migration\Connection\SwagMigrationConnectionCollection; use SwagMigrationAssistant\Migration\Connection\SwagMigrationConnectionEntity; +use SwagMigrationAssistant\Migration\MigrationConfiguration; use SwagMigrationAssistant\Migration\MigrationContext; use SwagMigrationAssistant\Profile\Shopware6\Gateway\Connection\AuthClient; use SwagMigrationAssistant\Profile\Shopware6\Gateway\Connection\ConnectionFactory; @@ -35,7 +36,7 @@ public function testCreateApiClient(?array $credentials, bool $expectedToBeNull) /** @var StaticEntityRepository $connectionRepository */ $connectionRepository = new StaticEntityRepository([]); - $connection = new ConnectionFactory($connectionRepository); + $connection = new ConnectionFactory($connectionRepository, new MigrationConfiguration()); $result = $connection->createApiClient($migrationContext); if ($expectedToBeNull) { diff --git a/tests/acceptance/snapshots/MigrationTest.spec.ts/linux/migration-log-sw5.txt b/tests/acceptance/snapshots/MigrationTest.spec.ts/linux/migration-log-sw5.txt index dee45b30e..43b1eecb4 100644 --- a/tests/acceptance/snapshots/MigrationTest.spec.ts/linux/migration-log-sw5.txt +++ b/tests/acceptance/snapshots/MigrationTest.spec.ts/linux/migration-log-sw5.txt @@ -727,58 +727,6 @@ Source data (JSON): "article_detail_id": null } ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_CONVERT_UNSERIALIZED_DATA_INVALID -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: product_translation -Source path: objectdata -Exception message: Unserialized data is not an array in [path] -Source data (JSON): -{ - "id": "170", - "name": null, - "dirty": null, - "locale": "en-GB", - "mediaId": null, - "objectkey": "211", - "objectdata": "a:3:{s:10:\"txtArtikel\";s:55:\"Bonus article with shopping cart value of over 250 Euro\";s:19:\"txtshortdescription\";s:122:\"Your customers can either buy this article or get it as a free bonus article from a shopping cart value of over 250 Euros.\";s:19:\"txtlangbeschreibung\";s:225:\"

Your customers can either buy this article or get it as a free bonus article from a shopping cart value of over 250 Euro.<\/p>\n

This function needs to be activated in your backend under Configuration --> Frontend<\/p>\";}", - "objecttype": "article", - "ordernumber": null, - "objectlanguage": "2" -} -Exception trace (JSON): -[trace] - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_CONVERT_UNSERIALIZED_DATA_INVALID -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: product_translation -Source path: objectdata -Exception message: Unserialized data is not an array in [path] -Source data (JSON): -{ - "id": "172", - "name": null, - "dirty": null, - "locale": "en-GB", - "mediaId": null, - "objectkey": "210", - "objectdata": "a:3:{s:10:\"txtArtikel\";s:54:\"Bonus article with shopping cart value of over 50 Euro\";s:19:\"txtshortdescription\";s:122:\"Your customers can either buy this article or get it as a free bonus article from a shopping cart value of over 250 Euros.\";s:19:\"txtlangbeschreibung\";s:224:\"

Your customers can either buy this article or get it as a free bonus article from a shopping cart value of over 50 Euro.<\/p>\n

This function needs to be activated in your backend under Configuration --> Frontend<\/p>\";}", - "objecttype": "article", - "ordernumber": null, - "objectlanguage": "2" -} -Exception trace (JSON): -[trace] - ----- Log Entry [count] ----- ID: [uuid] Level: info @@ -894,6 +842,58 @@ Source data (JSON): "objectlanguage": "2" } +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_CONVERT_UNSERIALIZED_DATA_INVALID +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: product_translation +Source path: objectdata +Exception message: Unserialized data is not an array in [path] +Source data (JSON): +{ + "id": "170", + "name": null, + "dirty": null, + "locale": "en-GB", + "mediaId": null, + "objectkey": "211", + "objectdata": "a:3:{s:10:\"txtArtikel\";s:55:\"Bonus article with shopping cart value of over 250 Euro\";s:19:\"txtshortdescription\";s:122:\"Your customers can either buy this article or get it as a free bonus article from a shopping cart value of over 250 Euros.\";s:19:\"txtlangbeschreibung\";s:225:\"

Your customers can either buy this article or get it as a free bonus article from a shopping cart value of over 250 Euro.<\/p>\n

This function needs to be activated in your backend under Configuration --> Frontend<\/p>\";}", + "objecttype": "article", + "ordernumber": null, + "objectlanguage": "2" +} +Exception trace (JSON): +[trace] + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_CONVERT_UNSERIALIZED_DATA_INVALID +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: product_translation +Source path: objectdata +Exception message: Unserialized data is not an array in [path] +Source data (JSON): +{ + "id": "172", + "name": null, + "dirty": null, + "locale": "en-GB", + "mediaId": null, + "objectkey": "210", + "objectdata": "a:3:{s:10:\"txtArtikel\";s:54:\"Bonus article with shopping cart value of over 50 Euro\";s:19:\"txtshortdescription\";s:122:\"Your customers can either buy this article or get it as a free bonus article from a shopping cart value of over 250 Euros.\";s:19:\"txtlangbeschreibung\";s:224:\"

Your customers can either buy this article or get it as a free bonus article from a shopping cart value of over 50 Euro.<\/p>\n

This function needs to be activated in your backend under Configuration --> Frontend<\/p>\";}", + "objecttype": "article", + "ordernumber": null, + "objectlanguage": "2" +} +Exception trace (JSON): +[trace] + ----- Log Entry [count] ----- ID: [uuid] Level: info @@ -973,10 +973,10 @@ Entity: seo_url Field: type Source data (JSON): { - "main": "1", - "path": "trends-news\/der-sommer-wird-bunt", - "type": "blog", - "org_path": "sViewport=blog&sAction=detail&sCategory=17&blogArticle=3" + "main": "0", + "path": "hilfe-support", + "type": "custom", + "org_path": "sViewport=custom&sCustom=2" } ----- Log Entry [count] ----- @@ -990,10 +990,10 @@ Entity: seo_url Field: type Source data (JSON): { - "main": "1", - "path": "trends-news\/sonnenschutz-so-gehoeren-sie-zur-creme-de-la-creme", - "type": "blog", - "org_path": "sViewport=blog&sAction=detail&sCategory=17&blogArticle=4" + "main": "0", + "path": "versand-und-zahlungsbedingungen", + "type": "custom", + "org_path": "sViewport=custom&sCustom=6" } ----- Log Entry [count] ----- @@ -1008,9 +1008,9 @@ Field: type Source data (JSON): { "main": "1", - "path": "trends-news\/ich-packe-meinen-koffer", + "path": "trends-news\/der-sommer-wird-bunt", "type": "blog", - "org_path": "sViewport=blog&sAction=detail&sCategory=17&blogArticle=5" + "org_path": "sViewport=blog&sAction=detail&sCategory=17&blogArticle=3" } ----- Log Entry [count] ----- @@ -1025,9 +1025,9 @@ Field: type Source data (JSON): { "main": "1", - "path": "sommerwelten\/stop-the-water-while-using-me", - "type": "campaign", - "org_path": "sViewport=campaign&sCategory=6&emotionId=5" + "path": "trends-news\/sonnenschutz-so-gehoeren-sie-zur-creme-de-la-creme", + "type": "blog", + "org_path": "sViewport=blog&sAction=detail&sCategory=17&blogArticle=4" } ----- Log Entry [count] ----- @@ -1042,9 +1042,9 @@ Field: type Source data (JSON): { "main": "1", - "path": "sommerwelten\/stop-the-water-while-using-me", - "type": "campaign", - "org_path": "sViewport=campaign&sCategory=6&emotionId=5" + "path": "trends-news\/ich-packe-meinen-koffer", + "type": "blog", + "org_path": "sViewport=blog&sAction=detail&sCategory=17&blogArticle=5" } ----- Log Entry [count] ----- @@ -1059,9 +1059,9 @@ Field: type Source data (JSON): { "main": "1", - "path": "genusswelten\/the-deli-garage", - "type": "campaign", - "org_path": "sViewport=campaign&sCategory=5&emotionId=6" + "path": "hilfe-support", + "type": "custom", + "org_path": "sViewport=custom&sCustom=2" } ----- Log Entry [count] ----- @@ -1076,9 +1076,9 @@ Field: type Source data (JSON): { "main": "1", - "path": "genusswelten\/the-deli-garage", - "type": "campaign", - "org_path": "sViewport=campaign&sCategory=5&emotionId=6" + "path": "impressum", + "type": "custom", + "org_path": "sViewport=custom&sCustom=3" } ----- Log Entry [count] ----- @@ -1092,10 +1092,10 @@ Entity: seo_url Field: type Source data (JSON): { - "main": "0", - "path": "trends-news\/der-sommer-wirenglisch", - "type": "blog", - "org_path": "sViewport=blog&sAction=detail&sCategory=42&blogArticle=6" + "main": "1", + "path": "agb", + "type": "custom", + "org_path": "sViewport=custom&sCustom=4" } ----- Log Entry [count] ----- @@ -1109,10 +1109,10 @@ Entity: seo_url Field: type Source data (JSON): { - "main": "1", - "path": "sommerwelten\/passend-fuer-ihren-sommerurlaub", - "type": "campaign", - "org_path": "sViewport=campaign&sCategory=6&emotionId=9" + "main": "0", + "path": "versand-und-zahlungsbedingungen", + "type": "custom", + "org_path": "sViewport=custom&sCustom=6" } ----- Log Entry [count] ----- @@ -1127,9 +1127,9 @@ Field: type Source data (JSON): { "main": "1", - "path": "trends-news\/the-summer-will-be-colorful", - "type": "blog", - "org_path": "sViewport=blog&sAction=detail&sCategory=42&blogArticle=6" + "path": "datenschutz", + "type": "custom", + "org_path": "sViewport=custom&sCustom=7" } ----- Log Entry [count] ----- @@ -1144,9 +1144,9 @@ Field: type Source data (JSON): { "main": "1", - "path": "trends-news\/sun-cream-be-part-of-the-creme-de-la-creme", - "type": "blog", - "org_path": "sViewport=blog&sAction=detail&sCategory=42&blogArticle=7" + "path": "widerrufsrecht", + "type": "custom", + "org_path": "sViewport=custom&sCustom=8" } ----- Log Entry [count] ----- @@ -1161,9 +1161,9 @@ Field: type Source data (JSON): { "main": "1", - "path": "trends-news\/i-pack-my-bag", - "type": "blog", - "org_path": "sViewport=blog&sAction=detail&sCategory=42&blogArticle=8" + "path": "ueber-uns", + "type": "custom", + "org_path": "sViewport=custom&sCustom=9" } ----- Log Entry [count] ----- @@ -1178,9 +1178,9 @@ Field: type Source data (JSON): { "main": "1", - "path": "sommerwelten\/passend-fuer-ihren-sommerurlaub", + "path": "sommerwelten\/stop-the-water-while-using-me", "type": "campaign", - "org_path": "sViewport=campaign&sCategory=6&emotionId=9" + "org_path": "sViewport=campaign&sCategory=6&emotionId=5" } ----- Log Entry [count] ----- @@ -1195,9 +1195,9 @@ Field: type Source data (JSON): { "main": "1", - "path": "trends-news\/", - "type": "blog", - "org_path": "sViewport=blog&sCategory=17" + "path": "sommerwelten\/stop-the-water-while-using-me", + "type": "campaign", + "org_path": "sViewport=campaign&sCategory=6&emotionId=5" } ----- Log Entry [count] ----- @@ -1212,9 +1212,9 @@ Field: type Source data (JSON): { "main": "1", - "path": "trends-news\/der-sommer-wird-bunt", - "type": "blog", - "org_path": "sViewport=blog&sAction=detail&sCategory=17&blogArticle=3" + "path": "genusswelten\/the-deli-garage", + "type": "campaign", + "org_path": "sViewport=campaign&sCategory=5&emotionId=6" } ----- Log Entry [count] ----- @@ -1229,9 +1229,9 @@ Field: type Source data (JSON): { "main": "1", - "path": "trends-news\/sonnenschutz-so-gehoeren-sie-zur-creme-de-la-creme", - "type": "blog", - "org_path": "sViewport=blog&sAction=detail&sCategory=17&blogArticle=4" + "path": "genusswelten\/the-deli-garage", + "type": "campaign", + "org_path": "sViewport=campaign&sCategory=5&emotionId=6" } ----- Log Entry [count] ----- @@ -1245,10 +1245,10 @@ Entity: seo_url Field: type Source data (JSON): { - "main": "1", - "path": "trends-news\/ich-packe-meinen-koffer", + "main": "0", + "path": "trends-news\/der-sommer-wirenglisch", "type": "blog", - "org_path": "sViewport=blog&sAction=detail&sCategory=17&blogArticle=5" + "org_path": "sViewport=blog&sAction=detail&sCategory=42&blogArticle=6" } ----- Log Entry [count] ----- @@ -1263,9 +1263,9 @@ Field: type Source data (JSON): { "main": "1", - "path": "stop-the-water-while-using-me", + "path": "sommerwelten\/passend-fuer-ihren-sommerurlaub", "type": "campaign", - "org_path": "sViewport=campaign&emotionId=5" + "org_path": "sViewport=campaign&sCategory=6&emotionId=9" } ----- Log Entry [count] ----- @@ -1280,9 +1280,9 @@ Field: type Source data (JSON): { "main": "1", - "path": "passend-fuer-ihren-sommerurlaub", - "type": "campaign", - "org_path": "sViewport=campaign&emotionId=9" + "path": "trends-news\/the-summer-will-be-colorful", + "type": "blog", + "org_path": "sViewport=blog&sAction=detail&sCategory=42&blogArticle=6" } ----- Log Entry [count] ----- @@ -1296,10 +1296,10 @@ Entity: seo_url Field: type Source data (JSON): { - "main": "0", - "path": "hilfe-support", - "type": "custom", - "org_path": "sViewport=custom&sCustom=2" + "main": "1", + "path": "trends-news\/sun-cream-be-part-of-the-creme-de-la-creme", + "type": "blog", + "org_path": "sViewport=blog&sAction=detail&sCategory=42&blogArticle=7" } ----- Log Entry [count] ----- @@ -1313,10 +1313,10 @@ Entity: seo_url Field: type Source data (JSON): { - "main": "0", - "path": "versand-und-zahlungsbedingungen", - "type": "custom", - "org_path": "sViewport=custom&sCustom=6" + "main": "1", + "path": "trends-news\/i-pack-my-bag", + "type": "blog", + "org_path": "sViewport=blog&sAction=detail&sCategory=42&blogArticle=8" } ----- Log Entry [count] ----- @@ -1331,9 +1331,9 @@ Field: type Source data (JSON): { "main": "1", - "path": "hilfe-support", - "type": "custom", - "org_path": "sViewport=custom&sCustom=2" + "path": "sommerwelten\/passend-fuer-ihren-sommerurlaub", + "type": "campaign", + "org_path": "sViewport=campaign&sCategory=6&emotionId=9" } ----- Log Entry [count] ----- @@ -1348,9 +1348,9 @@ Field: type Source data (JSON): { "main": "1", - "path": "impressum", + "path": "versand-und-zahlung", "type": "custom", - "org_path": "sViewport=custom&sCustom=3" + "org_path": "sViewport=custom&sCustom=6" } ----- Log Entry [count] ----- @@ -1365,9 +1365,9 @@ Field: type Source data (JSON): { "main": "1", - "path": "agb", + "path": "stellenangebote", "type": "custom", - "org_path": "sViewport=custom&sCustom=4" + "org_path": "sViewport=custom&sCustom=52" } ----- Log Entry [count] ----- @@ -1381,10 +1381,10 @@ Entity: seo_url Field: type Source data (JSON): { - "main": "0", - "path": "versand-und-zahlungsbedingungen", + "main": "1", + "path": "messen", "type": "custom", - "org_path": "sViewport=custom&sCustom=6" + "org_path": "sViewport=custom&sCustom=54" } ----- Log Entry [count] ----- @@ -1399,9 +1399,9 @@ Field: type Source data (JSON): { "main": "1", - "path": "datenschutz", + "path": "das-team", "type": "custom", - "org_path": "sViewport=custom&sCustom=7" + "org_path": "sViewport=custom&sCustom=55" } ----- Log Entry [count] ----- @@ -1416,9 +1416,9 @@ Field: type Source data (JSON): { "main": "1", - "path": "widerrufsrecht", + "path": "unternehmensgeschichte", "type": "custom", - "org_path": "sViewport=custom&sCustom=8" + "org_path": "sViewport=custom&sCustom=56" } ----- Log Entry [count] ----- @@ -1433,9 +1433,9 @@ Field: type Source data (JSON): { "main": "1", - "path": "ueber-uns", - "type": "custom", - "org_path": "sViewport=custom&sCustom=9" + "path": "trends-news\/", + "type": "blog", + "org_path": "sViewport=blog&sCategory=17" } ----- Log Entry [count] ----- @@ -1450,9 +1450,9 @@ Field: type Source data (JSON): { "main": "1", - "path": "versand-und-zahlung", - "type": "custom", - "org_path": "sViewport=custom&sCustom=6" + "path": "trends-news\/der-sommer-wird-bunt", + "type": "blog", + "org_path": "sViewport=blog&sAction=detail&sCategory=17&blogArticle=3" } ----- Log Entry [count] ----- @@ -1467,9 +1467,9 @@ Field: type Source data (JSON): { "main": "1", - "path": "stellenangebote", - "type": "custom", - "org_path": "sViewport=custom&sCustom=52" + "path": "trends-news\/sonnenschutz-so-gehoeren-sie-zur-creme-de-la-creme", + "type": "blog", + "org_path": "sViewport=blog&sAction=detail&sCategory=17&blogArticle=4" } ----- Log Entry [count] ----- @@ -1484,9 +1484,9 @@ Field: type Source data (JSON): { "main": "1", - "path": "messen", - "type": "custom", - "org_path": "sViewport=custom&sCustom=54" + "path": "trends-news\/ich-packe-meinen-koffer", + "type": "blog", + "org_path": "sViewport=blog&sAction=detail&sCategory=17&blogArticle=5" } ----- Log Entry [count] ----- @@ -1501,9 +1501,9 @@ Field: type Source data (JSON): { "main": "1", - "path": "das-team", - "type": "custom", - "org_path": "sViewport=custom&sCustom=55" + "path": "stop-the-water-while-using-me", + "type": "campaign", + "org_path": "sViewport=campaign&emotionId=5" } ----- Log Entry [count] ----- @@ -1518,9 +1518,9 @@ Field: type Source data (JSON): { "main": "1", - "path": "unternehmensgeschichte", - "type": "custom", - "org_path": "sViewport=custom&sCustom=56" + "path": "passend-fuer-ihren-sommerurlaub", + "type": "campaign", + "org_path": "sViewport=campaign&emotionId=9" } ----- Log Entry [count] ----- @@ -3068,12 +3068,12 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/Lagerkorn-5l-Ballon502e4d0dcef95.jpg", + "uri": "media\/image\/Lagerkorn-5l-Ballon.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "Lagerkorn-5l-Ballon502e4d0dcef95", + "file_name": "Lagerkorn-5l-Ballon", "file_size": "18921", "processed": "0", "created_at": "[timestamp]", @@ -3081,7 +3081,7 @@ Source data (JSON): "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/Lagerkorn-5l-Ballon502e4d0dcef95.jpg" + "source_path": "media\/image\/Lagerkorn-5l-Ballon.jpg" } ----- Log Entry [count] ----- @@ -3411,10 +3411,10 @@ Source data (JSON): "media_id": "[uuid]", "file_name": "Lagerkorn-5l-Ballon502e4d0dcef95", "file_size": "18921", - "processed": "1", + "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", - "process_failure": "1" + "process_failure": "0" }, "media_id": "[uuid]", "source_path": "media\/image\/Lagerkorn-5l-Ballon502e4d0dcef95.jpg" @@ -3432,20 +3432,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/deli_logo.jpg", + "uri": "media\/image\/Lagerkorn-50klein.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "deli_logo", - "file_size": "19418", + "file_name": "Lagerkorn-5,0klein", + "file_size": "18921", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/deli_logo.jpg" + "source_path": "media\/image\/Lagerkorn-50klein.jpg" } ----- Log Entry [count] ----- @@ -3460,20 +3460,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/Lagerkorn-5l-Ballon.jpg", + "uri": "media\/image\/deli_logo.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "Lagerkorn-5l-Ballon", - "file_size": "18921", + "file_name": "deli_logo", + "file_size": "19418", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/Lagerkorn-5l-Ballon.jpg" + "source_path": "media\/image\/deli_logo.jpg" } ----- Log Entry [count] ----- @@ -3964,20 +3964,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/e_3.jpg", + "uri": "media\/image\/LatteMacchiato.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "e_3", - "file_size": "23080", + "file_name": "LatteMacchiato", + "file_size": "23944", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/e_3.jpg" + "source_path": "media\/image\/LatteMacchiato.jpg" } ----- Log Entry [count] ----- @@ -3992,20 +3992,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/schokoleim.jpg", + "uri": "media\/image\/e_3.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "schokoleim", - "file_size": "23204", + "file_name": "e_3", + "file_size": "23080", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/schokoleim.jpg" + "source_path": "media\/image\/e_3.jpg" } ----- Log Entry [count] ----- @@ -4020,20 +4020,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/LatteMacchiato.jpg", + "uri": "media\/image\/schokoleim.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "LatteMacchiato", - "file_size": "23944", + "file_name": "schokoleim", + "file_size": "23204", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/LatteMacchiato.jpg" + "source_path": "media\/image\/schokoleim.jpg" } ----- Log Entry [count] ----- @@ -5308,20 +5308,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/Kwon-Club-Line-Judo--Anzug-ganz.jpg", + "uri": "media\/image\/Kwon-Fussschuetzer-grip-leather-schwarz503e21d45c10c.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "Kwon-Club-Line-Judo--Anzug-ganz", - "file_size": "34161", + "file_name": "Kwon-Fussschuetzer-grip-leather-schwarz503e21d45c10c", + "file_size": "33794", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/Kwon-Club-Line-Judo--Anzug-ganz.jpg" + "source_path": "media\/image\/Kwon-Fussschuetzer-grip-leather-schwarz503e21d45c10c.jpg" } ----- Log Entry [count] ----- @@ -5336,20 +5336,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/Kwon-Fussschuetzer-grip-leather-schwarz503e21d45c10c.jpg", + "uri": "media\/image\/Kwon-Club-Line-Judo--Anzug-ganz.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "Kwon-Fussschuetzer-grip-leather-schwarz503e21d45c10c", - "file_size": "33794", + "file_name": "Kwon-Club-Line-Judo--Anzug-ganz", + "file_size": "34161", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/Kwon-Fussschuetzer-grip-leather-schwarz503e21d45c10c.jpg" + "source_path": "media\/image\/Kwon-Club-Line-Judo--Anzug-ganz.jpg" } ----- Log Entry [count] ----- @@ -5364,20 +5364,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/honig.jpg", + "uri": "media\/image\/PU-ERH-Tee-Geschenkset-Tasse.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "honig", - "file_size": "33303", + "file_name": "PU-ERH-Tee-Geschenkset-Tasse", + "file_size": "34178", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/honig.jpg" + "source_path": "media\/image\/PU-ERH-Tee-Geschenkset-Tasse.jpg" } ----- Log Entry [count] ----- @@ -5392,20 +5392,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/olivenoel.jpg", + "uri": "media\/image\/honig.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "olivenoel", - "file_size": "33204", + "file_name": "honig", + "file_size": "33303", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/olivenoel.jpg" + "source_path": "media\/image\/honig.jpg" } ----- Log Entry [count] ----- @@ -5420,20 +5420,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/PU-ERH-Tee-Geschenkset-Tasse.jpg", + "uri": "media\/image\/olivenoel.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "PU-ERH-Tee-Geschenkset-Tasse", - "file_size": "34178", + "file_name": "olivenoel", + "file_size": "33204", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/PU-ERH-Tee-Geschenkset-Tasse.jpg" + "source_path": "media\/image\/olivenoel.jpg" } ----- Log Entry [count] ----- @@ -5588,20 +5588,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/Steel-Dartpfeil.jpg", + "uri": "media\/image\/Schneebesen503f475f63a73.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "Steel-Dartpfeil", - "file_size": "34912", + "file_name": "Schneebesen503f475f63a73", + "file_size": "35021", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/Steel-Dartpfeil.jpg" + "source_path": "media\/image\/Schneebesen503f475f63a73.jpg" } ----- Log Entry [count] ----- @@ -5616,20 +5616,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/Schneebesen503f475f63a73.jpg", + "uri": "media\/image\/Steel-Dartpfeil.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "Schneebesen503f475f63a73", - "file_size": "35021", + "file_name": "Steel-Dartpfeil", + "file_size": "34912", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/Schneebesen503f475f63a73.jpg" + "source_path": "media\/image\/Steel-Dartpfeil.jpg" } ----- Log Entry [count] ----- @@ -7016,20 +7016,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/wohnwelten_top_banner_small_02.jpg", + "uri": "media\/image\/Oelwechsel-Zitrone.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "wohnwelten_top_banner_small_02", - "file_size": "41168", + "file_name": "Oelwechsel-Zitrone", + "file_size": "41302", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/wohnwelten_top_banner_small_02.jpg" + "source_path": "media\/image\/Oelwechsel-Zitrone.jpg" } ----- Log Entry [count] ----- @@ -7044,20 +7044,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/Oelwechsel-Zitrone.jpg", + "uri": "media\/image\/wohnwelten_top_banner_small_02.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "Oelwechsel-Zitrone", - "file_size": "41302", + "file_name": "wohnwelten_top_banner_small_02", + "file_size": "41168", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/Oelwechsel-Zitrone.jpg" + "source_path": "media\/image\/wohnwelten_top_banner_small_02.jpg" } ----- Log Entry [count] ----- @@ -7828,20 +7828,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/Kwon-Tasche-Coach-schwarz503e242e4ab03.jpg", + "uri": "media\/image\/Kwon-Chosun-Plus-Schuhe-weiss503e21265ab7b.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "Kwon-Tasche-Coach-schwarz503e242e4ab03", - "file_size": "45616", + "file_name": "Kwon-Chosun-Plus-Schuhe-weiss503e21265ab7b", + "file_size": "45412", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/Kwon-Tasche-Coach-schwarz503e242e4ab03.jpg" + "source_path": "media\/image\/Kwon-Chosun-Plus-Schuhe-weiss503e21265ab7b.jpg" } ----- Log Entry [count] ----- @@ -7856,20 +7856,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/Kwon-Chosun-Plus-Schuhe-weiss503e21265ab7b.jpg", + "uri": "media\/image\/Kwon-Tasche-Coach-schwarz503e242e4ab03.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "Kwon-Chosun-Plus-Schuhe-weiss503e21265ab7b", - "file_size": "45412", + "file_name": "Kwon-Tasche-Coach-schwarz503e242e4ab03", + "file_size": "45616", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/Kwon-Chosun-Plus-Schuhe-weiss503e21265ab7b.jpg" + "source_path": "media\/image\/Kwon-Tasche-Coach-schwarz503e242e4ab03.jpg" } ----- Log Entry [count] ----- @@ -8136,20 +8136,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/wohnwelten_top_banner_small_01.jpg", + "uri": "media\/image\/PU-ERH-Tee-Geschenkset-Karte.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "wohnwelten_top_banner_small_01", - "file_size": "47236", + "file_name": "PU-ERH-Tee-Geschenkset-Karte", + "file_size": "46902", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/wohnwelten_top_banner_small_01.jpg" + "source_path": "media\/image\/PU-ERH-Tee-Geschenkset-Karte.jpg" } ----- Log Entry [count] ----- @@ -8164,20 +8164,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/PU-ERH-Tee-Geschenkset-Karte.jpg", + "uri": "media\/image\/wohnwelten_top_banner_small_01.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "PU-ERH-Tee-Geschenkset-Karte", - "file_size": "46902", + "file_name": "wohnwelten_top_banner_small_01", + "file_size": "47236", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/PU-ERH-Tee-Geschenkset-Karte.jpg" + "source_path": "media\/image\/wohnwelten_top_banner_small_01.jpg" } ----- Log Entry [count] ----- @@ -9760,20 +9760,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/Herrenhandschuhe-aus-Peccary-zweifarbig_720x600503f77b696fa2.jpg", + "uri": "media\/image\/Heiku-Kicker-Champ-Elite-Hauptbild.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "Herrenhandschuhe-aus-Peccary-zweifarbig_720x600503f77b696fa2", - "file_size": "54580", + "file_name": "Heiku-Kicker-Champ-Elite-Hauptbild", + "file_size": "54037", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/Herrenhandschuhe-aus-Peccary-zweifarbig_720x600503f77b696fa2.jpg" + "source_path": "media\/image\/Heiku-Kicker-Champ-Elite-Hauptbild.jpg" } ----- Log Entry [count] ----- @@ -9788,20 +9788,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/Heiku-Kicker-Champ-Elite-Hauptbild503492770db11.jpg", + "uri": "media\/image\/Herrenhandschuhe-aus-Peccary-zweifarbig_720x600503f77b696fa2.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "Heiku-Kicker-Champ-Elite-Hauptbild503492770db11", - "file_size": "54037", + "file_name": "Herrenhandschuhe-aus-Peccary-zweifarbig_720x600503f77b696fa2", + "file_size": "54580", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/Heiku-Kicker-Champ-Elite-Hauptbild503492770db11.jpg" + "source_path": "media\/image\/Herrenhandschuhe-aus-Peccary-zweifarbig_720x600503f77b696fa2.jpg" } ----- Log Entry [count] ----- @@ -9816,12 +9816,12 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/Heiku-Kicker-Champ-Elite-Hauptbild.jpg", + "uri": "media\/image\/Heiku-Kicker-Champ-Elite-Hauptbild503492770db11.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "Heiku-Kicker-Champ-Elite-Hauptbild", + "file_name": "Heiku-Kicker-Champ-Elite-Hauptbild503492770db11", "file_size": "54037", "processed": "0", "created_at": "[timestamp]", @@ -9829,7 +9829,7 @@ Source data (JSON): "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/Heiku-Kicker-Champ-Elite-Hauptbild.jpg" + "source_path": "media\/image\/Heiku-Kicker-Champ-Elite-Hauptbild503492770db11.jpg" } ----- Log Entry [count] ----- @@ -10236,20 +10236,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/Oelwechsel-Sorten-Front502df8eb7b40f.jpg", + "uri": "media\/image\/Heiku-Kicker-Champ-Family-hauptbild.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "Oelwechsel-Sorten-Front502df8eb7b40f", - "file_size": "61644", + "file_name": "Heiku-Kicker-Champ-Family-hauptbild", + "file_size": "59024", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/Oelwechsel-Sorten-Front502df8eb7b40f.jpg" + "source_path": "media\/image\/Heiku-Kicker-Champ-Family-hauptbild.jpg" } ----- Log Entry [count] ----- @@ -10264,20 +10264,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/Heiku-Kicker-Champ-Family-hauptbild.jpg", + "uri": "media\/image\/Heiku-Kicker-Champ-Individuell-Hauptbild.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "Heiku-Kicker-Champ-Family-hauptbild", - "file_size": "59024", + "file_name": "Heiku-Kicker-Champ-Individuell-Hauptbild", + "file_size": "58787", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/Heiku-Kicker-Champ-Family-hauptbild.jpg" + "source_path": "media\/image\/Heiku-Kicker-Champ-Individuell-Hauptbild.jpg" } ----- Log Entry [count] ----- @@ -10292,20 +10292,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/Heiku-Kicker-Champ-Individuell-Hauptbild.jpg", + "uri": "media\/image\/Oelwechsel-Sorten-Front.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "Heiku-Kicker-Champ-Individuell-Hauptbild", - "file_size": "58787", + "file_name": "Oelwechsel-Sorten-Front", + "file_size": "61644", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/Heiku-Kicker-Champ-Individuell-Hauptbild.jpg" + "source_path": "media\/image\/Oelwechsel-Sorten-Front.jpg" } ----- Log Entry [count] ----- @@ -10544,20 +10544,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/Schluesselkasten-weiss-offen.jpg", + "uri": "media\/image\/Oelwechsel-Sorten-Front502df8eb7b40f.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "Schluesselkasten-weiss-offen", - "file_size": "64631", + "file_name": "Oelwechsel-Sorten-Front502df8eb7b40f", + "file_size": "61644", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/Schluesselkasten-weiss-offen.jpg" + "source_path": "media\/image\/Oelwechsel-Sorten-Front502df8eb7b40f.jpg" } ----- Log Entry [count] ----- @@ -10572,20 +10572,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/Schluesselkasten-weiss-zu.jpg", + "uri": "media\/image\/Schluesselkasten-weiss-offen.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "Schluesselkasten-weiss-zu", - "file_size": "62514", + "file_name": "Schluesselkasten-weiss-offen", + "file_size": "64631", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/Schluesselkasten-weiss-zu.jpg" + "source_path": "media\/image\/Schluesselkasten-weiss-offen.jpg" } ----- Log Entry [count] ----- @@ -10600,20 +10600,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/Eisfoermchen-gruen-detail.jpg", + "uri": "media\/image\/Schluesselkasten-weiss-zu.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "Eisfoermchen-gruen-detail", - "file_size": "62438", + "file_name": "Schluesselkasten-weiss-zu", + "file_size": "62514", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/Eisfoermchen-gruen-detail.jpg" + "source_path": "media\/image\/Schluesselkasten-weiss-zu.jpg" } ----- Log Entry [count] ----- @@ -10628,20 +10628,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/Ipad-Tasche-mit-Stiftmappe-Mappe-Detail.jpg", + "uri": "media\/image\/Eisfoermchen-gruen-detail.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "Ipad-Tasche-mit-Stiftmappe-Mappe-Detail", - "file_size": "64761", + "file_name": "Eisfoermchen-gruen-detail", + "file_size": "62438", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/Ipad-Tasche-mit-Stiftmappe-Mappe-Detail.jpg" + "source_path": "media\/image\/Eisfoermchen-gruen-detail.jpg" } ----- Log Entry [count] ----- @@ -10656,20 +10656,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/Dart-Set.jpg", + "uri": "media\/image\/Ipad-Tasche-mit-Stiftmappe-Mappe-Detail.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "Dart-Set", - "file_size": "63489", + "file_name": "Ipad-Tasche-mit-Stiftmappe-Mappe-Detail", + "file_size": "64761", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/Dart-Set.jpg" + "source_path": "media\/image\/Ipad-Tasche-mit-Stiftmappe-Mappe-Detail.jpg" } ----- Log Entry [count] ----- @@ -10684,20 +10684,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/Ranunkel-Deko-Topf.jpg", + "uri": "media\/image\/Dart-Set.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "Ranunkel-Deko-Topf", - "file_size": "65187", + "file_name": "Dart-Set", + "file_size": "63489", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/Ranunkel-Deko-Topf.jpg" + "source_path": "media\/image\/Dart-Set.jpg" } ----- Log Entry [count] ----- @@ -10712,20 +10712,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/Oelwechsel-Sorten-Front.jpg", + "uri": "media\/image\/Ranunkel-Deko-Topf.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "Oelwechsel-Sorten-Front", - "file_size": "61644", + "file_name": "Ranunkel-Deko-Topf", + "file_size": "65187", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/Oelwechsel-Sorten-Front.jpg" + "source_path": "media\/image\/Ranunkel-Deko-Topf.jpg" } ----- Log Entry [count] ----- @@ -12868,20 +12868,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/teaser504063fd12513.jpg", + "uri": "media\/image\/Traubenbatterie-Rotbart-CloseUp.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "teaser504063fd12513", - "file_size": "93889", + "file_name": "Traubenbatterie-Rotbart-CloseUp", + "file_size": "96079", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/teaser504063fd12513.jpg" + "source_path": "media\/image\/Traubenbatterie-Rotbart-CloseUp.jpg" } ----- Log Entry [count] ----- @@ -12896,12 +12896,12 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/teaser5040640f2861b.jpg", + "uri": "media\/image\/teaser504063fd12513.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "2", + "file_name": "teaser504063fd12513", "file_size": "93889", "processed": "0", "created_at": "[timestamp]", @@ -12909,7 +12909,7 @@ Source data (JSON): "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/teaser5040640f2861b.jpg" + "source_path": "media\/image\/teaser504063fd12513.jpg" } ----- Log Entry [count] ----- @@ -12924,12 +12924,12 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/Banner.jpg", + "uri": "media\/image\/teaser5040640f2861b.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "Banner", + "file_name": "2", "file_size": "93889", "processed": "0", "created_at": "[timestamp]", @@ -12937,7 +12937,7 @@ Source data (JSON): "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/Banner.jpg" + "source_path": "media\/image\/teaser5040640f2861b.jpg" } ----- Log Entry [count] ----- @@ -12952,20 +12952,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/Traubenbatterie-Rotbart-CloseUp.jpg", + "uri": "media\/image\/Banner.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "Traubenbatterie-Rotbart-CloseUp", - "file_size": "96079", + "file_name": "Banner", + "file_size": "93889", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/Traubenbatterie-Rotbart-CloseUp.jpg" + "source_path": "media\/image\/Banner.jpg" } ----- Log Entry [count] ----- @@ -15108,20 +15108,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/Servietten.jpg", + "uri": "media\/image\/Buecher-ESD503f5a25e6a12.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "Servietten", - "file_size": "150967", + "file_name": "Buecher-ESD503f5a25e6a12", + "file_size": "156505", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/Servietten.jpg" + "source_path": "media\/image\/Buecher-ESD503f5a25e6a12.jpg" } ----- Log Entry [count] ----- @@ -15136,20 +15136,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/Buecher-ESD503f5a25e6a12.jpg", + "uri": "media\/image\/Servietten.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "Buecher-ESD503f5a25e6a12", - "file_size": "156505", + "file_name": "Servietten", + "file_size": "150967", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/Buecher-ESD503f5a25e6a12.jpg" + "source_path": "media\/image\/Servietten.jpg" } ----- Log Entry [count] ----- @@ -15920,20 +15920,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/beach1.jpg", + "uri": "media\/image\/PU-ERH-Tee-Geschenkset-Cover.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "beach1", - "file_size": "208871", + "file_name": "PU-ERH-Tee-Geschenkset-Cover", + "file_size": "198293", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/beach1.jpg" + "source_path": "media\/image\/PU-ERH-Tee-Geschenkset-Cover.jpg" } ----- Log Entry [count] ----- @@ -15948,20 +15948,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/wohnwelten_top_banner.jpg", + "uri": "media\/image\/beach1.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "wohnwelten_top_banner", - "file_size": "199171", + "file_name": "beach1", + "file_size": "208871", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/wohnwelten_top_banner.jpg" + "source_path": "media\/image\/beach1.jpg" } ----- Log Entry [count] ----- @@ -15976,20 +15976,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/PU-ERH-Tee-Geschenkset-Cover.jpg", + "uri": "media\/image\/wohnwelten_top_banner.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "PU-ERH-Tee-Geschenkset-Cover", - "file_size": "198293", + "file_name": "wohnwelten_top_banner", + "file_size": "199171", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/PU-ERH-Tee-Geschenkset-Cover.jpg" + "source_path": "media\/image\/wohnwelten_top_banner.jpg" } ----- Log Entry [count] ----- @@ -17320,20 +17320,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/Blog-bunt-Woman.jpg", + "uri": "media\/image\/Emmelkamper_Holunderlikoer_700ml.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "Blog-bunt-Woman", - "file_size": "382456", + "file_name": "Emmelkamper_Holunderlikoer_700ml", + "file_size": "395538", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/Blog-bunt-Woman.jpg" + "source_path": "media\/image\/Emmelkamper_Holunderlikoer_700ml.jpg" } ----- Log Entry [count] ----- @@ -17348,12 +17348,12 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/Blog-bunt-Woman503737f821891.jpg", + "uri": "media\/image\/Blog-bunt-Woman.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "Blog-bunt-Woman503737f821891", + "file_name": "Blog-bunt-Woman", "file_size": "382456", "processed": "0", "created_at": "[timestamp]", @@ -17361,7 +17361,7 @@ Source data (JSON): "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/Blog-bunt-Woman503737f821891.jpg" + "source_path": "media\/image\/Blog-bunt-Woman.jpg" } ----- Log Entry [count] ----- @@ -17376,20 +17376,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/Emmelkamper_Holunderlikoer_700ml.jpg", + "uri": "media\/image\/Blog-bunt-Woman503737f821891.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "Emmelkamper_Holunderlikoer_700ml", - "file_size": "395538", + "file_name": "Blog-bunt-Woman503737f821891", + "file_size": "382456", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/Emmelkamper_Holunderlikoer_700ml.jpg" + "source_path": "media\/image\/Blog-bunt-Woman503737f821891.jpg" } ----- Log Entry [count] ----- @@ -18384,20 +18384,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/Blog-Koffer503df8a7784c3.jpg", + "uri": "media\/image\/Strandtuch-gelb-gross.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "Blog-Koffer503df8a7784c3", - "file_size": "717424", + "file_name": "Strandtuch-gelb-gross", + "file_size": "631481", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/Blog-Koffer503df8a7784c3.jpg" + "source_path": "media\/image\/Strandtuch-gelb-gross.jpg" } ----- Log Entry [count] ----- @@ -18412,20 +18412,20 @@ Source data (JSON): { "media": { "id": "[uuid]", - "uri": "media\/image\/Strandtuch-gelb-gross.jpg", + "uri": "media\/image\/Blog-Koffer503df8a7784c3.jpg", "entity": "media", "run_id": "[uuid]", "written": "1", "media_id": "[uuid]", - "file_name": "Strandtuch-gelb-gross", - "file_size": "631481", + "file_name": "Blog-Koffer503df8a7784c3", + "file_size": "717424", "processed": "0", "created_at": "[timestamp]", "updated_at": "[timestamp]", "process_failure": "0" }, "media_id": "[uuid]", - "source_path": "media\/image\/Strandtuch-gelb-gross.jpg" + "source_path": "media\/image\/Blog-Koffer503df8a7784c3.jpg" } ----- Log Entry [count] ----- diff --git a/tests/unit/Migration/History/HistoryServiceTest.php b/tests/unit/Migration/History/HistoryServiceTest.php index 156924567..9eb8148a1 100644 --- a/tests/unit/Migration/History/HistoryServiceTest.php +++ b/tests/unit/Migration/History/HistoryServiceTest.php @@ -11,6 +11,7 @@ use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; +use Shopware\Core\Defaults; use Shopware\Core\Framework\Context; use Shopware\Core\Framework\DataAbstractionLayer\Entity; use Shopware\Core\Framework\DataAbstractionLayer\EntityCollection; @@ -27,6 +28,7 @@ use SwagMigrationAssistant\Migration\Logging\SwagMigrationLoggingCollection; use SwagMigrationAssistant\Migration\Logging\SwagMigrationLoggingDefinition; use SwagMigrationAssistant\Migration\Logging\SwagMigrationLoggingEntity; +use SwagMigrationAssistant\Migration\MigrationConfiguration; use SwagMigrationAssistant\Migration\Premapping\PremappingChoiceStruct; use SwagMigrationAssistant\Migration\Premapping\PremappingEntityStruct; use SwagMigrationAssistant\Migration\Premapping\PremappingStruct; @@ -192,8 +194,8 @@ private function assertOutput( static::assertStringContainsString('Generated at: ', $output); static::assertStringContainsString('Run ID: ' . $run->getId(), $output); static::assertStringContainsString('Status: ' . $run->getStepValue(), $output); - static::assertStringContainsString('Created at: ' . ($run->getCreatedAt()?->format(HistoryService::LOG_TIME_FORMAT) ?? '-'), $output); - static::assertStringContainsString('Updated at: ' . ($run->getUpdatedAt()?->format(HistoryService::LOG_TIME_FORMAT) ?? '-'), $output); + static::assertStringContainsString('Created at: ' . ($run->getCreatedAt()?->format(Defaults::STORAGE_DATE_TIME_FORMAT) ?? '-'), $output); + static::assertStringContainsString('Updated at: ' . ($run->getUpdatedAt()?->format(Defaults::STORAGE_DATE_TIME_FORMAT) ?? '-'), $output); static::assertStringContainsString('Connection ID: ' . ($run->getConnectionId() ?? '-'), $output); static::assertStringContainsString('Connection name: ' . ($run->getConnection()?->getName() ?? '-'), $output); static::assertStringContainsString('Profile name: ' . ($run->getConnection()?->getProfileName() ?? '-'), $output); @@ -232,7 +234,7 @@ private function assertOutput( static::assertStringContainsString('Code: ' . $log->getCode(), $output); static::assertStringContainsString('Profile name: ' . $log->getProfileName(), $output); static::assertStringContainsString('Gateway name: ' . $log->getGatewayName(), $output); - static::assertStringContainsString('Created at: ' . ($log->getCreatedAt()?->format(HistoryService::LOG_TIME_FORMAT) ?? '-'), $output); + static::assertStringContainsString('Created at: ' . ($log->getCreatedAt()?->format(Defaults::STORAGE_DATE_TIME_FORMAT) ?? '-'), $output); if (!empty($log->getEntityName())) { static::assertStringContainsString('Entity: ' . $log->getEntityName(), $output); @@ -313,6 +315,7 @@ private function createHistoryService(array $logs, array $runs): HistoryService return new HistoryService( $loggingRepo, $runRepo, + new MigrationConfiguration(), ); }