Skip to content

Commit 12615bb

Browse files
authored
Merge pull request #60 from DoclerLabs/fix-request-parameters-with-same-name-but-different-refs
request parameters should use reference name when applicable
2 parents 860b5a0 + 75d6190 commit 12615bb

File tree

7 files changed

+136
-8
lines changed

7 files changed

+136
-8
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+
## [7.2.3] - 2021-11-03
8+
### Fixed
9+
- Request parameters with same name but different $ref should not override each other
10+
711
## [7.2.2] - 2021-10-15
812
### Fixed
913
- ext- in generated clients composer.json is added according to what is actually being used

src/Input/Factory/RequestFactory.php

+4-2
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,10 @@ public function create(
3131
$contentTypes = [];
3232
$collection = new RequestFieldRegistry();
3333
foreach ($parameters as $parameter) {
34+
$referenceName = '';
3435
if ($parameter instanceof Reference) {
35-
$parameter = $parameter->resolve();
36+
$referenceName = SchemaNaming::getClassName($parameter);
37+
$parameter = $parameter->resolve();
3638
}
3739
$collection->add(
3840
$parameter->in,
@@ -41,7 +43,7 @@ public function create(
4143
$parameter->name,
4244
$parameter->schema,
4345
$parameter->required,
44-
''
46+
$referenceName
4547
)
4648
);
4749
}

src/Naming/SchemaNaming.php

+4-4
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111

1212
class SchemaNaming
1313
{
14-
private const OPENAPI_COMPONENT_TYPE = 'schemas';
14+
private const OPENAPI_COMPONENT_TYPES = ['schemas', 'parameters'];
1515

16-
public static function getClassName(SpecObjectInterface $reference, string $fallbackName): string
16+
public static function getClassName(SpecObjectInterface $reference, string $fallbackName = ''): string
1717
{
1818
if (!($reference instanceof Reference)) {
1919
$fallbackName = CaseCaster::toPascal($fallbackName);
@@ -29,8 +29,8 @@ public static function getClassName(SpecObjectInterface $reference, string $fall
2929
$referencePath = $reference->getReference();
3030
$referencePath = explode('/', $referencePath);
3131
$referencePath = array_reverse($referencePath);
32-
if ($referencePath[1] !== self::OPENAPI_COMPONENT_TYPE) {
33-
throw new UnexpectedValueException('Only schema components are supported to be entities.');
32+
if (!in_array($referencePath[1], self::OPENAPI_COMPONENT_TYPES, true)) {
33+
throw new UnexpectedValueException('Only schema and parameter components are supported to be entities.');
3434
}
3535

3636
return CaseCaster::toPascal($referencePath[0]);

test/suite/functional/Generator/Request/GetResourcesRequest.php

+12-2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
namespace Test\Request;
1212

13+
use Test\Schema\ResourceFilter;
1314
use Test\Schema\SerializableInterface;
1415

1516
class GetResourcesRequest implements RequestInterface
@@ -20,6 +21,8 @@ class GetResourcesRequest implements RequestInterface
2021

2122
private ?array $filterByIds = null;
2223

24+
private ?ResourceFilter $filter = null;
25+
2326
private string $contentType = '';
2427

2528
public function getContentType(): string
@@ -51,6 +54,13 @@ public function setFilterByIds(array $filterByIds): self
5154
return $this;
5255
}
5356

57+
public function setFilter(ResourceFilter $filter): self
58+
{
59+
$this->filter = $filter;
60+
61+
return $this;
62+
}
63+
5464
public function getMethod(): string
5565
{
5666
return 'GET';
@@ -65,14 +75,14 @@ public function getQueryParameters(): array
6575
{
6676
return \array_map(static function ($value) {
6777
return $value instanceof SerializableInterface ? $value->toArray() : $value;
68-
}, \array_filter(['filterById' => $this->filterById, 'filterByName' => $this->filterByName, 'filterByIds' => $this->filterByIds], static function ($value) {
78+
}, \array_filter(['filterById' => $this->filterById, 'filterByName' => $this->filterByName, 'filterByIds' => $this->filterByIds, 'filter' => $this->filter], static function ($value) {
6979
return null !== $value;
7080
}));
7181
}
7282

7383
public function getRawQueryParameters(): array
7484
{
75-
return ['filterById' => $this->filterById, 'filterByName' => $this->filterByName, 'filterByIds' => $this->filterByIds];
85+
return ['filterById' => $this->filterById, 'filterByName' => $this->filterByName, 'filterByIds' => $this->filterByIds, 'filter' => $this->filter];
7686
}
7787

7888
public function getCookies(): array
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/*
6+
* This file was generated by docler-labs/api-client-generator.
7+
*
8+
* Do not edit it manually.
9+
*/
10+
11+
namespace Test\Request;
12+
13+
use Test\Schema\SerializableInterface;
14+
use Test\Schema\SubResourceFilter;
15+
16+
class GetSubResourcesRequest implements RequestInterface
17+
{
18+
private ?SubResourceFilter $filter = null;
19+
20+
private string $contentType = '';
21+
22+
public function getContentType(): string
23+
{
24+
return $this->contentType;
25+
}
26+
27+
public function setFilter(SubResourceFilter $filter): self
28+
{
29+
$this->filter = $filter;
30+
31+
return $this;
32+
}
33+
34+
public function getMethod(): string
35+
{
36+
return 'GET';
37+
}
38+
39+
public function getRoute(): string
40+
{
41+
return 'v1/resources/sub-resources';
42+
}
43+
44+
public function getQueryParameters(): array
45+
{
46+
return \array_map(static function ($value) {
47+
return $value instanceof SerializableInterface ? $value->toArray() : $value;
48+
}, \array_filter(['filter' => $this->filter], static function ($value) {
49+
return null !== $value;
50+
}));
51+
}
52+
53+
public function getRawQueryParameters(): array
54+
{
55+
return ['filter' => $this->filter];
56+
}
57+
58+
public function getCookies(): array
59+
{
60+
return [];
61+
}
62+
63+
public function getHeaders(): array
64+
{
65+
return [];
66+
}
67+
68+
public function getBody()
69+
{
70+
return null;
71+
}
72+
}

test/suite/functional/Generator/Request/getResources.yaml

+34
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,24 @@ paths:
1111
- $ref: '#/components/parameters/FilterById'
1212
- $ref: '#/components/parameters/FilterByName'
1313
- $ref: '#/components/parameters/FilterByIds'
14+
- $ref: '#/components/parameters/ResourceFilter'
15+
responses:
16+
'200':
17+
description: list of resources
18+
content:
19+
application/json:
20+
schema:
21+
type: array
22+
items:
23+
$ref: '#/components/schemas/Resource'
24+
'400':
25+
description: Invalid request parameters.
26+
'/v1/resources/sub-resources':
27+
get:
28+
description: Get a list of sub resources
29+
operationId: getSubResources
30+
parameters:
31+
- $ref: '#/components/parameters/SubResourceFilter'
1432
responses:
1533
'200':
1634
description: list of resources
@@ -47,3 +65,19 @@ components:
4765
type: array
4866
items:
4967
type: integer
68+
ResourceFilter:
69+
name: filter
70+
in: query
71+
schema:
72+
type: object
73+
properties:
74+
prop1:
75+
type: string
76+
SubResourceFilter:
77+
name: filter
78+
in: query
79+
schema:
80+
type: object
81+
properties:
82+
prop1:
83+
type: integer

test/suite/functional/Generator/RequestGeneratorTest.php

+6
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,12 @@ public function exampleProvider(): array
3333
self::BASE_NAMESPACE . RequestGenerator::NAMESPACE_SUBPATH . '\\GetResourcesRequest',
3434
ConfigurationBuilder::fake()->build(),
3535
],
36+
'Request with same parameter name but different parameters' => [
37+
'/Request/getResources.yaml',
38+
'/Request/GetSubResourcesRequest.php',
39+
self::BASE_NAMESPACE . RequestGenerator::NAMESPACE_SUBPATH . '\\GetSubResourcesRequest',
40+
ConfigurationBuilder::fake()->build(),
41+
],
3642
];
3743
}
3844

0 commit comments

Comments
 (0)