Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@

namespace ApiPlatform\Doctrine\Odm\Metadata\Resource;

use ApiPlatform\Doctrine\Odm\State\Options;
use ApiPlatform\Metadata\Operation;
use ApiPlatform\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface;
use ApiPlatform\Metadata\Resource\ResourceMetadataCollection;
Expand Down Expand Up @@ -79,7 +78,7 @@ private function enrichOperation(Operation $operation, string $resourceClass): O
return $operation;
}

$documentClass = $this->getStateOptionsClass($operation, $operation->getClass(), Options::class);
$documentClass = $operation->getDataClass();
if (!$this->managerRegistry->getManagerForClass($documentClass) instanceof DocumentManager) {
return $operation;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public function create(string $resourceClass): ResourceMetadataCollection

if ($operations) {
foreach ($resourceMetadata->getOperations() as $operationName => $operation) {
$documentClass = $this->getStateOptionsClass($operation, $operation->getClass(), Options::class);
$documentClass = $operation->getDataClass();
if (!$this->managerRegistry->getManagerForClass($documentClass) instanceof DocumentManager) {
continue;
}
Expand All @@ -62,7 +62,7 @@ public function create(string $resourceClass): ResourceMetadataCollection

if ($graphQlOperations) {
foreach ($graphQlOperations as $operationName => $graphQlOperation) {
$documentClass = $this->getStateOptionsClass($graphQlOperation, $graphQlOperation->getClass(), Options::class);
$documentClass = $graphQlOperation->getDataClass();
if (!$this->managerRegistry->getManagerForClass($documentClass) instanceof DocumentManager) {
continue;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public function resolve(object|string $resource, Operation $operation): string

// Validate object matches the backing document class
if ($documentClass && is_a($objectClass, $documentClass, true)) {
return $operation->getClass();
return $operation->getApiClass();
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/Doctrine/Odm/State/CollectionProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public function __construct(ResourceMetadataCollectionFactoryInterface $resource

public function provide(Operation $operation, array $uriVariables = [], array $context = []): iterable
{
$documentClass = $this->getStateOptionsClass($operation, $operation->getClass(), Options::class);
$documentClass = $operation->getDataClass();

/** @var DocumentManager $manager */
$manager = $this->managerRegistry->getManagerForClass($documentClass);
Expand Down
2 changes: 1 addition & 1 deletion src/Doctrine/Odm/State/ItemProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public function __construct(ResourceMetadataCollectionFactoryInterface $resource

public function provide(Operation $operation, array $uriVariables = [], array $context = []): ?object
{
$documentClass = $this->getStateOptionsClass($operation, $operation->getClass(), Options::class);
$documentClass = $operation->getDataClass();

/** @var DocumentManager $manager */
$manager = $this->managerRegistry->getManagerForClass($documentClass);
Expand Down
6 changes: 3 additions & 3 deletions src/Doctrine/Odm/State/LinksHandlerTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -133,15 +133,15 @@ private function buildAggregation(string $toClass, array $links, array $identifi

private function getLinkFromClass(Link $link, Operation $operation): string
{
$documentClass = $this->getStateOptionsClass($operation, $operation->getClass(), Options::class);
$documentClass = $operation->getDataClass();
$fromClass = $link->getFromClass();
if ($fromClass === $operation->getClass() && $documentClass) {
if ($fromClass === $operation->getApiClass() && $documentClass) {
return $documentClass;
}

$operation = $this->resourceMetadataCollectionFactory->create($fromClass)->getOperation();

if ($documentClass = $this->getStateOptionsClass($operation, null, Options::class)) {
if ($documentClass = $operation->getDataClass()) {
return $documentClass;
}

Expand Down
9 changes: 7 additions & 2 deletions src/Doctrine/Odm/State/Options.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@
namespace ApiPlatform\Doctrine\Odm\State;

use ApiPlatform\Doctrine\Common\State\Options as CommonOptions;
use ApiPlatform\State\OptionsInterface;
use ApiPlatform\State\DataOptionsInterface;

class Options extends CommonOptions implements OptionsInterface
class Options extends CommonOptions implements DataOptionsInterface
{
/**
* @param mixed $handleLinks experimental callable, typed mixed as we may want a service name in the future
Expand All @@ -30,6 +30,11 @@ public function __construct(
parent::__construct(handleLinks: $handleLinks);
}

public function getDataClass(): ?string
{
return $this->documentClass;
}

public function getDocumentClass(): ?string
{
return $this->documentClass;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ private function getResourceMetadataCollectionFactory(HttpOperation $operation)
}

$resourceMetadataCollectionFactory = $this->prophesize(ResourceMetadataCollectionFactoryInterface::class);
$resourceMetadataCollectionFactory->create($operation->getClass())->willReturn(new ResourceMetadataCollection($operation->getClass(), [
$resourceMetadataCollectionFactory->create($operation->getApiClass())->willReturn(new ResourceMetadataCollection($operation->getApiClass(), [
(new ApiResource())
->withOperations(
new Operations([$operation->getName() => $operation])
Expand Down Expand Up @@ -80,9 +80,9 @@ public function testWithProvider(HttpOperation $operation, ?string $expectedProv

$objectManager = $this->prophesize(DocumentManager::class);
$managerRegistry = $this->prophesize(ManagerRegistry::class);
$managerRegistry->getManagerForClass($operation->getClass())->willReturn($objectManager->reveal());
$managerRegistry->getManagerForClass($operation->getApiClass())->willReturn($objectManager->reveal());
$resourceMetadataCollectionFactory = new DoctrineMongoDbOdmResourceCollectionMetadataFactory($managerRegistry->reveal(), $this->getResourceMetadataCollectionFactory($operation));
$resourceMetadataCollection = $resourceMetadataCollectionFactory->create($operation->getClass());
$resourceMetadataCollection = $resourceMetadataCollectionFactory->create($operation->getApiClass());
$this->assertSame($expectedProvider, $resourceMetadataCollection->getOperation($operation->getName())->getProvider());
$this->assertSame($expectedProvider, $resourceMetadataCollection->getOperation('graphql_'.$operation->getName())->getProvider());
$this->assertSame($expectedProcessor, $resourceMetadataCollection->getOperation($operation->getName())->getProcessor());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public function createLinksFromRelations(Metadata $operation): array
{
$links = $this->linkFactory->createLinksFromRelations($operation);

$resourceClass = $operation->getClass();
$resourceClass = $operation->getDataClass();
if (!($manager = $this->managerRegistry->getManagerForClass($resourceClass)) instanceof EntityManagerInterface) {
return $links;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@

namespace ApiPlatform\Doctrine\Orm\Metadata\Resource;

use ApiPlatform\Doctrine\Orm\State\Options;
use ApiPlatform\Metadata\Operation;
use ApiPlatform\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface;
use ApiPlatform\Metadata\Resource\ResourceMetadataCollection;
Expand Down Expand Up @@ -77,7 +76,7 @@ private function enrichOperation(Operation $operation, string $resourceClass): O
return $operation;
}

$entityClass = $this->getStateOptionsClass($operation, $operation->getClass(), Options::class);
$entityClass = $operation->getDataClass();
if (!$this->managerRegistry->getManagerForClass($entityClass) instanceof EntityManagerInterface) {
return $operation;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public function create(string $resourceClass): ResourceMetadataCollection

if ($operations) {
foreach ($operations as $operationName => $operation) {
$entityClass = $this->getStateOptionsClass($operation, $operation->getClass(), Options::class);
$entityClass = $operation->getDataClass();

$manager = $this->managerRegistry->getManagerForClass($entityClass);
if (!$manager instanceof EntityManagerInterface) {
Expand All @@ -74,7 +74,7 @@ public function create(string $resourceClass): ResourceMetadataCollection

if ($graphQlOperations) {
foreach ($graphQlOperations as $operationName => $graphQlOperation) {
$entityClass = $this->getStateOptionsClass($graphQlOperation, $graphQlOperation->getClass(), Options::class);
$entityClass = $graphQlOperation->getDataClass();

if (!$this->managerRegistry->getManagerForClass($entityClass) instanceof EntityManagerInterface) {
continue;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public function resolve(object|string $resource, Operation $operation): string

// Validate object matches the backing entity class
if ($entityClass && is_a($objectClass, $entityClass, true)) {
return $operation->getClass();
return $operation->getApiClass();
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/Doctrine/Orm/State/CollectionProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public function __construct(ResourceMetadataCollectionFactoryInterface $resource

public function provide(Operation $operation, array $uriVariables = [], array $context = []): iterable
{
$entityClass = $this->getStateOptionsClass($operation, $operation->getClass(), Options::class);
$entityClass = $operation->getDataClass();

/** @var EntityManagerInterface $manager */
$manager = $this->managerRegistry->getManagerForClass($entityClass);
Expand Down
2 changes: 1 addition & 1 deletion src/Doctrine/Orm/State/ItemProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public function __construct(ResourceMetadataCollectionFactoryInterface $resource

public function provide(Operation $operation, array $uriVariables = [], array $context = []): ?object
{
$entityClass = $this->getStateOptionsClass($operation, $operation->getClass(), Options::class);
$entityClass = $operation->getDataClass();

/** @var EntityManagerInterface|null $manager */
$manager = $this->managerRegistry->getManagerForClass($entityClass);
Expand Down
4 changes: 2 additions & 2 deletions src/Doctrine/Orm/State/LinksHandlerTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -172,12 +172,12 @@ private function handleLinks(QueryBuilder $queryBuilder, array $identifiers, Que
private function getLinkFromClass(Link $link, Operation $operation): string
{
$fromClass = $link->getFromClass();
if ($fromClass === $operation->getClass() && $entityClass = $this->getStateOptionsClass($operation, $operation->getClass(), Options::class)) {
if ($fromClass === $operation->getApiClass() && $entityClass = $operation->getDataClass()) {
return $entityClass;
}

$operation = $this->resourceMetadataCollectionFactory->create($fromClass)->getOperation();

return $this->getStateOptionsClass($operation, $operation->getClass(), Options::class);
return $operation->getDataClass();
}
}
9 changes: 7 additions & 2 deletions src/Doctrine/Orm/State/Options.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@
namespace ApiPlatform\Doctrine\Orm\State;

use ApiPlatform\Doctrine\Common\State\Options as CommonOptions;
use ApiPlatform\State\OptionsInterface;
use ApiPlatform\State\DataOptionsInterface;

class Options extends CommonOptions implements OptionsInterface
class Options extends CommonOptions implements DataOptionsInterface
{
/**
* @param string|callable $handleLinks experimental callable, typed mixed as we may want a service name in the future
Expand All @@ -30,6 +30,11 @@ public function __construct(
parent::__construct(handleLinks: $handleLinks);
}

public function getDataClass(): ?string
{
return $this->entityClass;
}

public function getEntityClass(): ?string
{
return $this->entityClass;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ class DoctrineOrmResourceCollectionMetadataFactoryTest extends TestCase
private function getResourceMetadataCollectionFactory(HttpOperation $operation)
{
$resourceMetadataCollectionFactory = $this->prophesize(ResourceMetadataCollectionFactoryInterface::class);
$resourceMetadataCollectionFactory->create($operation->getClass())->willReturn(new ResourceMetadataCollection($operation->getClass(), [
$resourceMetadataCollectionFactory->create($operation->getDataClass())->willReturn(new ResourceMetadataCollection($operation->getApiClass(), [
(new ApiResource())
->withOperations(
new Operations([$operation->getName() => $operation])
Expand Down Expand Up @@ -72,11 +72,11 @@ public function testWithoutManager(): void
public function testWithProvider(HttpOperation $operation, ?string $expectedProvider = null, ?string $expectedProcessor = null): void
{
$objectManager = $this->prophesize(EntityManagerInterface::class);
$objectManager->getClassMetadata($operation->getClass())->willReturn(new ClassMetadata(Dummy::class));
$objectManager->getClassMetadata($operation->getDataClass())->willReturn(new ClassMetadata(Dummy::class));
$managerRegistry = $this->prophesize(ManagerRegistry::class);
$managerRegistry->getManagerForClass($operation->getClass())->willReturn($objectManager->reveal());
$managerRegistry->getManagerForClass($operation->getDataClass())->willReturn($objectManager->reveal());
$resourceMetadataCollectionFactory = new DoctrineOrmResourceCollectionMetadataFactory($managerRegistry->reveal(), $this->getResourceMetadataCollectionFactory($operation));
$resourceMetadataCollection = $resourceMetadataCollectionFactory->create($operation->getClass());
$resourceMetadataCollection = $resourceMetadataCollectionFactory->create($operation->getDataClass());
$this->assertSame($expectedProvider, $resourceMetadataCollection->getOperation($operation->getName())->getProvider());
$this->assertSame($expectedProvider, $resourceMetadataCollection->getOperation('graphql_'.$operation->getName())->getProvider());
$this->assertSame($expectedProcessor, $resourceMetadataCollection->getOperation($operation->getName())->getProcessor());
Expand Down
2 changes: 1 addition & 1 deletion src/Elasticsearch/State/CollectionProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public function __construct(
*/
public function provide(Operation $operation, array $uriVariables = [], array $context = []): Paginator
{
$resourceClass = $operation->getClass();
$resourceClass = $operation->getDataClass();
$body = [];

foreach ($this->collectionExtensions as $collectionExtension) {
Expand Down
2 changes: 1 addition & 1 deletion src/Elasticsearch/State/ItemProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ public function __construct(
*/
public function provide(Operation $operation, array $uriVariables = [], array $context = []): ?object
{
$resourceClass = $operation->getClass();
$resourceClass = $operation->getDataClass();
$options = $operation->getStateOptions();
if (!$options instanceof Options) {
$options = new Options(index: $this->getIndex($operation));
Expand Down
2 changes: 1 addition & 1 deletion src/GraphQl/Serializer/ItemNormalizer.php
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ public function normalize(mixed $data, ?string $format = null, array $context =

if ($this->getOutputClass($context)) {
$context['graphql_identifiers'] = [
self::ITEM_RESOURCE_CLASS_KEY => $context['operation']->getClass(),
self::ITEM_RESOURCE_CLASS_KEY => $context['operation']->getApiClass(),
self::ITEM_IDENTIFIERS_KEY => $this->identifiersExtractor->getIdentifiersFromItem($data, $context['operation'] ?? null),
];

Expand Down
12 changes: 7 additions & 5 deletions src/GraphQl/Serializer/SerializerContextBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,16 +40,18 @@ public function create(?string $resourceClass, Operation $operation, array $reso
}

$context['operation'] = $operation;
if ($operation->getInput()) {
$context['input'] = $operation->getInput();
$apiClass = $operation->getApiClass();
$dataClass = $operation->getDataClass();
if (null !== ($inputClass = $operation->getInputClass()) && $inputClass !== $apiClass) {
$context['input'] = ['class' => $inputClass];
}
if ($operation->getOutput()) {
$context['output'] = $operation->getOutput();
if (null !== ($outputClass = $operation->getOutputClass()) && $outputClass !== $apiClass) {
$context['output'] = ['class' => $outputClass];
}
$context = $normalization ? array_merge($operation->getNormalizationContext() ?? [], $context) : array_merge($operation->getDenormalizationContext() ?? [], $context);

if ($normalization) {
$context['attributes'] = $this->fieldsToAttributes($resourceClass, $operation, $resolverContext, $context);
$context['attributes'] = $this->fieldsToAttributes($dataClass, $operation, $resolverContext, $context);
}

// to keep the cache computation smaller, we have "operation_name" and "iri" anyways
Expand Down
2 changes: 1 addition & 1 deletion src/GraphQl/State/Processor/NormalizeProcessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ private function getData(mixed $itemOrCollection, GraphQlOperation $operation, a
return null;
}

$normalizationContext = $this->serializerContextBuilder->create($operation->getClass(), $operation, $context, normalization: true);
$normalizationContext = $this->serializerContextBuilder->create($operation->getApiClass(), $operation, $context, normalization: true);

$data = null;
if (!$operation instanceof CollectionOperationInterface) {
Expand Down
4 changes: 2 additions & 2 deletions src/GraphQl/State/Provider/DenormalizeProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,13 +41,13 @@ public function provide(Operation $operation, array $uriVariables = [], array $c
return $data;
}

$denormalizationContext = $this->serializerContextBuilder->create($operation->getClass(), $operation, $context, normalization: false);
$denormalizationContext = $this->serializerContextBuilder->create($operation->getApiClass(), $operation, $context, normalization: false);

if (null !== $data) {
$denormalizationContext[AbstractNormalizer::OBJECT_TO_POPULATE] = $data;
}

$item = $this->denormalizer->denormalize($context['args']['input'], $operation->getClass(), ItemNormalizer::FORMAT, $denormalizationContext);
$item = $this->denormalizer->denormalize($context['args']['input'], $operation->getInputClass(), ItemNormalizer::FORMAT, $denormalizationContext);

if (!\is_object($item)) {
throw new \UnexpectedValueException('Expected item to be an object.');
Expand Down
4 changes: 2 additions & 2 deletions src/GraphQl/State/Provider/ReadProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public function provide(Operation $operation, array $uriVariables = [], array $c

if ($this->serializerContextBuilder) {
// Builtin data providers are able to use the serialization context to automatically add join clauses
$context += $this->serializerContextBuilder->create($operation->getClass(), $operation, $context, true);
$context += $this->serializerContextBuilder->create($operation->getApiClass(), $operation, $context, true);
}

if (!$operation instanceof CollectionOperationInterface) {
Expand All @@ -78,7 +78,7 @@ public function provide(Operation $operation, array $uriVariables = [], array $c
throw new NotFoundHttpException(\sprintf('Item "%s" not found.', $args['input']['id']));
}

if ($operation->getClass() !== $this->getObjectClass($item)) {
if ($operation->getDataClass() !== $this->getObjectClass($item)) {
throw new \UnexpectedValueException(\sprintf('Item "%s" did not match expected type "%s".', $args['input']['id'], $operation->getShortName()));
}
}
Expand Down
Loading
Loading