Skip to content

Commit ba1c61f

Browse files
fix(jsonapi): correct data path (#6273)
1 parent da324e4 commit ba1c61f

File tree

2 files changed

+20
-31
lines changed

2 files changed

+20
-31
lines changed

src/JsonApi/JsonSchema/SchemaFactory.php

Lines changed: 10 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -119,11 +119,7 @@ public function buildSchema(string $className, string $format = 'jsonapi', strin
119119
return $schema;
120120
}
121121

122-
if ('input' === $type) {
123-
return $schema;
124-
}
125-
126-
if ($key = $schema->getRootDefinitionKey()) {
122+
if (($key = $schema->getRootDefinitionKey()) || ($key = $schema->getItemsDefinitionKey())) {
127123
$definitions = $schema->getDefinitions();
128124
$properties = $definitions[$key]['properties'] ?? [];
129125

@@ -132,28 +128,11 @@ public function buildSchema(string $className, string $format = 'jsonapi', strin
132128
return $schema;
133129
}
134130

135-
$definitions[$key]['properties'] = [
136-
'data' => [
137-
'type' => 'object',
138-
'properties' => $this->buildDefinitionPropertiesSchema($key, $className, $schema, $serializerContext),
139-
'required' => ['type', 'id'],
140-
],
141-
];
142-
143-
return $schema;
144-
}
145-
146-
if ($key = $schema->getItemsDefinitionKey()) {
147-
$definitions = $schema->getDefinitions();
148-
$properties = $definitions[$key]['properties'] ?? [];
131+
$definitions[$key]['properties'] = $this->buildDefinitionPropertiesSchema($key, $className, $schema, $serializerContext);
149132

150-
// Prevent reapplying
151-
if (isset($properties['id'], $properties['type']) || isset($properties['data'])) {
133+
if ($schema->getRootDefinitionKey()) {
152134
return $schema;
153135
}
154-
155-
$definitions[$key]['properties'] = $this->buildDefinitionPropertiesSchema($key, $className, $schema, $serializerContext);
156-
$definitions[$key]['required'] = ['type', 'id'];
157136
}
158137

159138
if (($schema['type'] ?? '') === 'array') {
@@ -238,7 +217,13 @@ private function buildDefinitionPropertiesSchema(string $key, string $className,
238217
unset($definitions[$key]['required']);
239218
}
240219

241-
return $replacement;
220+
return [
221+
'data' => [
222+
'type' => 'object',
223+
'properties' => $replacement,
224+
'required' => ['type', 'id'],
225+
],
226+
];
242227
}
243228

244229
private function getRelationship(string $resourceClass, string $property, ?array $serializerContext): ?array

tests/JsonApi/JsonSchema/SchemaFactoryTest.php

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -149,9 +149,11 @@ public function testSchemaTypeBuildSchema(): void
149149
$this->assertArrayHasKey('$ref', $resultSchema['properties']['data']['items']);
150150

151151
$properties = $resultSchema['definitions'][$definitionName]['properties'];
152-
$this->assertArrayHasKey('id', $properties);
153-
$this->assertArrayHasKey('type', $properties);
154-
$this->assertArrayHasKey('attributes', $properties);
152+
$this->assertArrayHasKey('data', $properties);
153+
$this->assertArrayHasKey('properties', $properties['data']);
154+
$this->assertArrayHasKey('id', $properties['data']['properties']);
155+
$this->assertArrayHasKey('type', $properties['data']['properties']);
156+
$this->assertArrayHasKey('attributes', $properties['data']['properties']);
155157

156158
$resultSchema = $this->schemaFactory->buildSchema(Dummy::class, 'jsonapi', Schema::TYPE_OUTPUT, forceCollection: true);
157159

@@ -175,8 +177,10 @@ public function testSchemaTypeBuildSchema(): void
175177
$this->assertArrayHasKey('$ref', $resultSchema['properties']['data']['items']);
176178

177179
$properties = $resultSchema['definitions'][$definitionName]['properties'];
178-
$this->assertArrayHasKey('id', $properties);
179-
$this->assertArrayHasKey('type', $properties);
180-
$this->assertArrayHasKey('attributes', $properties);
180+
$this->assertArrayHasKey('data', $properties);
181+
$this->assertArrayHasKey('properties', $properties['data']);
182+
$this->assertArrayHasKey('id', $properties['data']['properties']);
183+
$this->assertArrayHasKey('type', $properties['data']['properties']);
184+
$this->assertArrayHasKey('attributes', $properties['data']['properties']);
181185
}
182186
}

0 commit comments

Comments
 (0)