Skip to content

Commit

Permalink
FRW-7373 Implemented non-transactional saving for Data Exchange API. …
Browse files Browse the repository at this point in the history
…(#10910)

FRW-7373 Implemented non-transactional saving for Data Exchange API.
  • Loading branch information
olhalivitchuk authored May 14, 2024
1 parent f38af23 commit 24c73a2
Show file tree
Hide file tree
Showing 55 changed files with 2,922 additions and 1,927 deletions.
1 change: 0 additions & 1 deletion phpstan.neon
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,4 @@ parameters:
- '#Call to an undefined method .+ActiveRecordInterface::save\(\).#'
- '#Call to an undefined method .+ActiveRecordInterface::isNew\(\).#'
- '#Call to an undefined method .+ActiveRecordInterface::getByName\(\).#'
- '#Call to an undefined method .+ActiveRecordInterface::getPrimaryKey\(\).#'
- '#Call to an undefined method .+ActiveRecordInterface::setByName\(\).#'
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@
<property name="dynamicEntities" type="DynamicEntity[]" singular="dynamicEntity"/>
<property name="isCreatable" type="bool"/>
<property name="resetNotProvidedFieldValues" type="bool"/>
<property name="isTransactional" type="bool"/>
</transfer>

<transfer name="DynamicEntityCollectionResponse" strict="true">
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
<?php

/**
* Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
* Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
*/

namespace Spryker\Zed\DynamicEntity\Business\Configuration;

use Generated\Shared\Transfer\DynamicEntityConfigurationTransfer;
use Generated\Shared\Transfer\ErrorTransfer;

class DynamicEntityConfigurationResponse implements DynamicEntityConfigurationResponseInterface
{
/**
* @var \Generated\Shared\Transfer\DynamicEntityConfigurationTransfer
*/
protected DynamicEntityConfigurationTransfer $dynamicEntityConfigurationTransfer;

/**
* @var array<\Generated\Shared\Transfer\ErrorTransfer>
*/
protected array $errorTransfers = [];

/**
* @return \Generated\Shared\Transfer\DynamicEntityConfigurationTransfer
*/
public function getDynamicEntityConfigurationTransfer(): DynamicEntityConfigurationTransfer
{
return $this->dynamicEntityConfigurationTransfer;
}

/**
* @return array<\Generated\Shared\Transfer\ErrorTransfer>
*/
public function getErrorTransfers(): array
{
return $this->errorTransfers;
}

/**
* @param \Generated\Shared\Transfer\DynamicEntityConfigurationTransfer $dynamicEntityConfigurationTransfer
*
* @return \Spryker\Zed\DynamicEntity\Business\Configuration\DynamicEntityConfigurationResponseInterface
*/
public function setDynamicConfigurationTransfer(
DynamicEntityConfigurationTransfer $dynamicEntityConfigurationTransfer
): DynamicEntityConfigurationResponseInterface {
$this->dynamicEntityConfigurationTransfer = $dynamicEntityConfigurationTransfer;

return $this;
}

/**
* @param \Generated\Shared\Transfer\ErrorTransfer $errorTransfer
*
* @return \Spryker\Zed\DynamicEntity\Business\Configuration\DynamicEntityConfigurationResponseInterface
*/
public function addErrorTransfer(
ErrorTransfer $errorTransfer
): DynamicEntityConfigurationResponseInterface {
$this->errorTransfers[] = $errorTransfer;

return $this;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?php

/**
* Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
* Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
*/

namespace Spryker\Zed\DynamicEntity\Business\Configuration;

use Generated\Shared\Transfer\DynamicEntityConfigurationTransfer;
use Generated\Shared\Transfer\ErrorTransfer;

interface DynamicEntityConfigurationResponseInterface
{
/**
* @return \Generated\Shared\Transfer\DynamicEntityConfigurationTransfer
*/
public function getDynamicEntityConfigurationTransfer(): DynamicEntityConfigurationTransfer;

/**
* @return array<\Generated\Shared\Transfer\ErrorTransfer>
*/
public function getErrorTransfers(): array;

/**
* @param \Generated\Shared\Transfer\DynamicEntityConfigurationTransfer $dynamicEntityConfigurationTransfer
*
* @return $this
*/
public function setDynamicConfigurationTransfer(
DynamicEntityConfigurationTransfer $dynamicEntityConfigurationTransfer
): self;

/**
* @param \Generated\Shared\Transfer\ErrorTransfer $errorTransfer
*
* @return $this
*/
public function addErrorTransfer(ErrorTransfer $errorTransfer);
}
169 changes: 134 additions & 35 deletions src/Spryker/Zed/DynamicEntity/Business/Creator/DynamicEntityCreator.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,13 @@

use Generated\Shared\Transfer\DynamicEntityCollectionRequestTransfer;
use Generated\Shared\Transfer\DynamicEntityCollectionResponseTransfer;
use Spryker\Zed\DynamicEntity\Business\Exception\DynamicEntityConfigurationNotFoundException;
use Generated\Shared\Transfer\DynamicEntityConfigurationTransfer;
use Generated\Shared\Transfer\DynamicEntityPostEditRequestTransfer;
use Generated\Shared\Transfer\DynamicEntityPostEditResponseTransfer;
use Spryker\Zed\DynamicEntity\Business\Configuration\DynamicEntityConfigurationResponseInterface;
use Spryker\Zed\DynamicEntity\Business\Mapper\DynamicEntityMapperInterface;
use Spryker\Zed\DynamicEntity\Business\Reader\DynamicEntityReaderInterface;
use Spryker\Zed\DynamicEntity\Business\Validator\DynamicEntityConfigurationTreeValidatorInterface;
use Spryker\Zed\DynamicEntity\Business\Validator\DynamicEntityValidatorInterface;
use Spryker\Zed\DynamicEntity\Business\Transaction\Propel\TransactionProcessorInterface;
use Spryker\Zed\DynamicEntity\Business\Writer\DynamicEntityWriterInterface;

class DynamicEntityCreator implements DynamicEntityCreatorInterface
Expand All @@ -28,76 +31,172 @@ class DynamicEntityCreator implements DynamicEntityCreatorInterface
protected DynamicEntityWriterInterface $dynamicEntityWriter;

/**
* @var \Spryker\Zed\DynamicEntity\Business\Validator\DynamicEntityValidatorInterface
* @var \Spryker\Zed\DynamicEntity\Business\Mapper\DynamicEntityMapperInterface
*/
protected DynamicEntityValidatorInterface $dynamicEntityValidator;
protected DynamicEntityMapperInterface $dynamicEntityMapper;

/**
* @var \Spryker\Zed\DynamicEntity\Business\Validator\DynamicEntityConfigurationTreeValidatorInterface
* @var \Spryker\Zed\DynamicEntity\Business\Transaction\Propel\TransactionProcessorInterface
*/
protected DynamicEntityConfigurationTreeValidatorInterface $dynamicEntityConfigurationTreeValidator;
protected TransactionProcessorInterface $transactionProcessor;

/**
* @var array<\Spryker\Zed\DynamicEntityExtension\Dependency\Plugin\DynamicEntityPostCreatePluginInterface>
*/
protected array $dynamicEntityPostCreatePlugins;

/**
* @param \Spryker\Zed\DynamicEntity\Business\Reader\DynamicEntityReaderInterface $dynamicEntityReader
* @param \Spryker\Zed\DynamicEntity\Business\Writer\DynamicEntityWriterInterface $dynamicEntityWriter
* @param \Spryker\Zed\DynamicEntity\Business\Validator\DynamicEntityValidatorInterface $dynamicEntityValidator
* @param \Spryker\Zed\DynamicEntity\Business\Validator\DynamicEntityConfigurationTreeValidatorInterface $dynamicEntityConfigurationTreeValidator
* @param \Spryker\Zed\DynamicEntity\Business\Mapper\DynamicEntityMapperInterface $dynamicEntityMapper
* @param \Spryker\Zed\DynamicEntity\Business\Transaction\Propel\TransactionProcessorInterface $transactionProcessor
* @param array<\Spryker\Zed\DynamicEntityExtension\Dependency\Plugin\DynamicEntityPostCreatePluginInterface> $dynamicEntityPostCreatePlugins
*/
public function __construct(
DynamicEntityReaderInterface $dynamicEntityReader,
DynamicEntityWriterInterface $dynamicEntityWriter,
DynamicEntityValidatorInterface $dynamicEntityValidator,
DynamicEntityConfigurationTreeValidatorInterface $dynamicEntityConfigurationTreeValidator
DynamicEntityMapperInterface $dynamicEntityMapper,
TransactionProcessorInterface $transactionProcessor,
array $dynamicEntityPostCreatePlugins
) {
$this->dynamicEntityReader = $dynamicEntityReader;
$this->dynamicEntityWriter = $dynamicEntityWriter;
$this->dynamicEntityValidator = $dynamicEntityValidator;
$this->dynamicEntityConfigurationTreeValidator = $dynamicEntityConfigurationTreeValidator;
$this->dynamicEntityMapper = $dynamicEntityMapper;
$this->transactionProcessor = $transactionProcessor;
$this->dynamicEntityPostCreatePlugins = $dynamicEntityPostCreatePlugins;
}

/**
* @param \Generated\Shared\Transfer\DynamicEntityCollectionRequestTransfer $dynamicEntityCollectionRequestTransfer
*
* @throws \Spryker\Zed\DynamicEntity\Business\Exception\DynamicEntityConfigurationNotFoundException
*
* @return \Generated\Shared\Transfer\DynamicEntityCollectionResponseTransfer
*/
public function create(DynamicEntityCollectionRequestTransfer $dynamicEntityCollectionRequestTransfer): DynamicEntityCollectionResponseTransfer
{
$dynamicEntityConfigurationCollectionTransfer = $this->dynamicEntityReader->getDynamicEntityConfigurationByDynamicEntityCollectionRequest(
$dynamicEntityConfigurationResponse = $this->dynamicEntityReader->getDynamicEntityConfigurationTransferTree(
$dynamicEntityCollectionRequestTransfer,
);

$errorTransfer = $this->dynamicEntityConfigurationTreeValidator
->validateDynamicEntityConfigurationCollectionByDynamicEntityConfigurationCollection(
$dynamicEntityCollectionResponseTransfer = new DynamicEntityCollectionResponseTransfer();

if ($dynamicEntityConfigurationResponse->getErrorTransfers() !== []) {
return $this->mergeErrors($dynamicEntityCollectionResponseTransfer, $dynamicEntityConfigurationResponse);
}

$this->transactionProcessor->startAtomicTransaction($dynamicEntityCollectionRequestTransfer);

foreach ($dynamicEntityCollectionRequestTransfer->getDynamicEntities() as $index => $dynamicEntityTransfer) {
$currentDynamicEntityCollectionResponseTransfer = new DynamicEntityCollectionResponseTransfer();

$this->transactionProcessor->startPerItemTransaction($dynamicEntityCollectionRequestTransfer);

$currentDynamicEntityCollectionResponseTransfer = $this->dynamicEntityWriter->createDynamicEntity(
$dynamicEntityTransfer,
$dynamicEntityConfigurationResponse->getDynamicEntityConfigurationTransfer(),
$dynamicEntityCollectionRequestTransfer,
$dynamicEntityConfigurationCollectionTransfer,
$currentDynamicEntityCollectionResponseTransfer,
);

if ($errorTransfer !== null) {
return (new DynamicEntityCollectionResponseTransfer())
->addError($errorTransfer);
$this->transactionProcessor->endPerItemTransaction($dynamicEntityCollectionRequestTransfer, $currentDynamicEntityCollectionResponseTransfer);

$dynamicEntityCollectionResponseTransfer = $this->mergeResponses($dynamicEntityCollectionResponseTransfer, $currentDynamicEntityCollectionResponseTransfer);
}

$dynamicEntityConfigurationTransfer = $this->dynamicEntityReader->getDynamicEntityConfigurationTransferTreeByDynamicEntityConfigurationCollection(
$dynamicEntityCollectionRequestTransfer,
$dynamicEntityConfigurationCollectionTransfer,
$dynamicEntityCollectionResponseTransfer = $this->executeDynamicEntityPostCreatePlugins(
$dynamicEntityConfigurationResponse->getDynamicEntityConfigurationTransfer(),
$dynamicEntityCollectionResponseTransfer,
);

if ($dynamicEntityConfigurationTransfer === null) {
throw new DynamicEntityConfigurationNotFoundException();
$this->transactionProcessor->endAtomicTransaction($dynamicEntityCollectionRequestTransfer, $dynamicEntityCollectionResponseTransfer);

return $dynamicEntityCollectionResponseTransfer;
}

/**
* @param \Generated\Shared\Transfer\DynamicEntityConfigurationTransfer $dynamicEntityConfigurationTransfer
* @param \Generated\Shared\Transfer\DynamicEntityCollectionResponseTransfer $dynamicEntityCollectionResponseTransfer
*
* @return \Generated\Shared\Transfer\DynamicEntityCollectionResponseTransfer
*/
protected function executeDynamicEntityPostCreatePlugins(
DynamicEntityConfigurationTransfer $dynamicEntityConfigurationTransfer,
DynamicEntityCollectionResponseTransfer $dynamicEntityCollectionResponseTransfer
): DynamicEntityCollectionResponseTransfer {
$dynamicEntityPostEditResponseTransfer = new DynamicEntityPostEditResponseTransfer();
$dynamicEntityPostEditRequestTransfers = $this->dynamicEntityMapper
->mapDynamicEntityCollectionResponseTransferToPostEditRequestTransfersArray(
$dynamicEntityConfigurationTransfer,
$dynamicEntityCollectionResponseTransfer,
);

foreach ($dynamicEntityPostEditRequestTransfers as $dynamicEntityPostEditRequestTransfer) {
$dynamicEntityPostEditResponseTransfer = $this->executeDynamicEntityPostCreatePluginsForPostEditRequestTransfer($dynamicEntityPostEditRequestTransfer);

foreach ($dynamicEntityPostEditResponseTransfer->getErrors() as $error) {
$dynamicEntityCollectionResponseTransfer->addError($error);
}
}

$dynamicEntityCollectionResponseTransfer = $this->dynamicEntityValidator->validate(
$dynamicEntityCollectionRequestTransfer,
$dynamicEntityConfigurationTransfer,
new DynamicEntityCollectionResponseTransfer(),
);
return $dynamicEntityCollectionResponseTransfer;
}

/**
* @param \Generated\Shared\Transfer\DynamicEntityPostEditRequestTransfer $dynamicEntityPostEditRequestTransfer
*
* @return \Generated\Shared\Transfer\DynamicEntityPostEditResponseTransfer
*/
protected function executeDynamicEntityPostCreatePluginsForPostEditRequestTransfer(
DynamicEntityPostEditRequestTransfer $dynamicEntityPostEditRequestTransfer
): DynamicEntityPostEditResponseTransfer {
$dynamicEntityPostEditResponseTransfer = null;
foreach ($this->dynamicEntityPostCreatePlugins as $dynamicEntityPostCreatePlugin) {
$dynamicEntityPostEditResponseTransfer = $dynamicEntityPostCreatePlugin->postCreate(
$dynamicEntityPostEditRequestTransfer,
);

if ($dynamicEntityPostEditResponseTransfer->getErrors()->count() > 0) {
return $dynamicEntityPostEditResponseTransfer;
}
}

return $dynamicEntityPostEditResponseTransfer ?: new DynamicEntityPostEditResponseTransfer();
}

/**
* @param \Generated\Shared\Transfer\DynamicEntityCollectionResponseTransfer $dynamicEntityCollectionResponseTransfer
* @param \Spryker\Zed\DynamicEntity\Business\Configuration\DynamicEntityConfigurationResponseInterface $dynamicEntityConfigurationResponse
*
* @return \Generated\Shared\Transfer\DynamicEntityCollectionResponseTransfer
*/
protected function mergeErrors(
DynamicEntityCollectionResponseTransfer $dynamicEntityCollectionResponseTransfer,
DynamicEntityConfigurationResponseInterface $dynamicEntityConfigurationResponse
): DynamicEntityCollectionResponseTransfer {
foreach ($dynamicEntityConfigurationResponse->getErrorTransfers() as $errorTransfer) {
$dynamicEntityCollectionResponseTransfer->addError($errorTransfer);
}

return $dynamicEntityCollectionResponseTransfer;
}

/**
* @param \Generated\Shared\Transfer\DynamicEntityCollectionResponseTransfer $mainDynamicEntityCollectionResponseTransfer
* @param \Generated\Shared\Transfer\DynamicEntityCollectionResponseTransfer $currentDynamicEntityCollectionResponseTransfer
*
* @return \Generated\Shared\Transfer\DynamicEntityCollectionResponseTransfer
*/
protected function mergeResponses(
DynamicEntityCollectionResponseTransfer $mainDynamicEntityCollectionResponseTransfer,
DynamicEntityCollectionResponseTransfer $currentDynamicEntityCollectionResponseTransfer
): DynamicEntityCollectionResponseTransfer {
foreach ($currentDynamicEntityCollectionResponseTransfer->getErrors() as $errorTransfer) {
$mainDynamicEntityCollectionResponseTransfer->addError($errorTransfer);
}

if ($dynamicEntityCollectionResponseTransfer->getErrors()->count()) {
return $dynamicEntityCollectionResponseTransfer;
foreach ($currentDynamicEntityCollectionResponseTransfer->getDynamicEntities() as $dynamicEntityTransfer) {
$mainDynamicEntityCollectionResponseTransfer->addDynamicEntity($dynamicEntityTransfer);
}

return $this->dynamicEntityWriter->executeCreateTransaction($dynamicEntityCollectionRequestTransfer, $dynamicEntityConfigurationTransfer);
return $mainDynamicEntityCollectionResponseTransfer;
}
}
Loading

0 comments on commit 24c73a2

Please sign in to comment.