From 0cc3727ea965fc1dd71e9a563d496d552f611e07 Mon Sep 17 00:00:00 2001 From: Alan Poulain Date: Mon, 7 Nov 2022 18:06:28 +0100 Subject: [PATCH] fix(graphql): add filters from the nested resource metadata --- .../GraphQlNestedOperationResourceMetadataFactory.php | 9 --------- src/GraphQl/Type/FieldsBuilder.php | 4 ++++ ...GraphQlNestedOperationResourceMetadataFactoryTest.php | 1 - tests/GraphQl/Type/FieldsBuilderTest.php | 4 ++-- 4 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/GraphQl/Metadata/Factory/GraphQlNestedOperationResourceMetadataFactory.php b/src/GraphQl/Metadata/Factory/GraphQlNestedOperationResourceMetadataFactory.php index 05163b0c2b7..cb032637ab1 100644 --- a/src/GraphQl/Metadata/Factory/GraphQlNestedOperationResourceMetadataFactory.php +++ b/src/GraphQl/Metadata/Factory/GraphQlNestedOperationResourceMetadataFactory.php @@ -51,15 +51,6 @@ class: $resourceClass, shortName: $shortName ); - if (class_exists($resourceClass)) { - $refl = new \ReflectionClass($resourceClass); - $attribute = $refl->getAttributes(ApiResource::class)[0] ?? null; - $attributeInstance = $attribute?->newInstance(); - if ($filters = $attributeInstance?->getFilters()) { - $apiResource = $apiResource->withFilters($filters); - } - } - $resourceMetadataCollection[0] = $this->addDefaultGraphQlOperations($apiResource); return $resourceMetadataCollection; diff --git a/src/GraphQl/Type/FieldsBuilder.php b/src/GraphQl/Type/FieldsBuilder.php index d64f1cb800b..ee5f673d1a5 100644 --- a/src/GraphQl/Type/FieldsBuilder.php +++ b/src/GraphQl/Type/FieldsBuilder.php @@ -263,6 +263,10 @@ private function getResourceFieldConfiguration(?string $property, ?string $field // If there is no query operation for a nested resource we force one to exist $nestedResourceMetadataCollection = $this->graphQlNestedOperationResourceMetadataFactory->create($resourceClass); $resourceOperation = $nestedResourceMetadataCollection->getOperation($isCollectionType ? 'collection_query' : 'item_query'); + // Add filters from the metadata defined on the resource itself. + if ($filters = $resourceMetadataCollection[0]?->getFilters()) { + $resourceOperation = $resourceOperation->withFilters($filters); + } } } diff --git a/tests/GraphQl/Metadata/Factory/GraphQlNestedOperationResourceMetadataFactoryTest.php b/tests/GraphQl/Metadata/Factory/GraphQlNestedOperationResourceMetadataFactoryTest.php index 65c4b65c51f..3d70eca7197 100644 --- a/tests/GraphQl/Metadata/Factory/GraphQlNestedOperationResourceMetadataFactoryTest.php +++ b/tests/GraphQl/Metadata/Factory/GraphQlNestedOperationResourceMetadataFactoryTest.php @@ -38,7 +38,6 @@ public function testCreateWithResource(): void { $metadataFactory = new GraphQlNestedOperationResourceMetadataFactory(['status' => 500]); $apiResource = $metadataFactory->create(RelatedDummy::class)[0]; - $this->assertNotEmpty($apiResource->getFilters()); $this->assertEquals('RelatedDummy', $apiResource->getShortName()); } } diff --git a/tests/GraphQl/Type/FieldsBuilderTest.php b/tests/GraphQl/Type/FieldsBuilderTest.php index c5b59ad50b7..cf2cd9257f2 100644 --- a/tests/GraphQl/Type/FieldsBuilderTest.php +++ b/tests/GraphQl/Type/FieldsBuilderTest.php @@ -508,10 +508,10 @@ public function testGetResourceObjectTypeFields(string $resourceClass, Operation } if ('propertyNestedResourceNoQuery' === $propertyName) { $nestedResourceQueryOperation = new Query(); - $this->resourceMetadataCollectionFactoryProphecy->create('nestedResourceNoQueryClass')->willReturn(new ResourceMetadataCollection('nestedResourceNoQueryClass', [(new ApiResource())->withDescription('A description.')->withGraphQlOperations([])])); + $this->resourceMetadataCollectionFactoryProphecy->create('nestedResourceNoQueryClass')->willReturn(new ResourceMetadataCollection('nestedResourceNoQueryClass', [(new ApiResource())->withDescription('A description.')->withFilters(['search_filter'])->withGraphQlOperations([])])); $this->graphQlNestedOperationResourceMetadataFactoryProphecy->create('nestedResourceNoQueryClass')->shouldBeCalled()->willReturn(new ResourceMetadataCollection('nestedResourceNoQueryClass', [(new ApiResource())->withGraphQlOperations(['item_query' => $nestedResourceQueryOperation])])); $this->typeConverterProphecy->convertType(Argument::type(Type::class), Argument::type('bool'), Argument::that(static fn (Operation $arg): bool => $arg->getName() === $operation->getName()), 'nestedResourceNoQueryClass', $resourceClass, $propertyName, $depth + 1)->willReturn(new ObjectType(['name' => 'objectType'])); - $this->itemResolverFactoryProphecy->__invoke('nestedResourceNoQueryClass', $resourceClass, $nestedResourceQueryOperation)->willReturn(static function (): void { + $this->itemResolverFactoryProphecy->__invoke('nestedResourceNoQueryClass', $resourceClass, $nestedResourceQueryOperation->withFilters(['search_filter']))->willReturn(static function (): void { }); } }