1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);
namespace Magento\WebapiAsync\Controller\Rest\Asynchronous;
use Magento\Framework\Webapi\ServiceInputProcessor;
use Magento\Framework\Webapi\Rest\Request as RestRequest;
use Magento\Webapi\Controller\Rest\Router;
use Magento\Webapi\Controller\Rest\ParamsOverrider;
use Magento\Webapi\Controller\Rest\RequestValidator;
use Magento\Webapi\Controller\Rest\InputParamsResolver as WebapiInputParamsResolver;
/**
* This class is responsible for retrieving resolved input data
*/
class InputParamsResolver
{
/**
* @var RestRequest
*/
private $request;
/**
* @var ParamsOverrider
*/
private $paramsOverrider;
/**
* @var ServiceInputProcessor
*/
private $serviceInputProcessor;
/**
* @var Router
*/
private $router;
/**
* @var RequestValidator
*/
private $requestValidator;
/**
* @var \Magento\Webapi\Controller\Rest\InputParamsResolver
*/
private $inputParamsResolver;
/**
* @var bool
*/
private $isBulk;
/**
* Initialize dependencies.
*
* @param \Magento\Framework\Webapi\Rest\Request $request
* @param \Magento\Webapi\Controller\Rest\ParamsOverrider $paramsOverrider
* @param \Magento\Framework\Webapi\ServiceInputProcessor $inputProcessor
* @param \Magento\Webapi\Controller\Rest\Router $router
* @param \Magento\Webapi\Controller\Rest\RequestValidator $requestValidator
* @param \Magento\Webapi\Controller\Rest\InputParamsResolver $inputParamsResolver
* @param bool $isBulk
*/
public function __construct(
RestRequest $request,
ParamsOverrider $paramsOverrider,
ServiceInputProcessor $inputProcessor,
Router $router,
RequestValidator $requestValidator,
WebapiInputParamsResolver $inputParamsResolver,
$isBulk = false
) {
$this->request = $request;
$this->paramsOverrider = $paramsOverrider;
$this->serviceInputProcessor = $inputProcessor;
$this->router = $router;
$this->requestValidator = $requestValidator;
$this->inputParamsResolver = $inputParamsResolver;
$this->isBulk = $isBulk;
}
/**
* Process and resolve input parameters
*
* Return array with validated input params
* or throw \Exception if at least one request entity params is not valid
*
* @return array
* @throws \Magento\Framework\Exception\InputException if no value is provided for required parameters
* @throws \Magento\Framework\Webapi\Exception
* @throws \Magento\Framework\Exception\AuthorizationException
*/
public function resolve()
{
if ($this->isBulk === false) {
return [$this->inputParamsResolver->resolve()];
}
$this->requestValidator->validate();
$webapiResolvedParams = [];
$inputData = $this->request->getRequestData();
$httpMethod = $this->request->getHttpMethod();
if ($httpMethod == \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_DELETE) {
$requestBodyParams = $this->request->getBodyParams();
$inputData = array_merge($requestBodyParams, $inputData);
}
foreach ($inputData as $key => $singleEntityParams) {
$webapiResolvedParams[$key] = $this->resolveBulkItemParams($singleEntityParams);
}
return $webapiResolvedParams;
}
/**
* Returns route.
*
* @return \Magento\Webapi\Controller\Rest\Router\Route
*/
public function getRoute()
{
return $this->inputParamsResolver->getRoute();
}
/**
* Resolve parameters for service
*
* Convert the input array from key-value format to a list of parameters
* suitable for the specified class / method.
*
* Instead of \Magento\Webapi\Controller\Rest\InputParamsResolver
* we don't need to merge body params with url params and use only body params
*
* @param array $inputData data to send to method in key-value format
* @return array list of parameters that can be used to call the service method
* @throws \Magento\Framework\Exception\InputException if no value is provided for required parameters
* @throws \Magento\Framework\Webapi\Exception
*/
private function resolveBulkItemParams($inputData)
{
$route = $this->getRoute();
$serviceMethodName = $route->getServiceMethod();
$serviceClassName = $route->getServiceClass();
$inputParams = $this->serviceInputProcessor->process($serviceClassName, $serviceMethodName, $inputData);
return $inputParams;
}
}