Skip to content

Commit

Permalink
FRW-6879 Added IN filter support for Data Exchange API. (#10852)
Browse files Browse the repository at this point in the history
FRW-6879 Added `IN` filter support for Data Exchange API.
  • Loading branch information
dimitriyTsemma authored Mar 7, 2024
1 parent 369aa5d commit 2892794
Show file tree
Hide file tree
Showing 13 changed files with 613 additions and 93 deletions.
3 changes: 2 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@
"spryker/installer-extension": "^1.0.0",
"spryker/kernel": "^3.30.0",
"spryker/propel-orm": "^1.6.0",
"spryker/transfer": "^3.27.0"
"spryker/transfer": "^3.27.0",
"spryker/util-encoding": "^2.0.0"
},
"require-dev": {
"spryker/code-sniffer": "*",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
use Generated\Shared\Transfer\DynamicEntityConfigurationCollectionTransfer;
use Generated\Shared\Transfer\DynamicEntityConfigurationTransfer;
use Generated\Shared\Transfer\DynamicEntityCriteriaTransfer;
use Generated\Shared\Transfer\DynamicEntityDefinitionTransfer;
use Generated\Shared\Transfer\ErrorTransfer;
use Spryker\Zed\DynamicEntity\Business\Mapper\DynamicEntityMapperInterface;

Expand All @@ -26,6 +27,11 @@ class DynamicEntityConfigurationTreeValidator implements DynamicEntityConfigurat
*/
protected const ERROR_MESSAGE_RELATION_NOT_FOUND = 'dynamic_entity.validation.relation_not_found';

/**
* @var string
*/
protected const ERROR_MESSAGE_FILTER_FIELD_NOT_FOUND = 'dynamic_entity.validation.filter_field_not_found';

/**
* @var string
*/
Expand All @@ -36,6 +42,16 @@ class DynamicEntityConfigurationTreeValidator implements DynamicEntityConfigurat
*/
protected const PLACEHOLDER_RELATION_NAME = '%relationName%';

/**
* @var string
*/
protected const PLACEHOLDER_FILTER_FIELD = '%filterField%';

/**
* @var string
*/
protected const IDENTIFIER_KEY = 'identifier';

/**
* @var \Spryker\Zed\DynamicEntity\Business\Mapper\DynamicEntityMapperInterface
*/
Expand All @@ -61,7 +77,12 @@ public function validateDynamicEntityConfigurationCollection(
): ?ErrorTransfer {
$tableAlias = $dynamicEntityCriteriaTransfer->getDynamicEntityConditionsOrFail()->getTableAliasOrFail();
if ($dynamicEntityConfigurationCollectionTransfer->getDynamicEntityConfigurations()->count() === 0) {
return $this->createConfigurationNotFoundErrorTransfer($tableAlias);
return $this->createErrorTransfer(
static::ERROR_MESSAGE_CONFIGURATION_NOT_FOUND,
[
static::PLACEHOLDER_ALIAS_NAME => $tableAlias,
],
);
}

$rootDynamicEntityConfigurationTranfer = $this->getDynamicEntityConfigurationEntityByTableAlias(
Expand All @@ -70,7 +91,21 @@ public function validateDynamicEntityConfigurationCollection(
);

if ($rootDynamicEntityConfigurationTranfer === null) {
return $this->createConfigurationNotFoundErrorTransfer($tableAlias);
return $this->createErrorTransfer(
static::ERROR_MESSAGE_CONFIGURATION_NOT_FOUND,
[
static::PLACEHOLDER_ALIAS_NAME => $tableAlias,
],
);
}

$filterFieldValidationError = $this->validateFilterField(
$dynamicEntityCriteriaTransfer,
$rootDynamicEntityConfigurationTranfer,
);

if ($filterFieldValidationError !== null) {
return $filterFieldValidationError;
}

return $this->validateRelationChainsSequence(
Expand Down Expand Up @@ -221,16 +256,89 @@ protected function getDynamicEntityConfigurationEntityByTableAlias(
}

/**
* @param string $tableAlias
* @param string $message
* @param array<string, string> $parameters
*
* @return \Generated\Shared\Transfer\ErrorTransfer
*/
protected function createConfigurationNotFoundErrorTransfer(string $tableAlias): ErrorTransfer
{
protected function createErrorTransfer(
string $message,
array $parameters = []
): ErrorTransfer {
return (new ErrorTransfer())
->setMessage(static::ERROR_MESSAGE_CONFIGURATION_NOT_FOUND)
->setParameters([
static::PLACEHOLDER_ALIAS_NAME => $tableAlias,
]);
->setMessage($message)
->setParameters($parameters);
}

/**
* @param \Generated\Shared\Transfer\DynamicEntityCriteriaTransfer $dynamicEntityCriteriaTransfer
* @param \Generated\Shared\Transfer\DynamicEntityConfigurationTransfer $dynamicEntityConfigurationTranfer
*
* @return \Generated\Shared\Transfer\ErrorTransfer|null
*/
protected function validateFilterField(
DynamicEntityCriteriaTransfer $dynamicEntityCriteriaTransfer,
DynamicEntityConfigurationTransfer $dynamicEntityConfigurationTranfer
): ?ErrorTransfer {
$dynamicEntityDefinitionTransfer = $dynamicEntityConfigurationTranfer->getDynamicEntityDefinitionOrFail();
$definedFieldNames = $this->collectDefinedFieldVisibleNames($dynamicEntityDefinitionTransfer);

foreach ($dynamicEntityCriteriaTransfer->getDynamicEntityConditionsOrFail()->getFieldConditions() as $fieldCondition) {
$fieldConditionName = $fieldCondition->getNameOrFail();

if ($fieldConditionName === static::IDENTIFIER_KEY) {
$fieldConditionName = $this->getVisibleIdentifier($dynamicEntityDefinitionTransfer, $fieldConditionName);
}

if (!in_array($fieldConditionName, $definedFieldNames)) {
$tableAlias = $dynamicEntityCriteriaTransfer->getDynamicEntityConditionsOrFail()->getTableAliasOrFail();

return $this->createErrorTransfer(
static::ERROR_MESSAGE_FILTER_FIELD_NOT_FOUND,
[
static::PLACEHOLDER_FILTER_FIELD => $fieldConditionName,
static::PLACEHOLDER_ALIAS_NAME => $tableAlias,
],
);
}
}

return null;
}

/**
* @param \Generated\Shared\Transfer\DynamicEntityDefinitionTransfer $dynamicEntityDefinitionTransfer
*
* @return array<string>
*/
protected function collectDefinedFieldVisibleNames(DynamicEntityDefinitionTransfer $dynamicEntityDefinitionTransfer): array
{
$definedFieldVisibleNames = [];

foreach ($dynamicEntityDefinitionTransfer->getFieldDefinitions() as $fieldDefinition) {
$definedFieldVisibleNames[] = $fieldDefinition->getFieldVisibleNameOrFail();
}

return $definedFieldVisibleNames;
}

/**
* @param \Generated\Shared\Transfer\DynamicEntityDefinitionTransfer $dynamicEntityDefinitionTransfer
* @param string $fieldConditionName
*
* @return string
*/
protected function getVisibleIdentifier(
DynamicEntityDefinitionTransfer $dynamicEntityDefinitionTransfer,
string $fieldConditionName
): string {
$identifier = $dynamicEntityDefinitionTransfer->getIdentifierOrFail();
foreach ($dynamicEntityDefinitionTransfer->getFieldDefinitions() as $fieldDefinition) {
if ($fieldDefinition->getFieldNameOrFail() === $identifier) {
$fieldConditionName = $fieldDefinition->getFieldVisibleNameOrFail();
}
}

return $fieldConditionName;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
<?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\Dependency\Service;

use Spryker\Service\UtilEncoding\UtilEncodingServiceInterface;

class DynamicEntityToUtilEncodingServiceBridge implements DynamicEntityToUtilEncodingServiceInterface
{
/**
* @var \Spryker\Service\UtilEncoding\UtilEncodingServiceInterface
*/
protected UtilEncodingServiceInterface $utilEncodingService;

/**
* @param \Spryker\Service\UtilEncoding\UtilEncodingServiceInterface $utilEncodingService
*/
public function __construct($utilEncodingService)
{
$this->utilEncodingService = $utilEncodingService;
}

/**
* @param array<mixed> $value
* @param int|null $options
* @param int|null $depth
*
* @return string|null
*/
public function encodeJson(array $value, ?int $options = null, ?int $depth = null): ?string
{
return $this->utilEncodingService->encodeJson($value, $options, $depth);
}

/**
* @param string $jsonValue
* @param bool $assoc Deprecated: `false` is deprecated, always use `true` for array return.
* @param int|null $depth
* @param int|null $options
*
* @return object|array<mixed>|null
*/
public function decodeJson(string $jsonValue, bool $assoc = false, ?int $depth = null, ?int $options = null)
{
if ($assoc === false) {
trigger_error('Param #2 `$assoc` must be `true` as return of type `object` is not accepted.', E_USER_DEPRECATED);
}

/** @phpstan-var array<mixed>|null */
return $this->utilEncodingService->decodeJson($jsonValue, $assoc, $depth, $options);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?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\Dependency\Service;

interface DynamicEntityToUtilEncodingServiceInterface
{
/**
* @param array<mixed> $value
* @param int|null $options
* @param int|null $depth
*
* @return string|null
*/
public function encodeJson(array $value, ?int $options = null, ?int $depth = null): ?string;

/**
* @param string $jsonValue
* @param bool $assoc Deprecated: `false` is deprecated, always use `true` for array return.
* @param int|null $depth
* @param int|null $options
*
* @return object|array<mixed>|null
*/
public function decodeJson(string $jsonValue, bool $assoc = false, ?int $depth = null, ?int $options = null);
}
36 changes: 36 additions & 0 deletions src/Spryker/Zed/DynamicEntity/DynamicEntityDependencyProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

use Propel\Runtime\Propel;
use Spryker\Zed\DynamicEntity\Dependency\External\DynamicEntityToConnectionAdapter;
use Spryker\Zed\DynamicEntity\Dependency\Service\DynamicEntityToUtilEncodingServiceBridge;
use Spryker\Zed\Kernel\AbstractBundleDependencyProvider;
use Spryker\Zed\Kernel\Container;

Expand All @@ -32,6 +33,11 @@ class DynamicEntityDependencyProvider extends AbstractBundleDependencyProvider
*/
public const PLUGINS_DYNAMIC_ENTITY_POST_UPDATE = 'PLUGINS_DYNAMIC_ENTITY_POST_UPDATE';

/**
* @var string
*/
public const SERVICE_UTIL_ENCODING = 'SERVICE_UTIL_ENCODING';

/**
* @param \Spryker\Zed\Kernel\Container $container
*
Expand All @@ -48,6 +54,20 @@ public function provideBusinessLayerDependencies(Container $container): Containe
return $container;
}

/**
* @param \Spryker\Zed\Kernel\Container $container
*
* @return \Spryker\Zed\Kernel\Container
*/
public function providePersistenceLayerDependencies(Container $container): Container
{
$container = parent::providePersistenceLayerDependencies($container);

$container = $this->addUtilEncodingService($container);

return $container;
}

/**
* @param \Spryker\Zed\Kernel\Container $container
*
Expand Down Expand Up @@ -105,4 +125,20 @@ protected function getDynamicEntityPostUpdatePlugins(): array
{
return [];
}

/**
* @param \Spryker\Zed\Kernel\Container $container
*
* @return \Spryker\Zed\Kernel\Container
*/
protected function addUtilEncodingService(Container $container): Container
{
$container->set(static::SERVICE_UTIL_ENCODING, function (Container $container) {
return new DynamicEntityToUtilEncodingServiceBridge(
$container->getLocator()->utilEncoding()->service(),
);
});

return $container;
}
}
Loading

0 comments on commit 2892794

Please sign in to comment.