Test Failed
Push — master ( c36cf4...1a5bd4 )
by Dmytro
01:44
created

ApiService::setClient()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 4
ccs 0
cts 3
cp 0
rs 10
cc 1
eloc 2
nc 1
nop 1
crap 2
1
<?php
2
declare(strict_types=1);
3
4
namespace Oft\Client;
5
6
use GuzzleHttp\Psr7\Request;
7
use Http\Adapter\Guzzle6\Client as GuzzleClient;
8
use Psr\Http\Message\RequestInterface;
9
use WoohooLabs\Yang\JsonApi\Client\JsonApiClient;
10
use WoohooLabs\Yang\JsonApi\Request\JsonApiRequestBuilder;
11
12
/**
13
 * Class ApiService
14
 *
15
 * @package Oft\Client
16
 */
17
class ApiService
18
{
19
    const BASE_URL = 'https://api.openfintech.io';
20
21
    /** @var string */
22
    private $resourceName;
23
24
    /** @var string */
25
    private $apiVersion;
26
27
    /** @var JsonApiRequestBuilder */
28
    private $requestBuilder;
29
30
    /** @var JsonApiClient */
31
    private $client;
32
33
    /** @var string */
34
    private $baseUrl = self::BASE_URL;
35
36
    /**
37
     * ApiService constructor.
38
     *
39
     * @param string $resourceName
40
     * @param string $apiVersion
41
     * @param array $config
42
     */
43 10
    public function __construct(string $resourceName, string $apiVersion = 'v1', array $config = [])
44
    {
45 10
        $this->requestBuilder = new JsonApiRequestBuilder(new Request('', ''));
46 10
        $this->client = new JsonApiClient(GuzzleClient::createWithConfig($config));
47 10
        $this->resourceName = $resourceName;
48 10
        $this->apiVersion = $apiVersion;
49 10
    }
50
51
    /**
52
     * @return \Generator|\WoohooLabs\Yang\JsonApi\Schema\ResourceObject[]
53
     * @throws \Exception
54
     */
55 2
    public function getResources()
56
    {
57 2
        $lastPage = false;
58 2
        $pageCount = 1;
59
60 2
        while ($lastPage === false) {
61
62 2
            $this->requestBuilder->setUriQueryParam('page[number]', $pageCount);
63 2
            $request = $this->getRequest();
64 2
            $response = $this->client->sendRequest($request);
65 2
            if (!$response->isSuccessful([200])) {
66 1
                throw new \RuntimeException(sprintf('Can not get resource from URL %s', $request->getUri()));
67
            }
68
69 1
            $resources = $response->document()->primaryResources();
70 1
            $totalPage = $response->document()->meta()['pages'];
71
72 1
            if ($pageCount === $totalPage) {
73 1
                $lastPage = true;
74
            }
75
76 1
            foreach ($resources as $data) {
77 1
                yield $data;
78
            }
79
80 1
            $pageCount++;
81
        }
82
83 1
    }
84
85
    /**
86
     * @param string $id
87
     *
88
     * @return \WoohooLabs\Yang\JsonApi\Schema\ResourceObject
89
     */
90 2
    public function getResource(string $id)
91
    {
92 2
        $request = $this->requestBuilder
93 2
            ->setUri($this->getSingleResourceUri($id))
94 2
            ->fetch()
95 2
            ->getRequest();
96
97 2
        $response = $this->client->sendRequest($request);
98
99 2
        if (!$response->isSuccessful([200])) {
100 1
            throw new \RuntimeException(
101 1
                sprintf('Can not get resource from URL %s', $request->getUri()),
102 1
                $response->getStatusCode()
103
            );
104
        }
105
106 1
        return $response->document()->primaryResource();
107
    }
108
109
    /**
110
     * @return RequestInterface
111
     */
112 3
    public function getRequest()
113
    {
114 3
        $request = $this->requestBuilder
115 3
            ->setUri($this->getResourceUri())
116 3
            ->setMethod('GET')
117 3
            ->fetch()
118 3
            ->getRequest();
119
120 3
        return $request;
121
    }
122
123
    /**
124
     * @return string
125
     */
126 5
    private function getResourceUri()
127
    {
128 5
        return sprintf('%s/%s/%s', $this->baseUrl, $this->apiVersion, $this->resourceName);
129
    }
130
131
    /**
132
     * @param string $id
133
     *
134
     * @return string
135
     */
136 2
    private function getSingleResourceUri(string $id)
137
    {
138 2
        return sprintf('%s/%s', $this->getResourceUri(), $id);
139
    }
140
141
    /**
142
     * @return JsonApiRequestBuilder
143
     */
144 2
    public function getRequestBuilder(): JsonApiRequestBuilder
145
    {
146 2
        return $this->requestBuilder;
147
    }
148
149
    /**
150
     * @param JsonApiRequestBuilder $requestBuilder
151
     */
152 1
    public function setRequestBuilder(JsonApiRequestBuilder $requestBuilder)
153
    {
154 1
        $this->requestBuilder = $requestBuilder;
155 1
    }
156
157
    /**
158
     * @param JsonApiClient $client
159
     */
160
    public function setClient(JsonApiClient $client)
161
    {
162
        $this->client = $client;
163
    }
164
165
    /**
166
     * @param string $baseUrl
167
     */
168
    public function setBaseUrl(string $baseUrl)
169
    {
170
        $this->baseUrl = $baseUrl;
171
    }
172
173
    /**
174
     * @return string
175
     */
176
    public function getBaseUrl(): string
177
    {
178
        return $this->baseUrl;
179
    }
180
}