ApiService::getResources()   A
last analyzed

Complexity

Conditions 5
Paths 6

Size

Total Lines 31

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 19
CRAP Score 5

Importance

Changes 0
Metric Value
dl 0
loc 31
ccs 19
cts 19
cp 1
rs 9.1128
c 0
b 0
f 0
cc 5
nc 6
nop 0
crap 5
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
            $this->requestBuilder->setUriQueryParam('page[size]', 100);
64 2
            $this->requestBuilder->setUriQueryParam('sort', 'id');
65 2
            $request = $this->getRequest();
66 2
            $response = $this->client->sendRequest($request);
67 2
            if (!$response->isSuccessful([200])) {
68 1
                throw new \RuntimeException(sprintf('Can not get resource from URL %s', $request->getUri()));
69
            }
70
71 1
            $resources = $response->document()->primaryResources();
72 1
            $totalPage = $response->document()->meta()['pages'];
73
74 1
            if ($pageCount === $totalPage) {
75 1
                $lastPage = true;
76
            }
77
78 1
            foreach ($resources as $data) {
79 1
                yield $data;
80
            }
81
82 1
            $pageCount++;
83
        }
84
85 1
    }
86
87
    /**
88
     * @param string $id
89
     *
90
     * @return \WoohooLabs\Yang\JsonApi\Schema\ResourceObject
91
     */
92 2
    public function getResource(string $id)
93
    {
94 2
        $request = $this->requestBuilder
95 2
            ->setUri($this->getSingleResourceUri($id))
96 2
            ->fetch()
97 2
            ->getRequest();
98
99 2
        $response = $this->client->sendRequest($request);
100
101 2
        if (!$response->isSuccessful([200])) {
102 1
            throw new \RuntimeException(
103 1
                sprintf('Can not get resource from URL %s', $request->getUri()),
104 1
                $response->getStatusCode()
105
            );
106
        }
107
108 1
        return $response->document()->primaryResource();
109
    }
110
111
    /**
112
     * @return RequestInterface
113
     */
114 3
    public function getRequest()
115
    {
116 3
        $request = $this->requestBuilder
117 3
            ->setUri($this->getResourceUri())
118 3
            ->setMethod('GET')
119 3
            ->fetch()
120 3
            ->getRequest();
121
122 3
        return $request;
123
    }
124
125
    /**
126
     * @return string
127
     */
128 5
    private function getResourceUri()
129
    {
130 5
        return sprintf('%s/%s/%s', $this->baseUrl, $this->apiVersion, $this->resourceName);
131
    }
132
133
    /**
134
     * @param string $id
135
     *
136
     * @return string
137
     */
138 2
    private function getSingleResourceUri(string $id)
139
    {
140 2
        return sprintf('%s/%s', $this->getResourceUri(), $id);
141
    }
142
143
    /**
144
     * @return JsonApiRequestBuilder
145
     */
146 2
    public function getRequestBuilder(): JsonApiRequestBuilder
147
    {
148 2
        return $this->requestBuilder;
149
    }
150
151
    /**
152
     * @param JsonApiRequestBuilder $requestBuilder
153
     */
154 1
    public function setRequestBuilder(JsonApiRequestBuilder $requestBuilder)
155
    {
156 1
        $this->requestBuilder = $requestBuilder;
157 1
    }
158
159
    /**
160
     * @param JsonApiClient $client
161
     */
162
    public function setClient(JsonApiClient $client)
163
    {
164
        $this->client = $client;
165
    }
166
167
    /**
168
     * @param string $baseUrl
169
     */
170
    public function setBaseUrl(string $baseUrl)
171
    {
172
        $this->baseUrl = $baseUrl;
173
    }
174
175
    /**
176
     * @return string
177
     */
178
    public function getBaseUrl(): string
179
    {
180
        return $this->baseUrl;
181
    }
182
}
183