Skip to content

Commit

Permalink
Merge ea7ab65 into 28bfdf9
Browse files Browse the repository at this point in the history
  • Loading branch information
alanpoulain committed Jun 3, 2020
2 parents 28bfdf9 + ea7ab65 commit 7384382
Show file tree
Hide file tree
Showing 19 changed files with 187 additions and 57 deletions.
52 changes: 47 additions & 5 deletions features/graphql/input_output.feature
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,14 @@ Feature: GraphQL DTO input and output

@createSchema
Scenario: Retrieve an Output with GraphQL
Given there is a RelatedDummy with 0 friends
When I add "Content-Type" header equal to "application/ld+json"
And I send a "POST" request to "/dummy_dto_input_outputs" with body:
"""
{
"foo": "test",
"bar": 1
"bar": 1,
"relatedDummies": ["/related_dummies/1"]
}
"""
Then the response status code should be 201
Expand All @@ -22,20 +24,51 @@ Feature: GraphQL DTO input and output
"hydra": "http://www.w3.org/ns/hydra/core#",
"id": "OutputDto/id",
"baz": "OutputDto/baz",
"bat": "OutputDto/bat"
"bat": "OutputDto/bat",
"relatedDummies": "OutputDto/relatedDummies"
},
"@type": "DummyDtoInputOutput",
"@id": "/dummy_dto_input_outputs/1",
"id": 1,
"baz": 1,
"bat": "test"
"bat": "test",
"relatedDummies": [
{
"@context": "/contexts/RelatedDummy",
"@id": "/related_dummies/1",
"@type": "https://schema.org/Product",
"name": "RelatedDummy with friends",
"dummyDate": null,
"thirdLevel": null,
"relatedToDummyFriend": [],
"dummyBoolean": null,
"embeddedDummy": {
"dummyName": null,
"dummyBoolean": null,
"dummyDate": null,
"dummyFloat": null,
"dummyPrice": null,
"symfony": null
},
"id": 1,
"symfony": "symfony",
"age": null
}
]
}
"""
When I send the following GraphQL request:
"""
{
dummyDtoInputOutput(id: "/dummy_dto_input_outputs/1") {
_id, id, baz
_id, id, baz,
relatedDummies {
edges {
node {
name
}
}
}
}
}
"""
Expand All @@ -49,7 +82,16 @@ Feature: GraphQL DTO input and output
"dummyDtoInputOutput": {
"_id": 1,
"id": "/dummy_dto_input_outputs/1",
"baz": 1
"baz": 1,
"relatedDummies": {
"edges": [
{
"node": {
"name": "RelatedDummy with friends"
}
}
]
}
}
}
}
Expand Down
24 changes: 16 additions & 8 deletions features/jsonld/input_output.feature
Original file line number Diff line number Diff line change
Expand Up @@ -151,13 +151,15 @@ Feature: JSON-LD DTO input and output
"hydra": "http://www.w3.org/ns/hydra/core#",
"id": "OutputDto/id",
"baz": "OutputDto/baz",
"bat": "OutputDto/bat"
"bat": "OutputDto/bat",
"relatedDummies": "OutputDto/relatedDummies"
},
"@type": "DummyDtoInputOutput",
"@id": "/dummy_dto_input_outputs/1",
"id": 1,
"baz": 1,
"bat": "test"
"bat": "test",
"relatedDummies": []
}
"""
When I add "Accept" header equal to "application/ld+json"
Expand All @@ -178,13 +180,15 @@ Feature: JSON-LD DTO input and output
"hydra": "http://www.w3.org/ns/hydra/core#",
"id": "OutputDto/id",
"baz": "OutputDto/baz",
"bat": "OutputDto/bat"
"bat": "OutputDto/bat",
"relatedDummies": "OutputDto/relatedDummies"
},
"@type": "DummyDtoInputOutput",
"@id": "/dummy_dto_input_outputs/1",
"id": 1,
"baz": 2,
"bat": "test"
"bat": "test",
"relatedDummies": []
}
"""

Expand Down Expand Up @@ -237,13 +241,15 @@ Feature: JSON-LD DTO input and output
"hydra": "http://www.w3.org/ns/hydra/core#",
"id": "OutputDto/id",
"baz": "OutputDto/baz",
"bat": "OutputDto/bat"
"bat": "OutputDto/bat",
"relatedDummies": "OutputDto/relatedDummies"
},
"@type": "DummyDtoNoInput",
"@id": "/dummy_dto_no_inputs/1",
"id": 1,
"baz": 1,
"bat": "test"
"bat": "test",
"relatedDummies": []
}
"""

Expand All @@ -260,13 +266,15 @@ Feature: JSON-LD DTO input and output
"hydra": "http://www.w3.org/ns/hydra/core#",
"id": "OutputDto/id",
"baz": "OutputDto/baz",
"bat": "OutputDto/bat"
"bat": "OutputDto/bat",
"relatedDummies": "OutputDto/relatedDummies"
},
"@type": "DummyDtoNoInput",
"@id": "/dummy_dto_no_inputs/1",
"id": 1,
"baz": 1,
"bat": "testtest"
"bat": "testtest",
"relatedDummies": []
}
"""

Expand Down
9 changes: 5 additions & 4 deletions src/GraphQl/Resolver/Stage/ReadStage.php
Original file line number Diff line number Diff line change
Expand Up @@ -92,9 +92,10 @@ public function __invoke(?string $resourceClass, ?string $rootClass, string $ope
$normalizationContext['filters'] = $this->getNormalizedFilters($args);

$source = $context['source'];
if (isset($source[$rootProperty = $info->fieldName], $source[ItemNormalizer::ITEM_IDENTIFIERS_KEY])) {
if (isset($source[$rootProperty = $info->fieldName], $source[ItemNormalizer::ITEM_IDENTIFIERS_KEY], $source[ItemNormalizer::ITEM_RESOURCE_CLASS_KEY])) {
$rootResolvedFields = $source[ItemNormalizer::ITEM_IDENTIFIERS_KEY];
$subresourceCollection = $this->getSubresource($rootClass, $rootResolvedFields, $rootProperty, $resourceClass, $normalizationContext, $operationName);
$rootResolvedClass = $source[ItemNormalizer::ITEM_RESOURCE_CLASS_KEY];
$subresourceCollection = $this->getSubresource($rootResolvedClass, $rootResolvedFields, $rootProperty, $resourceClass, $normalizationContext, $operationName);
if (!is_iterable($subresourceCollection)) {
throw new \UnexpectedValueException('Expected subresource collection to be iterable');
}
Expand Down Expand Up @@ -158,12 +159,12 @@ private function getNormalizedFilters(array $args): array
/**
* @return iterable|object|null
*/
private function getSubresource(string $rootClass, array $rootResolvedFields, string $rootProperty, string $subresourceClass, array $normalizationContext, string $operationName)
private function getSubresource(string $rootResolvedClass, array $rootResolvedFields, string $rootProperty, string $subresourceClass, array $normalizationContext, string $operationName)
{
$resolvedIdentifiers = [];
$rootIdentifiers = array_keys($rootResolvedFields);
foreach ($rootIdentifiers as $rootIdentifier) {
$resolvedIdentifiers[] = [$rootIdentifier, $rootClass];
$resolvedIdentifiers[] = [$rootIdentifier, $rootResolvedClass];
}

return $this->subresourceDataProvider->getSubresource($subresourceClass, $rootResolvedFields, $normalizationContext + [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

use ApiPlatform\Core\DataPersister\DataPersisterInterface;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\DummyDtoNoOutput as DummyDtoNoOutputDocument;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\Document\InputDto as InputDtoDocument;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\InputDto;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\DummyDtoNoOutput;
use Doctrine\Common\Persistence\ManagerRegistry;
Expand All @@ -33,7 +34,7 @@ public function __construct(ManagerRegistry $registry)
*/
public function supports($data): bool
{
return $data instanceof InputDto;
return $data instanceof InputDto || $data instanceof InputDtoDocument;
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
use ApiPlatform\Core\DataProvider\ContextAwareCollectionDataProviderInterface;
use ApiPlatform\Core\DataProvider\RestrictedDataProviderInterface;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\DummyDtoNoInput as DummyDtoNoInputDocument;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\Document\OutputDto as OutputDtoDocument;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\OutputDto;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\DummyDtoNoInput;
use Doctrine\Common\Persistence\ManagerRegistry;
Expand Down Expand Up @@ -50,7 +51,7 @@ public function getCollection(string $resourceClass, string $operationName = nul
$dummyDtos = $this->registry->getManagerForClass($resourceClass)->getRepository($resourceClass)->findAll();
$objects = [];
foreach ($dummyDtos as $dummyDto) {
$object = new OutputDto();
$object = DummyDtoNoInput::class === $resourceClass ? new OutputDto() : new OutputDtoDocument();
$object->bat = $dummyDto->lorem;
$object->baz = $dummyDto->ipsum;
$objects[] = $object;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,7 @@
use ApiPlatform\Core\DataProvider\RestrictedDataProviderInterface;
use ApiPlatform\Core\DataProvider\SerializerAwareDataProviderInterface;
use ApiPlatform\Core\DataProvider\SerializerAwareDataProviderTrait;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\SerializableResource as SerializableResourceDocument;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\SerializableResource;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Model\SerializableResource;

/**
* @author Vincent Chalamon <vincentchalamon@gmail.com>
Expand Down Expand Up @@ -47,6 +46,6 @@ public function getItem(string $resourceClass, $id, string $operationName = null
*/
public function supports(string $resourceClass, string $operationName = null, array $context = []): bool
{
return \in_array($resourceClass, [SerializableResource::class, SerializableResourceDocument::class], true);
return SerializableResource::class === $resourceClass;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

use ApiPlatform\Core\DataTransformer\DataTransformerInterface;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\DummyDtoNoInput as DummyDtoNoInputDocument;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\Document\OutputDto as OutputDtoDocument;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\OutputDto;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\DummyDtoNoInput;

Expand All @@ -29,7 +30,7 @@ public function transform($object, string $to, array $context = [])
throw new \InvalidArgumentException();
}

$output = new OutputDto();
$output = $object instanceof DummyDtoNoInput ? new OutputDto() : new OutputDtoDocument();
$output->id = $object->getId();
$output->bat = (string) $object->lorem;
$output->baz = (float) $object->ipsum;
Expand All @@ -42,6 +43,6 @@ public function transform($object, string $to, array $context = [])
*/
public function supportsTransformation($data, string $to, array $context = []): bool
{
return ($data instanceof DummyDtoNoInput || $data instanceof DummyDtoNoInputDocument) && OutputDto::class === $to;
return ($data instanceof DummyDtoNoInput || $data instanceof DummyDtoNoInputDocument) && \in_array($to, [OutputDto::class, OutputDtoDocument::class], true);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
use ApiPlatform\Core\DataTransformer\DataTransformerInterface;
use ApiPlatform\Core\Serializer\AbstractItemNormalizer;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\DummyDtoInputOutput as DummyDtoInputOutputDocument;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\Document\InputDto as InputDtoDocument;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\InputDto;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\DummyDtoInputOutput;

Expand All @@ -27,16 +28,17 @@ final class InputDtoDataTransformer implements DataTransformerInterface
public function transform($object, string $to, array $context = [])
{
/**
* @var \ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\InputDto
* @var InputDtoDocument|InputDto
*/
$data = $object;

/**
* @var \ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\DummyDtoInputOutput
* @var DummyDtoInputOutputDocument|DummyDtoInputOutput
*/
$resourceObject = $context[AbstractItemNormalizer::OBJECT_TO_POPULATE] ?? new $context['resource_class']();
$resourceObject->str = $data->foo;
$resourceObject->num = $data->bar;
$resourceObject->relatedDummies = $data->relatedDummies;

return $resourceObject;
}
Expand All @@ -50,6 +52,6 @@ public function supportsTransformation($object, string $to, array $context = [])
return false;
}

return (DummyDtoInputOutput::class === $to || DummyDtoInputOutputDocument::class === $to) && (InputDto::class === $context['input']['class']);
return \in_array($to, [DummyDtoInputOutput::class, DummyDtoInputOutputDocument::class], true) && \in_array($context['input']['class'], [InputDto::class, InputDtoDocument::class], true);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,10 @@

namespace ApiPlatform\Core\Tests\Fixtures\TestBundle\DataTransformer;

use ApiPlatform\Core\DataProvider\ArrayPaginator;
use ApiPlatform\Core\DataTransformer\DataTransformerInterface;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\DummyDtoInputOutput as DummyDtoInputOutputDocument;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\Document\OutputDto as OutputDtoDocument;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\OutputDto;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\DummyDtoInputOutput;

Expand All @@ -29,10 +31,11 @@ public function transform($object, string $to, array $context = [])
throw new \InvalidArgumentException();
}

$output = new OutputDto();
$output = $object instanceof DummyDtoInputOutput ? new OutputDto() : new OutputDtoDocument();
$output->id = $object->id;
$output->bat = (string) $object->str;
$output->baz = (float) $object->num;
$output->relatedDummies = new ArrayPaginator($object->relatedDummies->toArray(), 0, count($object->relatedDummies->toArray()));

return $output;
}
Expand All @@ -42,6 +45,6 @@ public function transform($object, string $to, array $context = [])
*/
public function supportsTransformation($data, string $to, array $context = []): bool
{
return ($data instanceof DummyDtoInputOutput || $data instanceof DummyDtoInputOutputDocument) && OutputDto::class === $to;
return ($data instanceof DummyDtoInputOutput || $data instanceof DummyDtoInputOutputDocument) && \in_array($to, [OutputDto::class, OutputDtoDocument::class], true);
}
}
17 changes: 15 additions & 2 deletions tests/Fixtures/TestBundle/Document/DummyDtoInputOutput.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,10 @@
namespace ApiPlatform\Core\Tests\Fixtures\TestBundle\Document;

use ApiPlatform\Core\Annotation\ApiResource;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\InputDto;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\OutputDto;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\Document\InputDto;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\Document\OutputDto;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;

/**
Expand All @@ -28,6 +30,11 @@
*/
class DummyDtoInputOutput
{
public function __construct()
{
$this->relatedDummies = new ArrayCollection();
}

/**
* @var int The id
* @ODM\Id(strategy="INCREMENT", type="integer", nullable=true)
Expand All @@ -45,4 +52,10 @@ class DummyDtoInputOutput
* @ODM\Field(type="float")
*/
public $num;

/**
* @var Collection<RelatedDummy>
* @ODM\ReferenceMany(targetDocument=RelatedDummy::class, storeAs="id", nullable=true)
*/
public $relatedDummies;
}
2 changes: 1 addition & 1 deletion tests/Fixtures/TestBundle/Document/DummyDtoNoInput.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
use ApiPlatform\Core\Annotation\ApiResource;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Controller\DummyDtoNoInput\CreateItemAction;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Controller\DummyDtoNoInput\DoubleBatAction;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\OutputDto;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\Document\OutputDto;
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;

/**
Expand Down

0 comments on commit 7384382

Please sign in to comment.