Completed
Push — master ( e1aed6...c8a251 )
by Dmytro
03:10
created

ApiService::getResourceUri()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 4
ccs 2
cts 2
cp 1
rs 10
cc 1
eloc 2
nc 1
nop 0
crap 1
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
    /**
34
     * ApiService constructor.
35
     *
36
     * @param string $resourceName
37
     * @param string $apiVersion
38
     * @param array $config
39
     */
40 8
    public function __construct(string $resourceName, string $apiVersion = 'v1', array $config = [])
41
    {
42 8
        $this->requestBuilder = new JsonApiRequestBuilder(new Request('', ''));
43 8
        $this->client = new JsonApiClient(GuzzleClient::createWithConfig($config));
44 8
        $this->resourceName = $resourceName;
45 8
        $this->apiVersion = $apiVersion;
46 8
    }
47
48
    /**
49
     * @return \Generator|\WoohooLabs\Yang\JsonApi\Schema\ResourceObject[]
50
     * @throws \Exception
51
     */
52 1
    public function getResources()
53
    {
54 1
        $lastPage = false;
55 1
        $pageCount = 1;
56
57 1
        while ($lastPage === false) {
58
59 1
            $this->requestBuilder->setUriQueryParam('page[number]', $pageCount);
60 1
            $request = $this->getRequest();
61 1
            $response = $this->client->sendRequest($request);
62
            if (!$response->isSuccessful([200])) {
63
                throw new \RuntimeException(sprintf('Can not get resource from URL %s', $request->getUri()));
64
            }
65
66
            $resources = $response->document()->primaryResources();
67
            $totalPage = $response->document()->meta()['pages'];
68
69
            if ($pageCount === $totalPage) {
70
                $lastPage = true;
71
            }
72
73
            foreach ($resources as $data) {
74
                yield $data;
75
            }
76
77
            $pageCount++;
78
        }
79
80
    }
81
82
    /**
83
     * @param string $id
84
     *
85
     * @return \WoohooLabs\Yang\JsonApi\Schema\ResourceObject
86
     */
87 1
    public function getResource(string $id)
88
    {
89 1
        $request = $this->requestBuilder
90 1
            ->setUri($this->getSingleResourceUri($id))
91 1
            ->fetch()
92 1
            ->getRequest();
93
94 1
        $response = $this->client->sendRequest($request);
95
96
        if (!$response->isSuccessful([200])) {
97
            throw new \RuntimeException(
98
                sprintf('Can not get resource from URL %s', $request->getUri()),
99
                $response->getStatusCode()
100
            );
101
        }
102
103
        return $response->document()->primaryResource();
104
    }
105
106
    /**
107
     * @return RequestInterface
108
     */
109 2
    public function getRequest()
110
    {
111 2
        $request = $this->requestBuilder
112 2
            ->setUri($this->getResourceUri())
113 2
            ->setMethod('GET')
114 2
            ->fetch()
115 2
            ->getRequest();
116
117 2
        return $request;
118
    }
119
120
    /**
121
     * @return string
122
     */
123 3
    private function getResourceUri()
124
    {
125 3
        return sprintf('%s/%s/%s', self::BASE_URL, $this->apiVersion, $this->resourceName);
126
    }
127
128
    /**
129
     * @param string $id
130
     *
131
     * @return string
132
     */
133 1
    private function getSingleResourceUri(string $id)
134
    {
135 1
        return sprintf('%s/%s', $this->getResourceUri(), $id);
136
    }
137
138
    /**
139
     * @return JsonApiRequestBuilder
140
     */
141 2
    public function getRequestBuilder(): JsonApiRequestBuilder
142
    {
143 2
        return $this->requestBuilder;
144
    }
145
146
    /**
147
     * @param JsonApiRequestBuilder $requestBuilder
148
     */
149 1
    public function setRequestBuilder(JsonApiRequestBuilder $requestBuilder)
150
    {
151 1
        $this->requestBuilder = $requestBuilder;
152
    }
153
}