Completed
Push — master ( b0734f...778e13 )
by Dmytro
02:37
created

ApiService::getResources()   B

Complexity

Conditions 5
Paths 6

Size

Total Lines 29
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 10.0876

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 29
ccs 7
cts 17
cp 0.4118
rs 8.439
cc 5
eloc 16
nc 6
nop 0
crap 10.0876
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
    /**
31
     * ApiService constructor.
32
     *
33
     * @param $resourceName
34
     * @param string $apiVersion
35
     * @param array $config
36
     */
37 8
    public function __construct($resourceName, $apiVersion = 'v1', $config = [])
38
    {
39 8
        $this->requestBuilder = new JsonApiRequestBuilder(new Request('', ''));
40 8
        $this->client = new JsonApiClient(GuzzleClient::createWithConfig($config));
0 ignored issues
show
Bug introduced by
The property client does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

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