diff --git a/src/Spryker/Zed/DynamicEntity/Business/Writer/DynamicEntityWriter.php b/src/Spryker/Zed/DynamicEntity/Business/Writer/DynamicEntityWriter.php index 42ea012..4fc37f6 100644 --- a/src/Spryker/Zed/DynamicEntity/Business/Writer/DynamicEntityWriter.php +++ b/src/Spryker/Zed/DynamicEntity/Business/Writer/DynamicEntityWriter.php @@ -10,7 +10,9 @@ use Generated\Shared\Transfer\DynamicEntityCollectionRequestTransfer; use Generated\Shared\Transfer\DynamicEntityCollectionResponseTransfer; use Generated\Shared\Transfer\DynamicEntityConditionsTransfer; +use Generated\Shared\Transfer\DynamicEntityConfigurationRelationTransfer; use Generated\Shared\Transfer\DynamicEntityConfigurationTransfer; +use Generated\Shared\Transfer\DynamicEntityFieldConditionTransfer; use Generated\Shared\Transfer\DynamicEntityRelationFieldMappingTransfer; use Generated\Shared\Transfer\DynamicEntityRelationTransfer; use Generated\Shared\Transfer\DynamicEntityTransfer; @@ -393,6 +395,12 @@ protected function updateChildDynamicEntititesFromRelation( $dynamicEntityConditionsTransfer = new DynamicEntityConditionsTransfer(); } + $dynamicEntityConditionsTransfer = $this->addParentForeignKeyToConditionsTransfer( + $dynamicEntityConditionsTransfer, + $childDynamicEntityConfiguration, + $parentDynamicEntityTransfer, + ); + $childDynamicEntityCollectionResponseTransfer = $this->entityManager->updateChildDynamicEntity( $childDynamicEntityTransfer, $childDynamicEntityConfiguration, @@ -443,6 +451,29 @@ protected function addParentForeignKeyToChildFields( ); } + /** + * @param \Generated\Shared\Transfer\DynamicEntityConditionsTransfer $dynamicEntityConditionsTransfer + * @param \Generated\Shared\Transfer\DynamicEntityConfigurationRelationTransfer $childDynamicEntityConfiguration + * @param \Generated\Shared\Transfer\DynamicEntityTransfer $parentDynamicEntityTransfer + * + * @return \Generated\Shared\Transfer\DynamicEntityConditionsTransfer + */ + protected function addParentForeignKeyToConditionsTransfer( + DynamicEntityConditionsTransfer $dynamicEntityConditionsTransfer, + DynamicEntityConfigurationRelationTransfer $childDynamicEntityConfiguration, + DynamicEntityTransfer $parentDynamicEntityTransfer + ): DynamicEntityConditionsTransfer { + foreach ($childDynamicEntityConfiguration->getRelationFieldMappings() as $childRelationFieldMapping) { + $dynamicEntityConditionsTransfer->addFieldCondition( + (new DynamicEntityFieldConditionTransfer()) + ->setName($childRelationFieldMapping->getChildFieldName()) + ->setValue($parentDynamicEntityTransfer->getFields()[$childRelationFieldMapping->getParentFieldName()]), + ); + } + + return $dynamicEntityConditionsTransfer; + } + /** * @param \Generated\Shared\Transfer\DynamicEntityCollectionResponseTransfer $dynamicEntityCollectionResponseTransfer * @param array<\Generated\Shared\Transfer\ErrorTransfer> $errorTransfers diff --git a/tests/SprykerTest/Zed/DynamicEntity/Business/DynamicEntityFacadeTest.php b/tests/SprykerTest/Zed/DynamicEntity/Business/DynamicEntityFacadeTest.php index f0544eb..1208639 100644 --- a/tests/SprykerTest/Zed/DynamicEntity/Business/DynamicEntityFacadeTest.php +++ b/tests/SprykerTest/Zed/DynamicEntity/Business/DynamicEntityFacadeTest.php @@ -101,6 +101,16 @@ class DynamicEntityFacadeTest extends Unit */ protected const IDENTIFIER_TEST_TABLE_ALIAS = 'test_identifiers'; + /** + * @var string + */ + protected const RELATION_PARENT_FK = 'fk_parent_dynamic_entity_configuration'; + + /** + * @var string + */ + protected const RELATION_CHILD_FK = 'fk_child_dynamic_entity_configuration'; + /** * @var string */ @@ -260,6 +270,75 @@ public function testGetDynamicEntityCollectionReturnsCollectionWithChildRelation $this->assertEquals(1, count($dynamicEntityTranfer->getChildRelations()[0]->getDynamicEntities())); } + /** + * @return void + */ + public function testPutDynamicEntityCollectionUpdatesCollectionWithChildRelations(): void + { + // Arrange + $dynamicEntityConfigurationEntity = $this->tester->createDynamicEntityConfigurationWithRelationAndFieldMapping( + $this->tester::FOO_TABLE_ALIAS_1, + static::RELATION_TEST_NAME, + static::FIELD_PARENT_ENTITY_ID_CONFIGURATION, + static::FIELD_CHILD_ENTITY_ID_CONFIGURATION, + ); + $dynamicConfigurationEntity = $this->tester->getDynamicEntityConfigurationByTableAlias($this->tester::FOO_TABLE_ALIAS_1); + $relationEntity = $this->tester->getDynamicEntityConfigurationRelationEntityByRelation(static::RELATION_TEST_NAME); + $childDynamicConfigurationEntity = $relationEntity->getSpyDynamicEntityConfigurationRelatedByFkChildDynamicEntityConfiguration(); + + $dynamicEntityCollectionRequestTransfer = $this->tester->createDynamicEntityCollectionRequestTransfer($dynamicEntityConfigurationEntity->getTableAlias()); + $childEntityFields = [ + static::RELATION_PARENT_FK => $dynamicConfigurationEntity->getIdDynamicEntityConfiguration(), + static::RELATION_CHILD_FK => 1, + 'is_editable' => true, + 'name' => 'testme', + ]; + + $dynamicEntityCollectionRequestTransfer + ->setResetNotProvidedFieldValues(true) + ->setIsCreatable(true) + ->addDynamicEntity( + (new DynamicEntityTransfer()) + ->setFields([ + static::FIELD_PARENT_ENTITY_ID_CONFIGURATION => $dynamicConfigurationEntity->getIdDynamicEntityConfiguration(), + 'table_alias' => static::FOO_TABLE_ALIAS_2, + 'table_name' => $dynamicConfigurationEntity->getTableName(), + 'definition' => $dynamicConfigurationEntity->getDefinition(), + static::RELATION_TEST_NAME => [$childEntityFields], + ]) + ->addChildRelation( + (new DynamicEntityRelationTransfer()) + ->setName(static::RELATION_TEST_NAME) + ->addDynamicEntity( + (new DynamicEntityTransfer()) + ->setFields($childEntityFields), + ), + ), + ); + + // Act + $dynamicEntityCollectionResponseTransfer = $this->dynamicEntityFacade->updateDynamicEntityCollection($dynamicEntityCollectionRequestTransfer); + + // Assert + $updatedDynamicConfigurationEntity = $this->tester->getDynamicEntityConfigurationByIdDynamicEntityConfiguration( + $childDynamicConfigurationEntity->getIdDynamicEntityConfiguration(), + ); + + $this->assertEmpty($dynamicEntityCollectionResponseTransfer->getErrors()); + $this->assertNotEquals($dynamicConfigurationEntity->getTableName(), $updatedDynamicConfigurationEntity->getTableName()); + + $dynamicEntities = $dynamicEntityCollectionResponseTransfer->getDynamicEntities(); + + $this->assertNotEmpty($dynamicEntities); + + $updatedDynamicEntity = $dynamicEntities->offsetGet(0); + + $this->assertEquals( + $updatedDynamicEntity->getFields()[static::FIELD_PARENT_ENTITY_ID_CONFIGURATION], + $updatedDynamicEntity->getChildRelations()->offsetGet(0)->getDynamicEntities()->offsetGet(0)->getFields()[static::RELATION_PARENT_FK], + ); + } + /** * @return void */ @@ -521,56 +600,6 @@ public function testPatchDynamicEntityCollectionWithChildRelationsHasErrorsWhenW $this->assertNotEmpty($dynamicEntityCollectionResponseTransfer->getErrors()); } - /** - * @return void - */ - public function testPutDynamicEntityCollectionUpdatesCollectionWithChildRelations(): void - { - // Arrange - $dynamicEntityConfigurationEntity = $this->tester->createDynamicEntityConfigurationWithRelationAndFieldMapping( - $this->tester::FOO_TABLE_ALIAS_1, - static::RELATION_TEST_NAME, - static::FIELD_PARENT_ENTITY_ID_CONFIGURATION, - static::FIELD_CHILD_ENTITY_ID_CONFIGURATION, - ); - $dynamicConfigurationEntity = $this->tester->getDynamicEntityConfigurationByTableAlias($this->tester::FOO_TABLE_ALIAS_1); - $relationEntity = $this->tester->getDynamicEntityConfigurationRelationEntityByRelation(static::RELATION_TEST_NAME); - $childDynamicConfigurationEntity = $relationEntity->getSpyDynamicEntityConfigurationRelatedByFkChildDynamicEntityConfiguration(); - - $dynamicEntityCollectionRequestTransfer = $this->tester->createDynamicEntityCollectionRequestTransfer($dynamicEntityConfigurationEntity->getTableAlias()); - $dynamicEntityCollectionRequestTransfer - ->setResetNotProvidedFieldValues(true) - ->setIsCreatable(true) - ->addDynamicEntity( - (new DynamicEntityTransfer()) - ->setFields([ - 'id_dynamic_entity_configuration' => $dynamicConfigurationEntity->getIdDynamicEntityConfiguration(), - 'table_alias' => static::FOO_TABLE_ALIAS_2, - 'table_name' => $dynamicConfigurationEntity->getTableName(), - 'definition' => $dynamicConfigurationEntity->getDefinition(), - static::RELATION_TEST_NAME => [ - [ - 'id_dynamic_entity_configuration_relation' => $relationEntity->getIdDynamicEntityConfigurationRelation(), - 'fk_parent_dynamic_entity_configuration' => $dynamicConfigurationEntity->getIdDynamicEntityConfiguration(), - 'fk_child_dynamic_entity_configuration' => 1, - 'is_editable' => true, - 'name' => 'testme', - ], - ], - ]), - ); - - // Act - $dynamicEntityCollectionResponseTransfer = $this->dynamicEntityFacade->updateDynamicEntityCollection($dynamicEntityCollectionRequestTransfer); - - // Assert - $updatedDynamicConfigurationEntity = $this->tester->getDynamicEntityConfigurationByIdDynamicEntityConfiguration( - $childDynamicConfigurationEntity->getIdDynamicEntityConfiguration(), - ); - $this->assertEmpty($dynamicEntityCollectionResponseTransfer->getErrors()); - $this->assertNotEquals($dynamicConfigurationEntity->getTableName(), $updatedDynamicConfigurationEntity->getTableName()); - } - /** * @return void */