diff --git a/clients/algoliasearch-client-php/lib/RequestOptions/RequestOptionsFactory.php b/clients/algoliasearch-client-php/lib/RequestOptions/RequestOptionsFactory.php index 434b70631e..e116499509 100644 --- a/clients/algoliasearch-client-php/lib/RequestOptions/RequestOptionsFactory.php +++ b/clients/algoliasearch-client-php/lib/RequestOptions/RequestOptionsFactory.php @@ -9,14 +9,7 @@ final class RequestOptionsFactory { private $config; - private $validQueryParameters = [ - 'forwardToReplicas', - 'replaceExistingSynonyms', - 'clearExistingRules', - 'getVersion', - ]; - - private $validHeaders = ['Content-type', 'User-Agent', 'createIfNotExists']; + private $validHeaders = ['Content-type', 'User-Agent']; public function __construct(Configuration $config) { @@ -100,7 +93,7 @@ private function normalize($options) private function format($options) { foreach ($options as $name => $value) { - if (in_array($name, ['attributesToRetrieve', 'type'], true)) { + if (in_array($name, self::getAttributesToFormat(), true)) { if (is_array($value)) { $options[$name] = implode(',', $value); } @@ -114,8 +107,6 @@ private function getOptionType($optionName) { if ($this->isValidHeaderName($optionName)) { return 'headers'; - } elseif (in_array($optionName, $this->validQueryParameters, true)) { - return 'query'; } elseif ( in_array( $optionName, @@ -126,7 +117,7 @@ private function getOptionType($optionName) return $optionName; } - return 'body'; + return 'query'; } private function isValidHeaderName($name) @@ -141,4 +132,9 @@ private function isValidHeaderName($name) return false; } + + public static function getAttributesToFormat() + { + return ['attributesToRetrieve', 'type']; + } } diff --git a/specs/search/common/parameters.yml b/specs/search/common/parameters.yml index c86539a4d0..85d5dacbc0 100644 --- a/specs/search/common/parameters.yml +++ b/specs/search/common/parameters.yml @@ -8,10 +8,11 @@ HitsPerPage: description: Number of hits per page. default: 20 -UserIDInQuery: +# headers +UserIDInHeader: name: X-Algolia-User-ID description: userID to assign. - in: query + in: header required: true schema: type: string diff --git a/specs/search/paths/multiclusters/batchAssignUserIds.yml b/specs/search/paths/multiclusters/batchAssignUserIds.yml index 5137965c15..9264861c50 100644 --- a/specs/search/paths/multiclusters/batchAssignUserIds.yml +++ b/specs/search/paths/multiclusters/batchAssignUserIds.yml @@ -10,7 +10,7 @@ post: A successful response indicates that the operation has been taken into account, and the userIDs are directly usable. parameters: - - $ref: '../../common/parameters.yml#/UserIDInQuery' + - $ref: '../../common/parameters.yml#/UserIDInHeader' requestBody: required: true content: diff --git a/specs/search/paths/multiclusters/userIds.yml b/specs/search/paths/multiclusters/userIds.yml index 144d71a146..179d2527b6 100644 --- a/specs/search/paths/multiclusters/userIds.yml +++ b/specs/search/paths/multiclusters/userIds.yml @@ -12,7 +12,7 @@ post: A successful response indicates that the operation has been taken into account, and the userID is directly usable. parameters: - - $ref: '../../common/parameters.yml#/UserIDInQuery' + - $ref: '../../common/parameters.yml#/UserIDInHeader' requestBody: required: true content: diff --git a/templates/javascript/api-single.mustache b/templates/javascript/api-single.mustache index dc627909d1..0f88aaa4f4 100644 --- a/templates/javascript/api-single.mustache +++ b/templates/javascript/api-single.mustache @@ -175,7 +175,9 @@ export function create{{capitalizedApiName}}(options: CreateClientOptions{{#hasR {{/queryParams}}{{/vendorExtensions.x-is-custom-request}} {{#headerParams}} - headers['{{baseName}}'] = {{paramName}}; + if ({{paramName}} !== undefined) { + headers['{{baseName}}'] = {{paramName}}.toString(); + } {{/headerParams}} const request: Request = { diff --git a/templates/php/api.mustache b/templates/php/api.mustache index 72a5f7c968..8eafa287cd 100644 --- a/templates/php/api.mustache +++ b/templates/php/api.mustache @@ -2,15 +2,11 @@ namespace {{apiPackage}}; -use GuzzleHttp\Exception\RequestException; -use GuzzleHttp\Exception\ConnectException; -use GuzzleHttp\Psr7\MultipartStream; -use GuzzleHttp\RequestOptions; -use GuzzleHttp\Utils; use {{invokerPackage}}\Algolia; use {{invokerPackage}}\ApiException; use {{invokerPackage}}\Configuration\{{configClassname}}; use {{invokerPackage}}\ObjectSerializer; +use {{invokerPackage}}\RequestOptions\RequestOptionsFactory; use {{invokerPackage}}\RetryStrategy\ApiWrapper; use {{invokerPackage}}\RetryStrategy\ApiWrapperInterface; use {{invokerPackage}}\RetryStrategy\ClusterHosts; @@ -143,13 +139,14 @@ use {{invokerPackage}}\RetryStrategy\ClusterHosts; * @see {{{dataType}}} {{/isModel}} {{/allParams}} + * @param array $requestOptions Request Options * * @return {{#returnType}}{{#responses}}{{#dataType}}{{#-first}}array|{{{dataType}}}{{/-first}}{{/dataType}}{{/responses}}{{/returnType}}{{^returnType}}void{{/returnType}} {{#isDeprecated}} * @deprecated {{/isDeprecated}} */ - public function {{operationId}}({{^vendorExtensions.x-group-parameters}}{{#allParams}}${{paramName}}{{^required}} = {{{defaultValue}}}{{^defaultValue}}null{{/defaultValue}}{{/required}}{{^-last}}, {{/-last}}{{/allParams}}{{/vendorExtensions.x-group-parameters}}{{#vendorExtensions.x-group-parameters}}$associative_array{{/vendorExtensions.x-group-parameters}}) + public function {{operationId}}({{^vendorExtensions.x-group-parameters}}{{#allParams}}${{paramName}}{{^required}} = null{{/required}}, {{/allParams}}{{/vendorExtensions.x-group-parameters}}{{#vendorExtensions.x-group-parameters}}$associative_array{{/vendorExtensions.x-group-parameters}} $requestOptions = []) { {{#vendorExtensions.x-group-parameters}} // unbox the parameters from the associative array @@ -215,7 +212,7 @@ use {{invokerPackage}}\RetryStrategy\ClusterHosts; {{#isExplode}} if (${{paramName}} !== null) { {{#style}} - if('form' === '{{style}}' && is_array(${{paramName}})) { + if(is_array(${{paramName}}) && ! in_array('{{paramName}}', RequestOptionsFactory::getAttributesToFormat())) { foreach(${{paramName}} as $key => $value) { $queryParams[$key] = $value; } @@ -259,7 +256,9 @@ use {{invokerPackage}}\RetryStrategy\ClusterHosts; $httpBody = ${{paramName}}; } {{/bodyParams}} - + {{#headerParams}} + $queryParams['{{baseName}}'] = ${{paramName}}; + {{/headerParams}} {{#servers.0}} $operationHosts = [{{#servers}}"{{{url}}}"{{^-last}}, {{/-last}}{{/servers}}]; if ($this->hostIndex < 0 || $this->hostIndex >= sizeof($operationHosts)) { @@ -268,26 +267,29 @@ use {{invokerPackage}}\RetryStrategy\ClusterHosts; $operationHost = $operationHosts[$this->hostIndex]; {{/servers.0}} + $requestOptions += $queryParams; - return $this->sendRequest('{{httpMethod}}', $resourcePath, $queryParams, $httpBody); + return $this->sendRequest('{{httpMethod}}', $resourcePath, $queryParams, $httpBody, $requestOptions); } {{/operation}} - private function sendRequest($method, $resourcePath, $queryParams, $httpBody) + private function sendRequest($method, $resourcePath, $queryParams, $httpBody, $requestOptions) { $query = \GuzzleHttp\Psr7\Query::build($queryParams); if($method == 'GET') { $request = $this->api->read( $method, - $resourcePath . ($query ? "?{$query}" : '') + $resourcePath . ($query ? "?{$query}" : ''), + $requestOptions ); } else { $request = $this->api->write( $method, $resourcePath . ($query ? "?{$query}" : ''), - $httpBody + $httpBody, + $requestOptions ); } diff --git a/tests/CTS/methods/requests/search/assignUserId.json b/tests/CTS/methods/requests/search/assignUserId.json index 5698b18b21..6c90be0f53 100644 --- a/tests/CTS/methods/requests/search/assignUserId.json +++ b/tests/CTS/methods/requests/search/assignUserId.json @@ -11,9 +11,6 @@ "method": "POST", "body": { "cluster": "theCluster" - }, - "queryParameters": { - "X-Algolia-User-ID": "userID" } } } diff --git a/tests/CTS/methods/requests/search/batchAssignUserIds.json b/tests/CTS/methods/requests/search/batchAssignUserIds.json index b19ace6ea5..c524f8266f 100644 --- a/tests/CTS/methods/requests/search/batchAssignUserIds.json +++ b/tests/CTS/methods/requests/search/batchAssignUserIds.json @@ -19,9 +19,6 @@ "user1", "user2" ] - }, - "queryParameters": { - "X-Algolia-User-ID": "userID" } } } diff --git a/tests/CTS/methods/requests/templates/php/requests.mustache b/tests/CTS/methods/requests/templates/php/requests.mustache index e8d94974a6..dae33e5d14 100644 --- a/tests/CTS/methods/requests/templates/php/requests.mustache +++ b/tests/CTS/methods/requests/templates/php/requests.mustache @@ -8,6 +8,7 @@ use Algolia\AlgoliaSearch\Http\HttpClientInterface; use Algolia\AlgoliaSearch\Http\Psr7\Response; use Algolia\AlgoliaSearch\RetryStrategy\ApiWrapper; use Algolia\AlgoliaSearch\RetryStrategy\ClusterHosts; +use GuzzleHttp\Psr7\Query; use PHPUnit\Framework\TestCase; use Psr\Http\Message\RequestInterface; @@ -42,6 +43,13 @@ class {{clientPrefix}}Test extends TestCase implements HttpClientInterface $recordedRequest->getBody()->getContents() ); } + + if (isset($request['queryParameters'])) { + $this->assertEquals( + Query::build($request['queryParameters']), + $recordedRequest->getUri()->getQuery() + ); + } } } @@ -82,7 +90,7 @@ class {{clientPrefix}}Test extends TestCase implements HttpClientInterface "body" => json_decode("{{#lambda.escapequotes}}{{{request.body}}}{{/lambda.escapequotes}}"), {{/request.body}} {{#request.queryParameters}} - "queryParameters" => json_decode("{{#lambda.escapequotes}}{{{request.queryParameters}}}{{/lambda.escapequotes}}"), + "queryParameters" => json_decode("{{#lambda.escapequotes}}{{{request.queryParameters}}}{{/lambda.escapequotes}}", true), {{/request.queryParameters}} ], ]);