diff --git a/vendor/magento/module-staging/Model/Operation/Update.php b/vendor/magento/module-staging/Model/Operation/Update.php index 76a8b5bf02f..6747dab6932 100644 --- a/vendor/magento/module-staging/Model/Operation/Update.php +++ b/vendor/magento/module-staging/Model/Operation/Update.php @@ -6,22 +6,23 @@ namespace Magento\Staging\Model\Operation; -use Magento\Framework\EntityManager\EntityMetadataInterface; -use Magento\Framework\EntityManager\Operation\UpdateInterface; -use Magento\Framework\EntityManager\MetadataPool; -use Magento\Staging\Model\Operation\Update\CampaignIntegrity; -use Magento\Staging\Model\ResourceModel\Db\ReadEntityVersion; -use Magento\Staging\Model\Entity\Action\UpdateVersion; use Magento\Framework\App\ResourceConnection; +use Magento\Framework\EntityManager\EntityMetadataInterface; use Magento\Framework\EntityManager\EventManager; -use Magento\Staging\Model\Operation\Update\CreateEntityVersion; -use Magento\Staging\Model\Operation\Update\UpdateEntityVersion; +use Magento\Framework\EntityManager\MetadataPool; +use Magento\Framework\EntityManager\Operation\UpdateInterface; use Magento\Framework\EntityManager\TypeResolver; +use Magento\Staging\Api\Data\UpdateInterface as UpdateInfo; use Magento\Staging\Api\UpdateRepositoryInterface; +use Magento\Staging\Model\Entity\Action\UpdateVersion; +use Magento\Staging\Model\Operation\Update\CampaignIntegrity; +use Magento\Staging\Model\Operation\Update\CreateEntityVersion; use Magento\Staging\Model\Operation\Update\RescheduleUpdate; +use Magento\Staging\Model\Operation\Update\UpdateEntityVersion; +use Magento\Staging\Model\ResourceModel\Db\ReadEntityVersion; use Magento\Staging\Model\VersionInfo; use Magento\Staging\Model\VersionInfoProvider; -use Magento\Staging\Api\Data\UpdateInterface as UpdateInfo; +use Magento\Staging\Model\VersionManager; /** * @SuppressWarnings(PHPMD.CouplingBetweenObjects) @@ -88,6 +89,11 @@ class Update implements UpdateInterface */ private $versionInfoProvider; + /** + * @var VersionManager + */ + private $versionManager; + /** * @param TypeResolver $typeResolver * @param ReadEntityVersion $entityVersion @@ -101,6 +107,7 @@ class Update implements UpdateInterface * @param RescheduleUpdate $rescheduleUpdate * @param CampaignIntegrity $campaignIntegrity * @param VersionInfoProvider $versionInfoProvider + * @param VersionManager $versionManager * @internal param PermanentUpdateProcessorPool $permanentUpdateProcessorPool * @internal param TemporaryUpdateProcessorPool $temporaryUpdateProcessorPool * @SuppressWarnings(PHPMD.ExcessiveParameterList) @@ -117,7 +124,8 @@ class Update implements UpdateInterface UpdateRepositoryInterface $updateRepository, RescheduleUpdate $rescheduleUpdate, CampaignIntegrity $campaignIntegrity, - VersionInfoProvider $versionInfoProvider + VersionInfoProvider $versionInfoProvider, + VersionManager $versionManager ) { $this->typeResolver = $typeResolver; $this->entityVersion = $entityVersion; @@ -131,6 +139,7 @@ class Update implements UpdateInterface $this->rescheduleUpdate = $rescheduleUpdate; $this->campaignIntegrity = $campaignIntegrity; $this->versionInfoProvider = $versionInfoProvider; + $this->versionManager = $versionManager; } /** @@ -173,7 +182,12 @@ class Update implements UpdateInterface $needReschedule = $arguments['created_in'] != $arguments['origin_in'] || $update->getRollbackId() != $entityData['updated_in']; if ($needReschedule) { - $this->rescheduleUpdate->reschedule($arguments['origin_in'], $arguments['created_in'], $entity); + $newVersionInfo = $this->rescheduleUpdate->reschedule( + $arguments['origin_in'], + $arguments['created_in'], + $entity + ); + $this->processNewVersion($entity, $newVersionInfo, $hydrator); } } @@ -257,4 +271,26 @@ class Update implements UpdateInterface $this->campaignIntegrity->createRollbackPoint($update, $entity); } } + + /** + * Process new version entity + * + * @param object $entity + * @param mixed $newVersionInfo + * @param object $hydrator + * @return void + */ + private function processNewVersion(object $entity, mixed $newVersionInfo, object $hydrator) : void + { + if ($newVersionInfo !== null) { + $hydrator->hydrate( + $entity, + [ + 'created_in' => $newVersionInfo->getCreatedIn(), + 'updated_in' => $newVersionInfo->getUpdatedIn() + ] + ); + $this->versionManager->setCurrentVersionId($newVersionInfo->getCreatedIn()); + } + } } diff --git a/vendor/magento/module-staging/Model/Operation/Update/RescheduleUpdate.php b/vendor/magento/module-staging/Model/Operation/Update/RescheduleUpdate.php index ac4f8eba0c1..9eae52e5229 100644 --- a/vendor/magento/module-staging/Model/Operation/Update/RescheduleUpdate.php +++ b/vendor/magento/module-staging/Model/Operation/Update/RescheduleUpdate.php @@ -5,13 +5,16 @@ */ namespace Magento\Staging\Model\Operation\Update; +use Exception; +use Magento\Framework\App\ResourceConnection; use Magento\Framework\EntityManager\EntityMetadataInterface; use Magento\Framework\EntityManager\HydratorPool; use Magento\Framework\EntityManager\MetadataPool; use Magento\Framework\EntityManager\TypeResolver; use Magento\Staging\Api\Data\UpdateInterface; -use Magento\Framework\App\ResourceConnection; use Magento\Staging\Api\UpdateRepositoryInterface; +use Magento\Staging\Model\VersionInfo; +use Magento\Staging\Model\VersionInfoFactory; use Magento\Staging\Model\VersionManager; class RescheduleUpdate @@ -41,6 +44,11 @@ class RescheduleUpdate */ private $updateRepository; + /** + * @var VersionInfoFactory + */ + private VersionInfoFactory $versionInfoFactory; + /** * RescheduleUpdate constructor. * @@ -49,19 +57,22 @@ class RescheduleUpdate * @param HydratorPool $hydratorPool * @param TypeResolver $typeResolver * @param UpdateRepositoryInterface $updateRepository + * @param VersionInfoFactory $versionInfoFactory */ public function __construct( ResourceConnection $resourceConnection, MetadataPool $metadataPool, HydratorPool $hydratorPool, TypeResolver $typeResolver, - UpdateRepositoryInterface $updateRepository + UpdateRepositoryInterface $updateRepository, + VersionInfoFactory $versionInfoFactory ) { $this->resourceConnection = $resourceConnection; $this->metadataPool = $metadataPool; $this->hydratorPool = $hydratorPool; $this->typeResolver = $typeResolver; $this->updateRepository = $updateRepository; + $this->versionInfoFactory = $versionInfoFactory; } /** @@ -190,7 +201,7 @@ class RescheduleUpdate $connection = $this->resourceConnection->getConnectionByName($metadata->getEntityConnectionName()); $previous = $this->getPrevious($metadata, $originVersion, $identifier, $originVersion); $next = $this->getNext($metadata, $originVersion, $identifier, $originVersion); - $updatedIn = ($targetVersion < $next && $targetVersion > $originVersion) ? $targetVersion :$next; + $updatedIn = ($targetVersion < $next && $targetVersion > $originVersion) ? $targetVersion : $next; $connection->update( $metadata->getEntityTable(), ['updated_in' => $updatedIn], @@ -231,7 +242,7 @@ class RescheduleUpdate * @param UpdateInterface $origin * @param UpdateInterface $target * @param string $identifier - * @return mixed + * @return array|null */ private function updateEntry( EntityMetadataInterface $metadata, @@ -245,17 +256,19 @@ class RescheduleUpdate } else { $updateIn = $this->getNext($metadata, $target->getId(), $identifier, $origin->getId()); } - return $connection->update( + $updatedData = [ + 'updated_in' => $updateIn, + 'created_in' => $target->getId() + ]; + $isUpdated = $connection->update( $metadata->getEntityTable(), - [ - 'updated_in' => $updateIn, - 'created_in' => $target->getId() - ], + $updatedData, [ $metadata->getIdentifierField() . ' = ?' => $identifier, 'created_in = ?' => $origin->getId() ] ); + return $isUpdated ? $updatedData : null; } /** @@ -301,7 +314,7 @@ class RescheduleUpdate * @param object $entity * @param UpdateInterface $origin * @param UpdateInterface $target - * @return bool + * @return array */ private function moveEntityVersion($entityType, $entity, UpdateInterface $origin, UpdateInterface $target) { @@ -313,8 +326,7 @@ class RescheduleUpdate $identifier = $entityData[$metadata->getIdentifierField()]; $this->purgeOldInterval($metadata, $originVersion, $targetVersion, $identifier); $this->prepareNewInterval($metadata, $originVersion, $targetVersion, $identifier); - $this->updateEntry($metadata, $origin, $target, $identifier); - return true; + return $this->updateEntry($metadata, $origin, $target, $identifier); } /** @@ -323,24 +335,50 @@ class RescheduleUpdate * @param string $originVersion * @param string $targetVersion * @param object $entity - * @return void - * @throws \Exception + * @return VersionInfo|null + * @throws Exception + */ + public function reschedule($originVersion, $targetVersion, object $entity): null|VersionInfo + { + return $this->rescheduleAndGetVersionInfo($originVersion, $targetVersion, $entity); + } + + /** + * Reschedules update and get version information for entity + * + * @param string $originVersion + * @param string $targetVersion + * @param object $entity + * @return null|VersionInfo + * @throws Exception */ - public function reschedule($originVersion, $targetVersion, $entity) + public function rescheduleAndGetVersionInfo($originVersion, $targetVersion, object $entity) { $origin = $this->updateRepository->get($originVersion); $target = $this->updateRepository->get($targetVersion); $entityType = $this->typeResolver->resolve($entity); $metadata = $this->metadataPool->getMetadata($entityType); + $hydrated = $this->hydratorPool->getHydrator($entityType); + $entityData = $hydrated->extract($entity); + $identifierField = $metadata->getIdentifierField(); + $linkField = $metadata->getLinkField(); $connection = $this->resourceConnection->getConnectionByName($metadata->getEntityConnectionName()); $connection->beginTransaction(); try { if ($origin->getRollbackId() || !$target->getRollbackId()) { $this->purgeRollbackEntry($entityType, $entity, $origin); } - $this->moveEntityVersion($entityType, $entity, $origin, $target); + $data = $this->moveEntityVersion($entityType, $entity, $origin, $target); $connection->commit(); - } catch (\Exception $e) { + return $this->versionInfoFactory->create( + [ + 'rowId' => $entityData[$linkField] ?? null, + 'identifier' => $entityData[$identifierField] ?? null, + 'createdIn' => $data['created_in'] ?? null, + 'updatedIn' => $data['updated_in'] ?? null + ] + ); + } catch (Exception $e) { $connection->rollBack(); throw $e; }