Skip to content

Commit 637b8fe

Browse files
authored
Merge pull request #19 from DoclerLabs/fix-serialization-of-query-parameters-json-serializable
readd json serialization on query parameters
2 parents cdaee84 + c763659 commit 637b8fe

File tree

14 files changed

+172
-34
lines changed

14 files changed

+172
-34
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
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+
## [3.2.0] - 2020-11-10
8+
### Added
9+
- Query parameters which implement `JsonSerializable` will be converted accordingly.
10+
711
## [3.1.0] - 2020-11-05
812
### Fixed
913
- Fix collections `toArray` docblock

src/Generator/Implementation/HttpMessage/HttpMessageAbstract.php

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,34 +26,30 @@ public function generateRequestMapMethod(): MethodBuilder
2626

2727
$bodyVariable = $this->builder->var('body');
2828

29-
$encodeMethodCall = $this->builder->methodCall(
29+
$bodyEncodeMethodCall = $this->builder->methodCall(
3030
$this->builder->localPropertyFetch('bodySerializer'),
3131
'serializeRequest',
3232
[
3333
$requestVariable,
3434
]
3535
);
36+
$queryEncodeMethodCall = $this->builder->methodCall(
37+
$this->builder->localPropertyFetch('querySerializer'),
38+
'serializeRequest',
39+
[
40+
$requestVariable,
41+
]
42+
);
3643

37-
$statements[] = $this->builder->assign($bodyVariable, $encodeMethodCall);
44+
$statements[] = $this->builder->assign($bodyVariable, $bodyEncodeMethodCall);
45+
$statements[] = $this->builder->assign($query, $queryEncodeMethodCall);
3846

3947
$arguments[] = $this->builder->methodCall($requestVariable, 'getMethod');
4048
$arguments[] = $this->builder->methodCall($requestVariable, 'getRoute');
4149
$arguments[] = $this->builder->methodCall($requestVariable, 'getHeaders');
4250
$arguments[] = $bodyVariable;
4351
$arguments[] = $this->builder->val('1.1');
4452

45-
$statements[] = $this->builder->assign(
46-
$query,
47-
$this->builder->funcCall(
48-
'http_build_query',
49-
[
50-
$this->builder->methodCall($requestVariable, 'getQueryParameters'),
51-
'',
52-
'&',
53-
$this->builder->constFetch('PHP_QUERY_RFC3986')
54-
]
55-
)
56-
);
5753
$statements[] = $this->builder->assign(
5854
$psr7RequestVariable,
5955
$this->builder->new(

src/Generator/RequestGenerator.php

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ protected function generateRequest(PhpFileCollection $fileRegistry, Operation $o
4848
protected function generateEnums(Request $request): array
4949
{
5050
$statements = [];
51-
foreach ($request->getFields() as $origin => $fields) {
51+
foreach ($request->getFields() as $fields) {
5252
foreach ($fields as $field) {
5353
foreach ($this->generateEnumStatements($field) as $statement) {
5454
$statements[] = $statement;
@@ -62,7 +62,7 @@ protected function generateEnums(Request $request): array
6262
protected function generateProperties(Request $request): array
6363
{
6464
$statements = [];
65-
foreach ($request->getFields() as $origin => $fields) {
65+
foreach ($request->getFields() as $fields) {
6666
foreach ($fields as $field) {
6767
if ($field->isComposite()) {
6868
$this->addImport(
@@ -85,7 +85,7 @@ protected function generateConstructor(Request $request): ?ClassMethod
8585
{
8686
$params = [];
8787
$paramInits = [];
88-
foreach ($request->getFields() as $origin => $fields) {
88+
foreach ($request->getFields() as $fields) {
8989
foreach ($fields as $field) {
9090
if ($field->isRequired()) {
9191
$enumStmt = $this->generateEnumValidation($field, $this->baseNamespace);
@@ -120,7 +120,7 @@ protected function generateConstructor(Request $request): ?ClassMethod
120120
protected function generateSetters(Request $request): array
121121
{
122122
$statements = [];
123-
foreach ($request->getFields() as $origin => $fields) {
123+
foreach ($request->getFields() as $fields) {
124124
foreach ($fields as $field) {
125125
if (!$field->isRequired()) {
126126
$statements[] = $this->generateSet($field, $this->baseNamespace);
@@ -203,6 +203,10 @@ protected function generateGetParametersMethods(Request $request): array
203203
'getQueryParameters',
204204
$fields->getQueryFields()
205205
);
206+
$methods[] = $this->generateGetRawParametersMethod(
207+
'getRawQueryParameters',
208+
$fields->getQueryFields()
209+
);
206210
$methods[] = $this->generateGetParametersMethod(
207211
'getCookies',
208212
$fields->getCookieFields()
@@ -235,6 +239,23 @@ protected function generateGetParametersMethod(string $methodName, array $fields
235239
->getNode();
236240
}
237241

242+
protected function generateGetRawParametersMethod(string $methodName, array $fields): ClassMethod
243+
{
244+
$fieldsArr = [];
245+
$returnType = 'array';
246+
foreach ($fields as $field) {
247+
$fieldsArr[$field->getName()] = $this->builder->localPropertyFetch($field->getPhpVariableName());
248+
}
249+
250+
return $this->builder
251+
->method($methodName)
252+
->makePublic()
253+
->addStmt($this->builder->return($this->builder->array($fieldsArr)))
254+
->setReturnType($returnType)
255+
->composeDocBlock([], $returnType)
256+
->getNode();
257+
}
258+
238259
protected function generateGetBody(?Field $body): ClassMethod
239260
{
240261
if ($body !== null) {

src/Generator/RequestMapperGenerator.php

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use DoclerLabs\ApiClientGenerator\Naming\CopiedNamespace;
99
use DoclerLabs\ApiClientGenerator\Output\Copy\Request\RequestInterface;
1010
use DoclerLabs\ApiClientGenerator\Output\Copy\Serializer\BodySerializer;
11+
use DoclerLabs\ApiClientGenerator\Output\Copy\Serializer\QuerySerializer;
1112
use DoclerLabs\ApiClientGenerator\Output\Php\PhpFileCollection;
1213
use GuzzleHttp\Cookie\CookieJar;
1314
use PhpParser\Node\Stmt\ClassMethod;
@@ -32,30 +33,45 @@ public function generate(Specification $specification, PhpFileCollection $fileRe
3233
{
3334
$this
3435
->addImport(CopiedNamespace::getImport($this->baseNamespace, BodySerializer::class))
36+
->addImport(CopiedNamespace::getImport($this->baseNamespace, QuerySerializer::class))
3537
->addImport(CookieJar::class);
3638

3739
foreach ($this->messageImplementation->getInitMessageImports() as $import) {
3840
$this->addImport($import);
3941
}
4042

41-
$serializerPropertyName = 'bodySerializer';
43+
$bodySerializerPropertyName = 'bodySerializer';
44+
$querySerializerPropertyName = 'querySerializer';
4245

4346
$properties = [];
4447
$properties[] = $this->builder->localProperty(
45-
$serializerPropertyName,
48+
$bodySerializerPropertyName,
4649
'BodySerializer',
4750
'BodySerializer'
4851
);
52+
$properties[] = $this->builder->localProperty(
53+
$querySerializerPropertyName,
54+
'QuerySerializer',
55+
'QuerySerializer'
56+
);
4957

5058
$parameters = [];
5159
$parameters[] = $this->builder
52-
->param($serializerPropertyName)
60+
->param($bodySerializerPropertyName)
5361
->setType('BodySerializer')
5462
->getNode();
63+
$parameters[] = $this->builder
64+
->param($querySerializerPropertyName)
65+
->setType('QuerySerializer')
66+
->getNode();
5567

5668
$paramInits[] = $this->builder->assign(
57-
$this->builder->localPropertyFetch($serializerPropertyName),
58-
$this->builder->var($serializerPropertyName)
69+
$this->builder->localPropertyFetch($bodySerializerPropertyName),
70+
$this->builder->var($bodySerializerPropertyName)
71+
);
72+
$paramInits[] = $this->builder->assign(
73+
$this->builder->localPropertyFetch($querySerializerPropertyName),
74+
$this->builder->var($querySerializerPropertyName)
5975
);
6076

6177
$constructor = $this->builder

src/Generator/ServiceProviderGenerator.php

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use DoclerLabs\ApiClientGenerator\Output\Copy\Serializer\BodySerializer;
1616
use DoclerLabs\ApiClientGenerator\Output\Copy\Serializer\ContentType\FormUrlencodedContentTypeSerializer;
1717
use DoclerLabs\ApiClientGenerator\Output\Copy\Serializer\ContentType\JsonContentTypeSerializer;
18+
use DoclerLabs\ApiClientGenerator\Output\Copy\Serializer\QuerySerializer;
1819
use DoclerLabs\ApiClientGenerator\Output\Php\PhpFileCollection;
1920
use PhpParser\Node\Expr\Closure;
2021
use PhpParser\Node\Expr\New_;
@@ -44,6 +45,7 @@ public function generate(Specification $specification, PhpFileCollection $fileRe
4445
->addImport(CopiedNamespace::getImport($this->baseNamespace, RequestMapperInterface::class))
4546
->addImport(CopiedNamespace::getImport($this->baseNamespace, ResponseHandler::class))
4647
->addImport(CopiedNamespace::getImport($this->baseNamespace, BodySerializer::class))
48+
->addImport(CopiedNamespace::getImport($this->baseNamespace, QuerySerializer::class))
4749
->addImport(CopiedNamespace::getImport($this->baseNamespace, JsonContentTypeSerializer::class))
4850
->addImport(CopiedNamespace::getImport($this->baseNamespace, FormUrlencodedContentTypeSerializer::class))
4951
->addImport(
@@ -92,6 +94,13 @@ public function generateRegisterMethod(array $compositeFields): ClassMethod
9294
'class'
9395
)
9496
),
97+
$this->containerImplementation->getClosure(
98+
$containerVariable,
99+
$this->builder->classConstFetch(
100+
'QuerySerializer',
101+
'class'
102+
)
103+
),
95104
]
96105
)
97106
),
@@ -106,6 +115,11 @@ public function generateRegisterMethod(array $compositeFields): ClassMethod
106115
$this->builder->classConstFetch('BodySerializer', 'class'),
107116
$this->generateBodySerializerClosure()
108117
);
118+
$statements[] = $this->containerImplementation->registerClosure(
119+
$containerVariable,
120+
$this->builder->classConstFetch('QuerySerializer', 'class'),
121+
$this->generateQuerySerializerClosure()
122+
);
109123
$statements[] = $this->containerImplementation->registerClosure(
110124
$containerVariable,
111125
$this->builder->classConstFetch('ResponseHandler', 'class'),
@@ -152,6 +166,18 @@ public function generateRegisterMethod(array $compositeFields): ClassMethod
152166
->getNode();
153167
}
154168

169+
private function generateQuerySerializerClosure(): Closure
170+
{
171+
return $this->builder->closure(
172+
[
173+
$this->builder->return($this->builder->new('QuerySerializer'))
174+
],
175+
[],
176+
[],
177+
'QuerySerializer'
178+
);
179+
}
180+
155181
private function generateBodySerializerClosure(): Closure
156182
{
157183
$registerBodySerializerClosureSubCall = $this->builder->methodCall(

src/Output/Copy/Request/RequestInterface.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@ public function getHeaders(): array;
1818

1919
public function getQueryParameters(): array;
2020

21+
public function getRawQueryParameters(): array;
22+
2123
/**
2224
* @return SerializableInterface|null
2325
*/
2426
public function getBody();
25-
}
27+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace DoclerLabs\ApiClientGenerator\Output\Copy\Serializer;
4+
5+
use DoclerLabs\ApiClientGenerator\Output\Copy\Request\RequestInterface;
6+
use DoclerLabs\ApiClientGenerator\Output\Copy\Schema\SerializableInterface;
7+
use JsonSerializable;
8+
9+
class QuerySerializer
10+
{
11+
public function serializeRequest(RequestInterface $request): string
12+
{
13+
$queryParameters = [];
14+
15+
foreach ($request->getRawQueryParameters() as $name => $value) {
16+
if ($value === null) {
17+
continue;
18+
} elseif ($value instanceof SerializableInterface) {
19+
$value = $value->toArray();
20+
} elseif ($value instanceof JsonSerializable) {
21+
$value = $value->jsonSerialize();
22+
}
23+
24+
$queryParameters[$name] = $value;
25+
}
26+
27+
return http_build_query($queryParameters, '', '&', PHP_QUERY_RFC3986);
28+
}
29+
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,14 @@ public function getQueryParameters(): array
9393
}));
9494
}
9595

96+
/**
97+
* @return array
98+
*/
99+
public function getRawQueryParameters(): array
100+
{
101+
return ['filterById' => $this->filterById, 'filterByName' => $this->filterByName, 'filterByIds' => $this->filterByIds];
102+
}
103+
96104
/**
97105
* @return array
98106
*/

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,14 @@ public function getQueryParameters(): array
5555
return [];
5656
}
5757

58+
/**
59+
* @return array
60+
*/
61+
public function getRawQueryParameters(): array
62+
{
63+
return [];
64+
}
65+
5866
/**
5967
* @return array
6068
*/

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,14 @@ public function getQueryParameters(): array
273273
}));
274274
}
275275

276+
/**
277+
* @return array
278+
*/
279+
public function getRawQueryParameters(): array
280+
{
281+
return ['integerParameter' => $this->integerParameter, 'stringParameter' => $this->stringParameter, 'enumParameter' => $this->enumParameter, 'dateParameter' => $this->dateParameter, 'floatParameter' => $this->floatParameter, 'booleanParameter' => $this->booleanParameter, 'arrayParameter' => $this->arrayParameter, 'objectParameter' => $this->objectParameter, 'mandatoryIntegerParameter' => $this->mandatoryIntegerParameter, 'mandatoryStringParameter' => $this->mandatoryStringParameter, 'mandatoryEnumParameter' => $this->mandatoryEnumParameter, 'mandatoryDateParameter' => $this->mandatoryDateParameter, 'mandatoryFloatParameter' => $this->mandatoryFloatParameter, 'mandatoryBooleanParameter' => $this->mandatoryBooleanParameter, 'mandatoryArrayParameter' => $this->mandatoryArrayParameter, 'mandatoryObjectParameter' => $this->mandatoryObjectParameter];
282+
}
283+
276284
/**
277285
* @return array
278286
*/

0 commit comments

Comments
 (0)