Completed
Push — master ( 201238...507368 )
by Aleksander
05:51
created

PartnerClient   D

Complexity

Total Complexity 39

Size/Duplication

Total Lines 702
Duplicated Lines 21.94 %

Coupling/Cohesion

Components 2
Dependencies 22

Test Coverage

Coverage 96.08%

Importance

Changes 0
Metric Value
wmc 39
lcom 2
cbo 22
dl 154
loc 702
ccs 196
cts 204
cp 0.9608
rs 4.7473
c 0
b 0
f 0

31 Methods

Rating   Name   Duplication   Size   Complexity  
A getServiceUrl() 0 5 1
A __construct() 0 4 1
A setClientId() 0 4 1
A setLogin() 0 4 1
A setCampaignId() 0 4 1
A getCampaignId() 0 4 1
A getClientId() 0 4 1
A getLogin() 0 4 1
C sendRequest() 33 33 8
A getAccessToken() 0 5 1
A getBalance() 11 11 1
A getCampaigns() 11 11 1
A getCampaignsByLogin() 11 11 1
A getLoginsByCampaign() 0 10 1
A getOutletsResponse() 0 11 1
A getOutlets() 0 4 1
A getOutlet() 0 11 1
A getOrdersResponse() 0 11 1
A getOrders() 0 4 1
A getOrder() 11 11 1
A getRegion() 10 10 1
A getSettings() 11 11 1
A getStats() 0 12 1
B setOrderStatus() 0 26 2
A updateDelivery() 0 19 1
A filterParams() 0 6 1
A getModel() 0 14 1
A findModels() 0 16 1
A getModels() 19 19 1
A getModelOffers() 15 15 1
A getModelsOffers() 19 19 1

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
<?php
2
/**
3
 * Yandex PHP Library
4
 *
5
 * @copyright NIX Solutions Ltd.
6
 * @link https://github.com/nixsolutions/yandex-php-library
7
 */
8
9
/**
10
 * @namespace
11
 */
12
namespace Yandex\Market\Partner;
13
14
use Yandex\Common\AbstractServiceClient;
15
use GuzzleHttp\Psr7\Response;
16
use GuzzleHttp\Exception\ClientException;
17
use Yandex\Common\Exception\ForbiddenException;
18
use Yandex\Common\Exception\UnauthorizedException;
19
use Yandex\Common\StringCollection;
20
use Yandex\Market\Partner\Exception\PartnerRequestException;
21
use Yandex\Market\Partner\Models\Delivery;
22
use Yandex\Market\Partner\Models\GetCampaignsResponse;
23
use Yandex\Market\Partner\Models\GetMarketModelsResponse;
24
use Yandex\Market\Partner\Models\GetOrderResponse;
25
use Yandex\Market\Partner\Models\GetOrdersResponse;
26
use Yandex\Market\Partner\Models\MarketModel;
27
use Yandex\Market\Partner\Models\MarketModels;
28
use Yandex\Market\Partner\Models\Order;
29
use Yandex\Market\Partner\Models\Orders;
30
use Yandex\Market\Partner\Models\UpdateOrderDeliveryResponse;
31
use Yandex\Market\Partner\Models\UpdateOrderStatusResponse;
32
33
/**
34
 * Class PartnerClient
35
 *
36
 * @category Yandex
37
 * @package Market
38
 *
39
 * @author   Alexander Khaylo <[email protected]>
40
 * @created  04.11.13 12:48
41
 */
42
class PartnerClient extends AbstractServiceClient
43
{
44
45
    /**
46
     * Order is being processed
47
     */
48
    const ORDER_STATUS_PROCESSING = 'PROCESSING';
49
50
    /**
51
     * Order submitted to the delivery
52
     */
53
    const ORDER_STATUS_DELIVERY = 'DELIVERY';
54
55
    /**
56
     *  Order delivered to the point of self-delivery
57
     */
58
    const ORDER_STATUS_PICKUP = 'PICKUP';
59
60
    /**
61
     * The order is received by the buyer
62
     */
63
    const ORDER_STATUS_DELIVERED = 'DELIVERED';
64
65
    /**
66
     * Order canceled.
67
     */
68
    const ORDER_STATUS_CANCELLED = 'CANCELLED';
69
70
    //Sub-statuses for status CANCELLED
71
    // - the buyer is not finalized the reserved order on time
72
    const ORDER_SUBSTATUS_RESERVATION_EXPIRED = 'RESERVATION_EXPIRED';
73
    // - the buyer did not pay for the order ( for the type of payment PREPAID)
74
    const ORDER_SUBSTATUS_USER_NOT_PAID = 'USER_NOT_PAID';
75
    // - failed to communicate with the buyer
76
    const ORDER_SUBSTATUS_USER_UNREACHABLE = 'USER_UNREACHABLE';
77
    // - buyer canceled the order for cause
78
    const ORDER_SUBSTATUS_USER_CHANGED_MIND = 'USER_CHANGED_MIND';
79
    // - the buyer is not satisfied with the terms of delivery
80
    const ORDER_SUBSTATUS_USER_REFUSED_DELIVERY = 'USER_REFUSED_DELIVERY';
81
    // - the buyer did not fit the goods
82
    const ORDER_SUBSTATUS_USER_REFUSED_PRODUCT = 'USER_REFUSED_PRODUCT';
83
    // - shop can not fulfill the order
84
    const ORDER_SUBSTATUS_SHOP_FAILED = 'SHOP_FAILED';
85
    // - the buyer is not satisfied with the quality of the goods
86
    const ORDER_SUBSTATUS_USER_REFUSED_QUALITY = 'USER_REFUSED_QUALITY';
87
    // - buyer changes the composition of the order
88
    const ORDER_SUBSTATUS_REPLACING_ORDER = 'REPLACING_ORDER';
89
    //- store does not process orders on time
90
    const ORDER_SUBSTATUS_PROCESSING_EXPIRED = 'PROCESSING_EXPIRED';
91
92
    //Способ оплаты заказа
93
    //предоплата через Яндекс;
94
    const PAYMENT_METHOD_YANDEX = 'YANDEX';
95
    //предоплата напрямую магазину,
96
    //не принимающему предоплату через Яндекс.
97
    const PAYMENT_METHOD_SHOP_PREPAID = 'SHOP_PREPAID';
98
    // наличный расчет при получении заказа;
99
    const PAYMENT_METHOD_CASH_ON_DELIVERY = 'CASH_ON_DELIVERY';
100
    // оплата банковской картой при получении заказа.
101
    const PAYMENT_METHOD_CARD_ON_DELIVERY = 'CARD_ON_DELIVERY';
102
103
    //Типы доставки
104
    //курьерская доставка
105
    const DELIVERY_TYPE_DELIVERY = 'DELIVERY';
106
    //самовывоз
107
    const DELIVERY_TYPE_PICKUP = 'PICKUP';
108
    //почта
109
    const DELIVERY_TYPE_POST = 'POST';
110
111
    const ORDER_DECLINE_REASON_OUT_OF_DATE = 'OUT_OF_DATE';
112
113
    /**
114
     * Requested version of API
115
     * @var string
116
     */
117
    private $version = 'v2';
118
119
    /**
120
     * Application id
121
     *
122
     * @var string
123
     */
124
    protected $clientId;
125
126
    /**
127
     * User login
128
     *
129
     * @var string
130
     */
131
    protected $login;
132
133
    /**
134
     * Campaign Id
135
     *
136
     * @var string
137
     */
138
    protected $campaignId;
139
140
    /**
141
     * API domain
142
     *
143
     * @var string
144
     */
145
    protected $serviceDomain = 'api.partner.market.yandex.ru';
146
147
    /**
148
     * Get url to service resource with parameters
149
     *
150
     * @param string $resource
151
     * @see http://api.yandex.ru/market/partner/doc/dg/concepts/method-call.xml
152
     * @return string
153
     */
154 22
    public function getServiceUrl($resource = '')
155
    {
156 22
        return $this->serviceScheme . '://' . $this->serviceDomain . '/'
157 22
        . $this->version . '/' . $resource;
158
    }
159
160
    /**
161
     * @param string $token access token
162
     */
163 24
    public function __construct($token = '')
164
    {
165 24
        $this->setAccessToken($token);
166 24
    }
167
168
    /**
169
     * @param string $clientId
170
     */
171 1
    public function setClientId($clientId)
172
    {
173 1
        $this->clientId = $clientId;
174 1
    }
175
176
    /**
177
     * @param string $login
178
     */
179 1
    public function setLogin($login)
180
    {
181 1
        $this->login = $login;
182 1
    }
183
184
    /**
185
     * @param string $campaignId
186
     */
187 1
    public function setCampaignId($campaignId)
188
    {
189 1
        $this->campaignId = $campaignId;
190 1
    }
191
192
    /**
193
     * @return string
194
     */
195 1
    public function getCampaignId()
196
    {
197 1
        return $this->campaignId;
198
    }
199
200
    /**
201
     * @return string
202
     */
203 1
    public function getClientId()
204
    {
205 1
        return $this->clientId;
206
    }
207
208
    /**
209
     * @return string
210
     */
211 1
    public function getLogin()
212
    {
213 1
        return $this->login;
214
    }
215
216
    /**
217
     * Sends a request
218
     *
219
     * @param string $method HTTP method
220
     * @param string $uri URI object or string.
221
     * @param array $options Request options to apply.
222
     *
223
     * @return Response
224
     *
225
     * @throws ForbiddenException
226
     * @throws UnauthorizedException
227
     * @throws PartnerRequestException
228
     */
229 5 View Code Duplication
    protected function sendRequest($method, $uri, array $options = [])
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
230
    {
231
        try {
232 5
            $response = $this->getClient()->request($method, $uri, $options);
233 5
        } catch (ClientException $ex) {
234 4
            $result = $ex->getResponse();
235 4
            $code = $result->getStatusCode();
236 4
            $message = $result->getReasonPhrase();
237
238 4
            $body = $result->getBody();
239 4
            if ($body) {
240 4
                $jsonBody = json_decode($body);
241 4
                if ($jsonBody && isset($jsonBody->error) && isset($jsonBody->error->message)) {
242 1
                    $message = $jsonBody->error->message;
243 1
                }
244 4
            }
245
246 4
            if ($code === 403) {
247 1
                throw new ForbiddenException($message);
248
            }
249
250 3
            if ($code === 401) {
251 2
                throw new UnauthorizedException($message);
252
            }
253
254 1
            throw new PartnerRequestException(
255 1
                'Service responded with error code: "' . $code . '" and message: "' . $message . '"',
256
                $code
257 1
            );
258
        }
259
260 1
        return $response;
261
    }
262
263
    /**
264
     * Get OAuth data for header request
265
     *
266
     * @see http://api.yandex.ru/market/partner/doc/dg/concepts/authorization.xml
267
     *
268
     * @return string
269
     */
270 1
    public function getAccessToken()
271
    {
272 1
        return 'oauth_token=' . parent::getAccessToken() . ', oauth_client_id=' . $this->getClientId()
273 1
        . ', oauth_login=' . $this->getLogin();
274
    }
275
276
    /**
277
     * Get Balance Campaign
278
     * @link https://tech.yandex.ru/market/partner/doc/dg/reference/get-campaigns-id-balance-docpage/
279
     *
280
     * @return Models\Balance
281
     */
282 1 View Code Duplication
    public function getBalance()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
283
    {
284 1
        $resource = 'campaigns/' . $this->campaignId . '/balance.json';
285
286 1
        $response = $this->sendRequest('GET', $this->getServiceUrl($resource));
287
288 1
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
289
290 1
        $getBalanceResponse = new Models\GetBalanceResponse($decodedResponseBody);
291 1
        return $getBalanceResponse->getBalance();
292
    }
293
294
    /**
295
     * Get User Campaigns
296
     *
297
     * Returns the user to the list of campaigns Yandex.market.
298
     * The list coincides with the list of campaigns
299
     * that are displayed in the partner interface Yandex.Market on page "My shops."
300
     *
301
     * @see http://api.yandex.ru/market/partner/doc/dg/reference/get-campaigns.xml
302
     *
303
     * @return Campaigns
304
     */
305 1 View Code Duplication
    public function getCampaigns()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
306
    {
307 1
        $resource = 'campaigns.json';
308
309 1
        $response = $this->sendRequest('GET', $this->getServiceUrl($resource));
310
311 1
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
312
313 1
        $getCampaignsResponse = new GetCampaignsResponse($decodedResponseBody);
314 1
        return $getCampaignsResponse->getCampaigns();
315
    }
316
    
317
    /**
318
     * Get User Campaigns by Login
319
     *
320
     * @link https://tech.yandex.ru/market/partner/doc/dg/reference/get-campaigns-by-login-docpage/
321
     *
322
     * @return Models\Campaigns
323
     */
324 View Code Duplication
    public function getCampaignsByLogin($login)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
325
    {
326
        $resource = 'campaigns/by_login/' . $login . '.json';
327
328
        $response = $this->sendRequest('GET', $this->getServiceUrl($resource));
329
330
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
331
332
        $getCampaignsResponse = new Models\GetCampaignsResponse($decodedResponseBody);
333
        return $getCampaignsResponse->getCampaigns();
334
    }
335
336
    /**
337
     * Get logins by campaign id
338
     *
339
     * @link https://tech.yandex.ru/market/partner/doc/dg/reference/get-campaigns-id-logins-docpage/
340
     *
341
     * @return StringCollection
342
     */
343 1
    public function getLoginsByCampaign()
344
    {
345 1
        $resource = 'campaigns/' . $this->campaignId . '/logins.json';
346
347 1
        $response = $this->sendRequest('GET', $this->getServiceUrl($resource));
348
349 1
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
350
351 1
        return StringCollection::init($decodedResponseBody['logins']);
352
    }
353
354
    /**
355
     * Get outlets by campaign id
356
     * @param array $params ['page' => (int) 0-100, 'pageSize' => (int) 50]
357
     *
358
     * @link https://tech.yandex.ru/market/partner/doc/dg/reference/get-campaigns-id-outlets-docpage/
359
     *
360
     * @return Models\GetOutletsResponse
361
     */
362 1
    public function getOutletsResponse($params = [])
363
    {
364 1
        $resource = 'campaigns/' . $this->campaignId . '/outlets.json';
365 1
        $resource .= '?' . http_build_query($params);
366
367 1
        $response = $this->sendRequest('GET', $this->getServiceUrl($resource));
368
369 1
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
370
371 1
        return new Models\GetOutletsResponse($decodedResponseBody);
372
    }
373
374
    /**
375
     * Get only outlets data without pagination
376
     *
377
     * @param array $params
378
     * @return null|Models\Outlets
379
     */
380
    public function getOutlets($params = [])
381
    {
382
        return $this->getOutletsResponse($params)->getOutlets();
383
    }
384
385
    /**
386
     * Get outlet info
387
     *
388
     * @param $outletId
389
     *
390
     * @link https://tech.yandex.ru/market/partner/doc/dg/reference/get-campaigns-id-outlets-id-docpage/
391
     *
392
     * @return null|Models\Outlet
393
     */
394 1
    public function getOutlet($outletId)
395
    {
396 1
        $resource = 'campaigns/' . $this->campaignId . '/outlets/' . $outletId . '.json';
397
398 1
        $response = $this->sendRequest('GET', $this->getServiceUrl($resource));
399
400 1
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
401
402 1
        $getOrderResponse = new Models\GetOutletResponse($decodedResponseBody);
403 1
        return $getOrderResponse->getOutlet();
404
    }
405
406
407
    /**
408
     * Get information about orders by campaign id
409
     *
410
     * @param array $params
411
     *
412
     * Returns information on the requested orders.
413
     * Available filtering by date ordering and order status.
414
     * The maximum range of dates in a single request for a resource - 30 days.
415
     *
416
     * @see http://api.yandex.ru/market/partner/doc/dg/reference/get-campaigns-id-orders.xml
417
     *
418
     * @return GetOrdersResponse
419
     */
420 1
    public function getOrdersResponse($params = [])
421
    {
422 1
        $resource = 'campaigns/' . $this->campaignId . '/orders.json';
423 1
        $resource .= '?' . http_build_query($params);
424
425 1
        $response = $this->sendRequest('GET', $this->getServiceUrl($resource));
426
427 1
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
428
429 1
        return new GetOrdersResponse($decodedResponseBody);
430
    }
431
432
    /**
433
     * Get only orders data without pagination
434
     *
435
     * @param array $params
436
     * @return null|Orders
437
     */
438 1
    public function getOrders($params = [])
439
    {
440 1
        return $this->getOrdersResponse($params)->getOrders();
441
    }
442
443
    /**
444
     * Get order info
445
     *
446
     * @param int $orderId
447
     * @return Order
448
     *
449
     * @link http://api.yandex.ru/market/partner/doc/dg/reference/get-campaigns-id-orders-id.xml
450
     */
451 6 View Code Duplication
    public function getOrder($orderId)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
452
    {
453 6
        $resource = 'campaigns/' . $this->campaignId . '/orders/' . $orderId . '.json';
454
455 6
        $response = $this->sendRequest('GET', $this->getServiceUrl($resource));
456
457 2
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
458
459 2
        $getOrderResponse = new GetOrderResponse($decodedResponseBody);
460 2
        return $getOrderResponse->getOrder();
461
    }
462
463
    /**
464
     * Get Region
465
     *
466
     * @return Models\Region
467
     *
468
     * @link https://tech.yandex.ru/market/partner/doc/dg/reference/get-campaigns-id-region-docpage/
469
     */
470 1 View Code Duplication
    public function getRegion()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
471
    {
472 1
        $resource = 'campaigns/' . $this->campaignId . '/region.json';
473
474 1
        $response = $this->sendRequest('GET', $this->getServiceUrl($resource));
475
476 1
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
477 1
        $getRegionResponse = new Models\GetRegionResponse($decodedResponseBody);
478 1
        return $getRegionResponse->getRegion();
479
    }
480
481
    /**
482
     * Get Campaign settings
483
     *
484
     * @retun Models\Settings
485
     *
486
     * @link https://tech.yandex.ru/market/partner/doc/dg/reference/get-campaigns-id-settings-docpage/
487
     */
488 1 View Code Duplication
    public function getSettings()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
489
    {
490 1
        $resource = 'campaigns/' . $this->campaignId . '/settings.json';
491
       
492 1
        $response = $this->sendRequest('GET', $this->getServiceUrl($resource));
493
494 1
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
495
       
496 1
        $getSettingsResponse = new Models\GetSettingsResponse($decodedResponseBody);
497 1
        return $getSettingsResponse->getSettings();
498
    }
499
  
500
    /**
501
     * @param $method [main | main-daily | main-weekly | main-monthly]
502
     * @param array $params
503
     * @return Models\Stats
504
     *
505
     * @link https://tech.yandex.ru/market/partner/doc/dg/reference/get-campaigns-id-stats-main-docpage/
506
     */
507 1
    public function getStats($method, $params = [])
508
    {
509 1
        $resource = 'campaigns/' . $this->campaignId . '/stats/' . $method . '.json';
510 1
        $resource .= '?' . http_build_query($params);
511
512 1
        $response = $this->sendRequest('GET', $this->getServiceUrl($resource));
513
514 1
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
515
516 1
        $getStatsResponse = new Models\GetStatsResponse($decodedResponseBody);
517 1
        return $getStatsResponse->getMainStats();
518
    }
519
520
    /**
521
     * Send changed status to Yandex.Market
522
     *
523
     * @param int $orderId
524
     * @param string $status
525
     * @param null|string $subStatus
526
     * @return Order
527
     *
528
     * @link http://api.yandex.ru/market/partner/doc/dg/reference/put-campaigns-id-orders-id-status.xml
529
     */
530 1
    public function setOrderStatus($orderId, $status, $subStatus = null)
531
    {
532 1
        $resource = 'campaigns/' . $this->campaignId . '/orders/' . $orderId . '/status.json';
533
534
        $data = [
535
            "order" => [
536
                "status" => $status
537 1
            ]
538 1
        ];
539 1
        if ($subStatus) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $subStatus of type null|string is loosely compared to true; this is ambiguous if the string can be empty. You might want to explicitly use !== null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
540 1
            $data['order']['substatus'] = $subStatus;
541 1
        }
542
543 1
        $response = $this->sendRequest(
544 1
            'PUT',
545 1
            $this->getServiceUrl($resource),
546
            [
547
                'json' => $data
548 1
            ]
549 1
        );
550
551 1
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
552
553 1
        $updateOrderStatusResponse = new UpdateOrderStatusResponse($decodedResponseBody);
554 1
        return $updateOrderStatusResponse->getOrder();
555
    }
556
557
558
    /**
559
     * Update changed delivery parameters
560
     *
561
     * @param int $orderId
562
     * @param Delivery $delivery
563
     * @return Order
564
     *
565
     * Example:
566
     * PUT /v2/campaigns/10003/order/12345/delivery.json HTTP/1.1
567
     *
568
     * @link http://api.yandex.ru/market/partner/doc/dg/reference/put-campaigns-id-orders-id-delivery.xml
569
     */
570 1
    public function updateDelivery($orderId, Delivery $delivery)
571
    {
572 1
        $resource = 'campaigns/' . $this->campaignId . '/orders/' . $orderId . '/delivery.json';
573
574 1
        $response = $this->sendRequest(
575 1
            'PUT',
576 1
            $this->getServiceUrl($resource),
577
            [
578
                'json' => [
579 1
                    'delivery' => $delivery->toArray()
580 1
                ]
581 1
            ]
582 1
        );
583
584 1
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
585
586 1
        $updateOrderDeliveryResponse = new UpdateOrderDeliveryResponse($decodedResponseBody);
587 1
        return $updateOrderDeliveryResponse->getOrder();
588
    }
589
590
    /**
591
     * Filter query params
592
     *
593
     * @param array $params
594
     * @return array
595
     */
596
    private function filterParams(array $params)
597
    {
598 5
        return array_filter($params, function ($param) {
599 5
            return !empty($param);
600 5
        });
601
    }
602
603
    /**
604
     * Get product model by ID
605
     *
606
     * @param int $modelId
607
     * @param int $regionId
608
     * @param string $currency
609
     * @return MarketModel
610
     *
611
     * @link https://tech.yandex.ru/market/partner/doc/dg/reference/get-models-id-docpage/
612
     */
613 1
    public function getModel($modelId, $regionId, $currency = null)
614
    {
615 1
        $resource = sprintf('models/%s.%s', $modelId, self::DECODE_TYPE_DEFAULT);
616 1
        $queryParams = $this->filterParams([
617 1
            'regionId' => $regionId,
618 1
            'currency' => $currency,
619 1
        ]);
620
621 1
        $response = $this->sendRequest('GET', $this->getServiceUrl($resource), ['query' => $queryParams]);
622 1
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
623 1
        $marketModelsResponse = new GetMarketModelsResponse($decodedResponseBody);
624
625 1
        return $marketModelsResponse->getModels()->current();
626
    }
627
628
    /**
629
     * Find models by query
630
     *
631
     * @param string $searchQuery
632
     * @param int $regionId
633
     * @param int $page
634
     * @param int $pageSize
635
     * @param string $currency
636
     * @return GetMarketModelsResponse
637
     *
638
     * @link https://tech.yandex.ru/market/partner/doc/dg/reference/get-models-docpage/
639
     */
640 1
    public function findModels($searchQuery, $regionId, $page = null, $pageSize = null, $currency = null)
641
    {
642 1
        $resource = sprintf('models.%s', self::DECODE_TYPE_DEFAULT);
643 1
        $queryParams = $this->filterParams([
644 1
            'query' => $searchQuery,
645 1
            'regionId' => $regionId,
646 1
            'page' => $page,
647 1
            'pageSize' => $pageSize,
648 1
            'currency' => $currency,
649 1
        ]);
650
651 1
        $response = $this->sendRequest('GET', $this->getServiceUrl($resource), ['query' => $queryParams]);
652 1
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
653
654 1
        return new GetMarketModelsResponse($decodedResponseBody);
655
    }
656
657
    /**
658
     * Get multiple models by ids
659
     *
660
     * @param array $modelIds
661
     * @param int $regionId
662
     * @param string $currency
663
     * @return MarketModels
664
     *
665
     * @link https://tech.yandex.ru/market/partner/doc/dg/reference/post-models-docpage/
666
     */
667 1 View Code Duplication
    public function getModels(array $modelIds, $regionId, $currency = null)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
668
    {
669 1
        $resource = sprintf('models.%s', self::DECODE_TYPE_DEFAULT);
670 1
        $queryParams = $this->filterParams([
671 1
            'regionId' => $regionId,
672 1
            'currency' => $currency,
673 1
        ]);
674
675 1
        $response = $this->sendRequest('POST', $this->getServiceUrl($resource), [
676 1
            'query' => $queryParams,
677
            'json' => [
678
                'models' => $modelIds
679 1
            ],
680 1
        ]);
681 1
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
682 1
        $marketModelsResponse = new GetMarketModelsResponse($decodedResponseBody);
683
684 1
        return $marketModelsResponse->getModels();
685
    }
686
687
    /**
688
     * Get model offers
689
     *
690
     * @param int $modelId
691
     * @param int $regionId
692
     * @param string $currency
693
     * @param string $orderByPrice
694
     * @return MarketModel
695
     *
696
     * @link https://tech.yandex.ru/market/partner/doc/dg/reference/get-models-id-offers-docpage/
697
     */
698 1 View Code Duplication
    public function getModelOffers($modelId, $regionId, $currency = null, $orderByPrice = null)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
699
    {
700 1
        $resource = sprintf('models/%s/offers.%s', $modelId, self::DECODE_TYPE_DEFAULT);
701 1
        $queryParams = $this->filterParams([
702 1
            'regionId' => $regionId,
703 1
            'currency' => $currency,
704 1
            'orderByPrice' => $orderByPrice,
705 1
        ]);
706
707 1
        $response = $this->sendRequest('GET', $this->getServiceUrl($resource), ['query' => $queryParams]);
708 1
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
709 1
        $marketModelsResponse = new GetMarketModelsResponse($decodedResponseBody);
710
711 1
        return $marketModelsResponse->getModels()->current();
712
    }
713
714
    /**
715
     * Get multiple models offers
716
     *
717
     * @param array $modelIds
718
     * @param int $regionId
719
     * @param string $currency
720
     * @return MarketModels
721
     *
722
     * @link https://tech.yandex.ru/market/partner/doc/dg/reference/post-models-offers-docpage/
723
     */
724 1 View Code Duplication
    public function getModelsOffers(array $modelIds, $regionId, $currency = null)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
725
    {
726 1
        $resource = sprintf('models/offers.%s', self::DECODE_TYPE_DEFAULT);
727 1
        $queryParams = $this->filterParams([
728 1
            'regionId' => $regionId,
729 1
            'currency' => $currency,
730 1
        ]);
731
732 1
        $response = $this->sendRequest('POST', $this->getServiceUrl($resource), [
733 1
            'query' => $queryParams,
734
            'json' => [
735
                'models' => $modelIds
736 1
            ],
737 1
        ]);
738 1
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
739 1
        $marketModelsResponse = new GetMarketModelsResponse($decodedResponseBody);
740
741 1
        return $marketModelsResponse->getModels();
742
    }
743
}
744