Completed
Pull Request — master (#11)
by Laurens
02:02
created

GuzzleIzettleClient::get()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 12
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 12
c 0
b 0
f 0
ccs 6
cts 6
cp 1
rs 9.4285
cc 2
eloc 7
nc 2
nop 2
crap 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace LauLamanApps\IzettleApi;
6
7
use DateTime;
8
use GuzzleHttp\ClientInterface;
9
use GuzzleHttp\Exception\ClientException;
10
use GuzzleHttp\Exception\RequestException;
11
use LauLamanApps\IzettleApi\Client\AccessToken;
12
use LauLamanApps\IzettleApi\Client\Exceptions\AccessTokenExpiredException;
13
use LauLamanApps\IzettleApi\Exception\NotFoundException;
14
use Psr\Http\Message\ResponseInterface;
15
16
class GuzzleIzettleClient implements IzettleClientInterface
17
{
18
    private $guzzleClient;
19
    private $accessToken;
20
21 13
    public function __construct(ClientInterface $guzzleClient, AccessToken $accessToken)
22
    {
23 13
        $this->guzzleClient = $guzzleClient;
24 13
        $this->accessToken = $accessToken;
25 13
        $this->validateAccessToken();
26 12
    }
27
28 6
    public function get(string $url, ?array $queryParameters = null): ResponseInterface
29
    {
30 6
        $options =  array_merge(['headers' => $this->getAuthorizationHeader()], ['query' => $queryParameters]);
31
32
        try {
33 6
            $response = $this->guzzleClient->get($url, $options);
34 1
        } catch (RequestException $e) {
35 1
            throw new NotFoundException($e->getMessage());
36
        }
37
38 5
        return $response;
39
    }
40
41 2
    public function post(string $url, string $jsonData): void
42
    {
43 2
        $headers = array_merge(
44 2
            $this->getAuthorizationHeader(),
45
            [
46 2
                'content-type' => 'application/json',
47
                'Accept' => 'application/json',
48
            ]
49
        );
50
51 2
        $options =  array_merge(['headers' => $headers], ['body' => $jsonData]);
52 2
        $this->guzzleClient->post($url, $options);
53 2
    }
54
55 2
    public function put(string $url, string $jsonData): void
56
    {
57 2
        $headers = array_merge(
58 2
            $this->getAuthorizationHeader(),
59
            [
60 2
                'content-type' => 'application/json',
61
                'Accept' => 'application/json',
62
            ]
63
        );
64
65 2
        $options =  array_merge(['headers' => $headers], ['body' => $jsonData]);
66
67 2
        $this->guzzleClient->put($url, $options);
68 2
    }
69
70 1
    public function delete(string $url): void
71
    {
72 1
        $this->guzzleClient->delete($url, ['headers' => $this->getAuthorizationHeader()]);
73 1
    }
74
75 3
    public function getJson(ResponseInterface $response): string
76
    {
77 3
        return $response->getBody()->getContents();
78
    }
79
80 11
    private function getAuthorizationHeader(): array
81
    {
82 11
        $this->validateAccessToken();
83
84 11
        return ['Authorization' => sprintf('Bearer %s', $this->accessToken->getToken())];
85
    }
86
87 13
    private function validateAccessToken(): void
88
    {
89 13
        if ($this->accessToken->isExpired()) {
90 1
            throw new AccessTokenExpiredException(
91 1
                sprintf(
92 1
                    'Access Token was valid till \'%s\' it\'s now \'%s\'',
93 1
                    $this->accessToken->getExpires()->format('Y-m-d H:i:s.u'),
94 1
                    (new DateTime())->format('Y-m-d H:i:s.u')
95
                )
96
            );
97
        }
98 12
    }
99
}
100