Issues (24)

src/Client.php (2 issues)

1
<?php
2
3
declare(strict_types=1);
4
5
namespace DalliSDK;
6
7
use DalliSDK\Models\Filial;
8
use DalliSDK\Models\Interval;
9
use DalliSDK\Models\Order;
10
use DalliSDK\Models\OrderResponse;
11
use DalliSDK\Models\Point;
12
use DalliSDK\Models\Responses\Response;
13
use DalliSDK\Models\Service;
14
use DalliSDK\Requests\MustRawJson;
15
use DalliSDK\Requests\Stickers\StickersBase64Request;
16
use DalliSDK\Requests\Stickers\StickersStreamRequest;
17
use DalliSDK\Requests\Stickers\StickersXmlRequest;
18
use DalliSDK\Responses\Act\ActBase64Response;
19
use DalliSDK\Responses\Act\TransferMoney\ActTransferMoneyResponse;
20
use DalliSDK\Responses\Act\TransferReturns\ActTransferReturnResponse;
21
use DalliSDK\Responses\CancelOrderResponse;
22
use DalliSDK\Responses\CreateBasketResponse;
23
use DalliSDK\Responses\DeliveryCostResponse;
24
use DalliSDK\Responses\EditBasketResponse;
25
use DalliSDK\Responses\FilialsResponse;
26
use DalliSDK\Responses\GetBasketResponse;
27
use DalliSDK\Responses\IntervalsResponse;
28
use DalliSDK\Responses\OrderDeliveryStatusResponse;
29
use DalliSDK\Responses\PointResponse;
30
use DalliSDK\Responses\PolygonsResponse;
0 ignored issues
show
The type DalliSDK\Responses\PolygonsResponse was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
31
use DalliSDK\Responses\RawDataResponse;
32
use DalliSDK\Responses\RemoveBasketResponse;
33
use DalliSDK\Responses\RuPostResponse;
34
use DalliSDK\Responses\SendToDeliveryResponse;
35
use DalliSDK\Responses\ServicesResponse;
36
use DalliSDK\Responses\SimpleResponse;
37
use DalliSDK\Responses\Stickers\StickersBase64Response;
38
use DalliSDK\Responses\Stickers\StickersXmlResponse;
39
use JMS\Serializer\Naming\CamelCaseNamingStrategy;
40
use JMS\Serializer\Naming\SerializedNameAnnotationStrategy;
41
use JMS\Serializer\SerializerBuilder;
42
use JMS\Serializer\SerializerInterface;
43
use Psr\Http\Client\ClientExceptionInterface;
44
45
/**
46
 * @method ServicesResponse|Service[]               sendServicesRequest(Requests\ServicesRequest $request)
47
 * @method IntervalsResponse|Interval[]             sendIntervalsRequest(Requests\IntervalsRequest $request)
48
 * @method PointResponse|Point[]                    sendPointRequest(Requests\PointRequest $request)
49
 * @method DeliveryCostResponse                     sendDeliveryCostRequest(Requests\DeliveryCostRequest $request)
50
 * @method OrderDeliveryStatusResponse              sendStatusRequest(Requests\OrderDeliveryStatusRequest $request)
51
 *
52
 * @method CreateBasketResponse|OrderResponse[]     sendCreateBasketRequest(Requests\CreateBasketRequest $request)
53
 * @method RuPostResponse|OrderResponse[]           sendCreateRuPostRequest(Requests\RuPostRequest $request)
54
 * @method GetBasketResponse|Order[]                sendGetBasketRequest(Requests\GetBasketRequest $request)
55
 * @method EditBasketResponse|OrderResponse         sendEditBasketRequest(Requests\EditBasketRequest $request)
56
 * @method RemoveBasketResponse                     sendRemoveBasketRequest(Requests\RemoveBasketRequest $request)
57
 * @method SendToDeliveryResponse|OrderResponse[]   sendToDeliveryRequest(Requests\SendToDeliveryBasketRequest $request)
58
 * @method CancelOrderResponse|Response[]           sendCancelOrderRequest(Requests\CancelOrderRequest $request)
59
 *
60
 * @method FilialsResponse|Filial[]                 sendFilialsRequest(Requests\FilialsRequest $request)
61
 * @method RawDataResponse                          sendPolygonsRequest(Requests\PolygonsRequest $request)
62
 *
63
 * @method SimpleResponse                           sendStickersStreamRequest(StickersStreamRequest $request)
64
 * @method StickersBase64Response                   sendStickersBase64Request(StickersBase64Request $request)
65
 * @method StickersXmlResponse                      sendStickersXmlRequest(StickersXmlRequest $request)
66
 *
67
 * @method SimpleResponse                           sendStickersBasketStreamRequest(Requests\Stickers\Basket\StickersStreamRequest $request)
68
 * @method StickersBase64Response                   sendStickersBasketBase64Request(Requests\Stickers\Basket\StickersBase64Request $request)
69
 * @method StickersXmlResponse                      sendStickersBasketXmlRequest(Requests\Stickers\Basket\StickersXmlRequest $request)
70
 *
71
 * @method SimpleResponse                           sendActStreamRequest(Requests\Act\ActStreamRequest $request)
72
 * @method ActBase64Response                        sendActBase64Request(Requests\Act\ActBase64Request $request)
73
 *
74
 * @method ActTransferMoneyResponse                 sendActTransferMoneyRequest(Requests\Act\TransferMoney\ActTransferMoneyRequest $request)
75
 * @method ActTransferReturnResponse                sendActTransferReturnRequest(Requests\Act\TransferReturn\ActTransferReturnRequest $request)
76
 */
77
class Client
78
{
79
    private \Psr\Http\Client\ClientInterface $httpClient;
80
    private SerializerInterface $serializer;
81
    private string $token;
82
    private string $url;
83
84 4
    public function __construct(\Psr\Http\Client\ClientInterface $http, string $token, string $url)
85
    {
86 4
        $this->httpClient = $http;
87 4
        $this->token = $token;
88 4
        $this->url = $url;
89
90 4
        $this->serializer = SerializerBuilder::create()
91 4
            ->setPropertyNamingStrategy(new SerializedNameAnnotationStrategy(new CamelCaseNamingStrategy()))
92 4
            ->build();
93
    }
94
95 4
    public function __call(string $name, array $arguments): \DalliSDK\Responses\ResponseInterface
96
    {
97 4
        if (0 === \strpos($name, 'send')) {
98 3
            return $this->sendRequest(...$arguments);
0 ignored issues
show
$arguments is expanded, but the parameter $request of DalliSDK\Client::sendRequest() does not expect variable arguments. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

98
            return $this->sendRequest(/** @scrutinizer ignore-type */ ...$arguments);
Loading history...
99
        }
100 1
        throw new \BadMethodCallException(\sprintf('Method [%s] not found in [%s].', $name, __CLASS__));
101
    }
102
103
104
    /**
105
     * @param \DalliSDK\Requests\RequestInterface $request
106
     *
107
     * @return \DalliSDK\Responses\ResponseInterface
108
     * @throws ClientExceptionInterface
109
     */
110 3
    public function sendRequest(\DalliSDK\Requests\RequestInterface $request): \DalliSDK\Responses\ResponseInterface
111
    {
112 3
        $response = $this->doRequest($request);
113
        if (
114 3
            $response->hasHeader('Content-Type') &&
115 3
            \strpos(implode(',', $response->getHeader('Content-Type')), 'text/xml') !== false
116
        ) {
117 2
            $body = $response->getBody()->getContents();
118 2
            if ($request instanceof MustRawJson) {
119 1
                return new RawDataResponse(json_decode($body, true));
120
            }
121 1
            $body = $this->fixNullAttributes($body);
122 1
            $body = $this->fixAmpersand($body);
123 1
            return $this->serializer->deserialize($body, $request->getResponseClass(), 'xml');
124
        } else {
125 1
            return new SimpleResponse((string)$response->getBody(), (int)$response->getStatusCode());
126
        }
127
    }
128
129
130
    /**
131
     * @param \DalliSDK\Requests\RequestInterface $request
132
     *
133
     * @return \Psr\Http\Message\ResponseInterface
134
     * @throws \Psr\Http\Client\ClientExceptionInterface
135
     */
136 3
    private function doRequest(\DalliSDK\Requests\RequestInterface $request): \Psr\Http\Message\ResponseInterface
137
    {
138 3
        $request->setAuth($this->token);
139 3
        $body = $this->serializer->serialize($request, 'xml');
140 3
        return $this->httpClient->sendRequest(new \Nyholm\Psr7\Request('POST', $this->url, [], $body));
141
    }
142
143
144
    /**
145
     * В ответе от Dalli отсутствующие значения обязательных аттрибутов почему-то приходят не согласно спецификации xml
146
     * и поэтому ломается удобная десериализация, чтобы этого не было, фиксим отсутствующие атрибуты
147
     *
148
     * @param string $xml
149
     *
150
     * @return array|string|string[]|null
151
     */
152 1
    private function fixNullAttributes(string $xml)
153
    {
154 1
        return preg_replace('/([a-zA-Z]+)=""/', 'xsi:$1="nill"', $xml);
155
    }
156
157
    /**
158
     * Заменям символ амперсанда, так как из-за него ломается десериализация
159
     *
160
     * @param string $xml
161
     *
162
     * @return array|string|string[]
163
     */
164 1
    private function fixAmpersand(string $xml)
165
    {
166 1
        return str_replace('&', '&amp;', $xml);
167
    }
168
}
169