7 declare(strict_types=1);
21 private $webapiConfig;
25 private $serviceConfig;
29 private $asynchronousSchemaRequestProcessor;
41 private $responseDefinitionReplacement;
45 private $synchronousOnlyHttpMethods = [
57 \
Magento\Webapi\Model\Config $webapiConfig,
63 $this->webapiConfig = $webapiConfig;
64 $this->serviceConfig = $serviceConfig;
66 $this->asynchronousSchemaRequestProcessor = $asynchronousSchemaRequestProcessor;
78 if ($this->asynchronousSchemaRequestProcessor->canProcess($this->request)) {
79 $synchronousOnlyServiceMethods = $this->getSynchronousOnlyServiceMethods($subject);
81 foreach (
$result as $serviceName => $serviceData) {
83 foreach ($serviceData[WebapiConverter::KEY_METHODS] as $methodName => $methodData) {
85 if ($this->isServiceMethodSynchronousOnly(
88 $synchronousOnlyServiceMethods
90 $this->removeServiceMethodDefinition(
$result, $serviceName, $methodName);
92 $this->replaceResponseDefinition(
$result, $serviceName, $methodName);
107 private function isServiceMethodSynchronousOnly($serviceName, $methodName, array $synchronousOnlyServiceMethods)
109 return isset($synchronousOnlyServiceMethods[$serviceName][$methodName]);
116 private function getServiceVersions(
string $serviceName)
118 $services = $this->webapiConfig->getServices();
120 return array_keys(
$services[WebapiConverter::KEY_SERVICES][$serviceName]);
129 private function getSynchronousOnlyServiceMethods(\
Magento\Webapi\Model\ServiceMetadata $serviceMetadata)
131 $synchronousOnlyServiceMethods = [];
139 if ($this->isMethodDataSynchronousOnly($methodData)) {
140 $this->appendSynchronousOnlyServiceMethodsWithInterface(
142 $synchronousOnlyServiceMethods,
150 return array_merge_recursive(
151 $synchronousOnlyServiceMethods,
152 $this->getSynchronousOnlyRoutesAsServiceMethods($serviceMetadata)
163 private function getSynchronousOnlyRoutesAsServiceMethods(
164 \
Magento\Webapi\Model\ServiceMetadata $serviceMetadata
166 $synchronousOnlyServiceMethods = [];
167 $serviceRoutes = $this->webapiConfig->getServices()[\Magento\Webapi\Model\Config\Converter::KEY_ROUTES];
168 foreach ($serviceRoutes as $serviceRoutePath => $serviceRouteMethods) {
169 foreach ($serviceRouteMethods as $serviceRouteMethod => $serviceRouteMethodData) {
171 if (in_array(strtoupper($serviceRouteMethod), $this->synchronousOnlyHttpMethods)) {
172 $this->appendSynchronousOnlyServiceMethodsWithInterface(
174 $synchronousOnlyServiceMethods,
175 $serviceRouteMethodData[WebapiConverter::KEY_SERVICE][WebapiConverter::KEY_SERVICE_CLASS],
176 $serviceRouteMethodData[WebapiConverter::KEY_SERVICE][WebapiConverter::KEY_SERVICE_METHOD]
182 return $synchronousOnlyServiceMethods;
191 private function appendSynchronousOnlyServiceMethodsWithInterface(
192 \
Magento\Webapi\Model\ServiceMetadata $serviceMetadata,
193 array &$synchronousOnlyServiceMethods,
197 foreach ($this->getServiceVersions($serviceInterface) as $serviceVersion) {
198 $serviceName = $serviceMetadata->getServiceName($serviceInterface, $serviceVersion);
199 if (!array_key_exists($serviceName, $synchronousOnlyServiceMethods)) {
200 $synchronousOnlyServiceMethods[$serviceName] = [];
203 $synchronousOnlyServiceMethods[$serviceName][$serviceMethod] =
true;
212 private function removeServiceMethodDefinition(array &
$result, $serviceName, $methodName)
214 unset(
$result[$serviceName][WebapiConverter::KEY_METHODS][$methodName]);
217 if (count(
$result[$serviceName][WebapiConverter::KEY_METHODS]) === 0) {
227 private function replaceResponseDefinition(array &
$result, $serviceName, $methodName)
229 if (isset(
$result[$serviceName][WebapiConverter::KEY_METHODS][$methodName][
'interface'][
'out'])) {
230 $replacement = $this->getResponseDefinitionReplacement();
231 $result[$serviceName][WebapiConverter::KEY_METHODS][$methodName][
'interface'][
'out'] =
$replacement;
241 private function isMethodDataSynchronousOnly(array $methodData)
253 private function getResponseDefinitionReplacement()
255 if ($this->responseDefinitionReplacement ===
null) {
256 $this->responseDefinitionReplacement = [
259 'type' => $this->typeProcessor->register(AsyncResponseInterface::class),
260 'documentation' =>
'Returns response information for the asynchronous request.',
262 'response_codes' => [
265 'description' =>
'202 Accepted.' 273 return $this->responseDefinitionReplacement;
const KEY_SYNCHRONOUS_INVOCATION_ONLY