Skip to content

Commit 83afa98

Browse files
authored
Merge pull request #42 from DoclerLabs/fix-mapping-nullable-mandatory-ref
Fix mapping nullable mandatory ref
2 parents af53a2d + 9db6be2 commit 83afa98

File tree

4 files changed

+37
-9
lines changed

4 files changed

+37
-9
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
44
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
55
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
66

7+
## [5.7.1] - 2021-05-31
8+
### Fixed
9+
- `nullable: true` for mandatory $ref was not checking for null before trying to map
10+
711
## [5.7.0] - 2021-05-28
812
### Added
913
- Support for `application/vnd.api+json` MIME type.

src/Generator/SchemaMapperGenerator.php

+17-5
Original file line numberDiff line numberDiff line change
@@ -268,11 +268,23 @@ protected function generateMapStatementsForObject(Field $root, Variable $payload
268268
foreach ($requiredFields as $i => $field) {
269269
/** @var Field $field */
270270
if ($field->isComposite()) {
271-
$requiredVars[] = $this->builder->methodCall(
272-
$this->builder->localPropertyFetch(SchemaMapperNaming::getPropertyName($field)),
273-
'toSchema',
274-
[$requiredResponseItems[$i]]
275-
);
271+
if ($field->isNullable()) {
272+
$requiredVars[] = $this->builder->ternary(
273+
$this->builder->notEquals($requiredResponseItems[$i], $this->builder->val(null)),
274+
$this->builder->methodCall(
275+
$this->builder->localPropertyFetch(SchemaMapperNaming::getPropertyName($field)),
276+
'toSchema',
277+
[$requiredResponseItems[$i]]
278+
),
279+
$this->builder->val(null)
280+
);
281+
} else {
282+
$requiredVars[] = $this->builder->methodCall(
283+
$this->builder->localPropertyFetch(SchemaMapperNaming::getPropertyName($field)),
284+
'toSchema',
285+
[$requiredResponseItems[$i]]
286+
);
287+
}
276288
} elseif ($field->isDate()) {
277289
$this->addImport(DateTimeImmutable::class);
278290
if ($field->isNullable()) {

test/suite/functional/Generator/SchemaMapper/ItemMapper.php

+7-4
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,24 @@ class ItemMapper implements SchemaMapperInterface
1616
{
1717
private EmbeddedObjectMapper $embeddedObjectMapper;
1818

19-
public function __construct(EmbeddedObjectMapper $embeddedObjectMapper)
19+
private EmbeddedNullableObjectMapper $embeddedNullableObjectMapper;
20+
21+
public function __construct(EmbeddedObjectMapper $embeddedObjectMapper, EmbeddedNullableObjectMapper $embeddedNullableObjectMapper)
2022
{
21-
$this->embeddedObjectMapper = $embeddedObjectMapper;
23+
$this->embeddedObjectMapper = $embeddedObjectMapper;
24+
$this->embeddedNullableObjectMapper = $embeddedNullableObjectMapper;
2225
}
2326

2427
/**
2528
* @throws UnexpectedResponseBodyException
2629
*/
2730
public function toSchema(array $payload): Item
2831
{
29-
$missingFields = \implode(', ', \array_diff(['mandatoryInteger', 'mandatoryString', 'mandatoryEnum', 'mandatoryDate', 'mandatoryNullableDate', 'mandatoryFloat', 'mandatoryBoolean', 'mandatoryArray', 'mandatoryObject'], \array_keys($payload)));
32+
$missingFields = \implode(', ', \array_diff(['mandatoryInteger', 'mandatoryString', 'mandatoryEnum', 'mandatoryDate', 'mandatoryNullableDate', 'mandatoryFloat', 'mandatoryBoolean', 'mandatoryArray', 'mandatoryObject', 'mandatoryNullableObject'], \array_keys($payload)));
3033
if (! empty($missingFields)) {
3134
throw new UnexpectedResponseBodyException('Required attributes for `Item` missing in the response body: ' . $missingFields);
3235
}
33-
$schema = new Item($payload['mandatoryInteger'], $payload['mandatoryString'], $payload['mandatoryEnum'], new DateTimeImmutable($payload['mandatoryDate']), $payload['mandatoryNullableDate'] !== null ? new DateTimeImmutable($payload['mandatoryNullableDate']) : null, $payload['mandatoryFloat'], $payload['mandatoryBoolean'], $payload['mandatoryArray'], $this->embeddedObjectMapper->toSchema($payload['mandatoryObject']));
36+
$schema = new Item($payload['mandatoryInteger'], $payload['mandatoryString'], $payload['mandatoryEnum'], new DateTimeImmutable($payload['mandatoryDate']), $payload['mandatoryNullableDate'] !== null ? new DateTimeImmutable($payload['mandatoryNullableDate']) : null, $payload['mandatoryFloat'], $payload['mandatoryBoolean'], $payload['mandatoryArray'], $this->embeddedObjectMapper->toSchema($payload['mandatoryObject']), $payload['mandatoryNullableObject'] !== null ? $this->embeddedNullableObjectMapper->toSchema($payload['mandatoryNullableObject']) : null);
3437
if (isset($payload['optionalInteger'])) {
3538
$schema->setOptionalInteger($payload['optionalInteger']);
3639
}

test/suite/functional/Generator/SchemaMapper/item.yaml

+9
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ components:
5050
type: string
5151
mandatoryObject:
5252
$ref: '#/components/schemas/EmbeddedObject'
53+
mandatoryNullableObject:
54+
$ref: '#/components/schemas/EmbeddedNullableObject'
5355
optionalInteger:
5456
type: integer
5557
optionalString:
@@ -83,11 +85,18 @@ components:
8385
- mandatoryBoolean
8486
- mandatoryArray
8587
- mandatoryObject
88+
- mandatoryNullableObject
8689
EmbeddedObject:
8790
type: object
8891
properties:
8992
string:
9093
type: string
94+
EmbeddedNullableObject:
95+
type: object
96+
nullable: true
97+
properties:
98+
string:
99+
type: string
91100
parameters:
92101
ItemId:
93102
in: path

0 commit comments

Comments
 (0)