Completed
Branch v4.x (712f3d)
by Dmitry
04:56
created

AbstractService::getName()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 0
dl 0
loc 4
ccs 0
cts 2
cp 0
crap 2
rs 10
c 0
b 0
f 0
1
<?php
2
declare(strict_types=1);
3
4
namespace Gladyshev\Yandex\Direct;
5
6
abstract class AbstractService implements ServiceInterface
7
{
8
    /**
9
     * @var string
10
     */
11
    private $serviceName;
12
13
    /**
14
     * @var \Gladyshev\Yandex\Direct\CredentialsInterface
15
     */
16
    private $credentials;
17
18
    /**
19
     * @var \Psr\Http\Client\ClientInterface
20
     */
21
    private $httpClient;
22
23 25
    public function __construct(
24
        string $serviceName,
25
        \Gladyshev\Yandex\Direct\CredentialsInterface $credentials,
26
        \Psr\Http\Client\ClientInterface $httpClient
27
    ) {
28 25
        $this->serviceName = $serviceName;
29 25
        $this->credentials = $credentials;
30 25
        $this->httpClient = $httpClient;
31 25
    }
32
33
    public function getName(): string
34
    {
35
        return $this->serviceName;
36
    }
37
38
    public function getCredentials(): \Gladyshev\Yandex\Direct\CredentialsInterface
39
    {
40
        return $this->credentials;
41
    }
42
43
    public function call(array $params = []): array
44
    {
45
        $request = new \GuzzleHttp\Psr7\Request(
46
            'POST',
47
            $this->getUri(),
48
            $this->getHeaders(),
49
            $this->getBody($params)
50
        );
51
52
        $response = $this->httpClient->sendRequest($request);
53
54
        return $this->handleResponse($request, $response);
55
    }
56
57
    /**
58
     * @return string
59
     */
60
    protected function getUri() : string
61
    {
62
        return $this->getCredentials()->getBaseUrl() . '/json/v5/' . mb_strtolower($this->getName());
63
    }
64
65
    /**
66
     * @return array
67
     */
68
    protected function getHeaders(): array
69
    {
70
        $headers = [
71
            'Content-Type' => 'application/json; charset=utf-8',
72
            'Accept' => 'application/json',
73
            'Authorization' => 'Bearer ' . $this->getCredentials()->getToken(),
74
            'Accept-Language' => $this->getCredentials()->getLanguage()
75
        ];
76
77
        if ($this->getCredentials()->isAgency()) {
78
            $headers['Use-Operator-Units'] = $this->getCredentials()->getUseOperatorUnits() ? 'true' : 'false';
79
            if ($this->getCredentials()->getClientLogin()) {
80
                $headers['Client-Login'] = $this->getCredentials()->getClientLogin();
81
            }
82
        }
83
84
        return $headers;
85
    }
86
87
    /**
88
     * @param array $params
89
     * @return string
90
     */
91
    protected function getBody(array $params): string
92
    {
93
        if (empty($params['params'])) {
94
            $params = new \StdClass;
95
        } else {
96
            $params['params'] = array_filter($params['params']);
97
        }
98
99
        return json_encode($params);
100
    }
101
102
    /**
103
     * @param \Psr\Http\Message\RequestInterface $request
104
     * @param \Psr\Http\Message\ResponseInterface $response
105
     * @return array
106
     */
107
    protected function handleResponse(
108
        \Psr\Http\Message\RequestInterface $request,
109
        \Psr\Http\Message\ResponseInterface $response
110
    ): array {
111
        $result = json_decode($response->getBody()->getContents(), true);
112
113
        /* Handle error response */
114
115
        if (isset($result['error']) && $result['error']) {
116
            throw new \Gladyshev\Yandex\Direct\Exception\ErrorResponseException(
117
                $result['error']['error_string'],
118
                $result['error']['error_detail'],
119
                (int) $result['error']['error_code'],
120
                $request,
121
                $response
122
            );
123
        }
124
125
        $requestId = current($response->getHeader('RequestId'));
126
127
        [$debit, $rest, $limit] = explode('/', current($response->getHeader('Units')));
0 ignored issues
show
Bug introduced by
The variable $debit does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
Bug introduced by
The variable $rest does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
Bug introduced by
The variable $limit does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
128
129
        return [
130
            'request_id' => $requestId,
131
            'units' => [
132
                'debit' => $debit,
133
                'rest' => $rest,
134
                'limit' => $limit
135
            ],
136
            'result' => $result
137
        ];
138
    }
139
}
140