From 13f8a0e508d477edf6723fc9f3ea7ab1ea4c5d59 Mon Sep 17 00:00:00 2001 From: Gwendolen Lynch Date: Sun, 31 Mar 2024 13:21:57 +0200 Subject: [PATCH] fix(jsonapi): correct data path --- src/JsonApi/JsonSchema/SchemaFactory.php | 35 ++++++------------- .../JsonApi/JsonSchema/SchemaFactoryTest.php | 16 +++++---- 2 files changed, 20 insertions(+), 31 deletions(-) diff --git a/src/JsonApi/JsonSchema/SchemaFactory.php b/src/JsonApi/JsonSchema/SchemaFactory.php index f25c261b9c7..b48b91799cf 100644 --- a/src/JsonApi/JsonSchema/SchemaFactory.php +++ b/src/JsonApi/JsonSchema/SchemaFactory.php @@ -119,11 +119,7 @@ public function buildSchema(string $className, string $format = 'jsonapi', strin return $schema; } - if ('input' === $type) { - return $schema; - } - - if ($key = $schema->getRootDefinitionKey()) { + if (($key = $schema->getRootDefinitionKey()) || ($key = $schema->getItemsDefinitionKey())) { $definitions = $schema->getDefinitions(); $properties = $definitions[$key]['properties'] ?? []; @@ -132,28 +128,11 @@ public function buildSchema(string $className, string $format = 'jsonapi', strin return $schema; } - $definitions[$key]['properties'] = [ - 'data' => [ - 'type' => 'object', - 'properties' => $this->buildDefinitionPropertiesSchema($key, $className, $schema, $serializerContext), - 'required' => ['type', 'id'], - ], - ]; - - return $schema; - } - - if ($key = $schema->getItemsDefinitionKey()) { - $definitions = $schema->getDefinitions(); - $properties = $definitions[$key]['properties'] ?? []; + $definitions[$key]['properties'] = $this->buildDefinitionPropertiesSchema($key, $className, $schema, $serializerContext); - // Prevent reapplying - if (isset($properties['id'], $properties['type']) || isset($properties['data'])) { + if ($schema->getRootDefinitionKey()) { return $schema; } - - $definitions[$key]['properties'] = $this->buildDefinitionPropertiesSchema($key, $className, $schema, $serializerContext); - $definitions[$key]['required'] = ['type', 'id']; } if (($schema['type'] ?? '') === 'array') { @@ -238,7 +217,13 @@ private function buildDefinitionPropertiesSchema(string $key, string $className, unset($definitions[$key]['required']); } - return $replacement; + return [ + 'data' => [ + 'type' => 'object', + 'properties' => $replacement, + 'required' => ['type', 'id'], + ], + ]; } private function getRelationship(string $resourceClass, string $property, ?array $serializerContext): ?array diff --git a/tests/JsonApi/JsonSchema/SchemaFactoryTest.php b/tests/JsonApi/JsonSchema/SchemaFactoryTest.php index 44385b7d555..a61649fed73 100644 --- a/tests/JsonApi/JsonSchema/SchemaFactoryTest.php +++ b/tests/JsonApi/JsonSchema/SchemaFactoryTest.php @@ -149,9 +149,11 @@ public function testSchemaTypeBuildSchema(): void $this->assertArrayHasKey('$ref', $resultSchema['properties']['data']['items']); $properties = $resultSchema['definitions'][$definitionName]['properties']; - $this->assertArrayHasKey('id', $properties); - $this->assertArrayHasKey('type', $properties); - $this->assertArrayHasKey('attributes', $properties); + $this->assertArrayHasKey('data', $properties); + $this->assertArrayHasKey('properties', $properties['data']); + $this->assertArrayHasKey('id', $properties['data']['properties']); + $this->assertArrayHasKey('type', $properties['data']['properties']); + $this->assertArrayHasKey('attributes', $properties['data']['properties']); $resultSchema = $this->schemaFactory->buildSchema(Dummy::class, 'jsonapi', Schema::TYPE_OUTPUT, forceCollection: true); @@ -175,8 +177,10 @@ public function testSchemaTypeBuildSchema(): void $this->assertArrayHasKey('$ref', $resultSchema['properties']['data']['items']); $properties = $resultSchema['definitions'][$definitionName]['properties']; - $this->assertArrayHasKey('id', $properties); - $this->assertArrayHasKey('type', $properties); - $this->assertArrayHasKey('attributes', $properties); + $this->assertArrayHasKey('data', $properties); + $this->assertArrayHasKey('properties', $properties['data']); + $this->assertArrayHasKey('id', $properties['data']['properties']); + $this->assertArrayHasKey('type', $properties['data']['properties']); + $this->assertArrayHasKey('attributes', $properties['data']['properties']); } }