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

ApiService   A

Complexity

Total Complexity 13

Size/Duplication

Total Lines 134
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Test Coverage

Coverage 70%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 13
c 1
b 0
f 0
lcom 1
cbo 4
dl 0
loc 134
ccs 35
cts 50
cp 0.7
rs 10

8 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 7 1
B getResources() 0 29 5
A getResource() 0 18 2
A getRequest() 0 10 1
A getResourceUri() 0 4 1
A getSingleResourceUri() 0 4 1
A getRequestBuilder() 0 4 1
A setRequestBuilder() 0 4 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
    /**
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
}