1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
declare(strict_types=1); |
4
|
|
|
|
5
|
|
|
namespace Fenerum; |
6
|
|
|
|
7
|
|
|
use Fenerum\API\Exceptions\FenerumApiException; |
8
|
|
|
use GuzzleHttp\Client; |
9
|
|
|
use GuzzleHttp\Exception\GuzzleException; |
10
|
|
|
use Illuminate\Support\Facades\Log; |
11
|
|
|
|
12
|
|
|
class ApiClient |
13
|
|
|
{ |
14
|
|
|
/** @var \GuzzleHttp\Client */ |
15
|
|
|
protected $client; |
16
|
|
|
|
17
|
|
|
public function __construct() |
18
|
|
|
{ |
19
|
|
|
$this->client = new Client([ |
20
|
|
|
'base_uri' => config('fenerum.base_uri'), |
21
|
|
|
'headers' => [ |
22
|
|
|
'Authorization' => 'Token '.config('fenerum.api_token'), |
23
|
|
|
'Content-Type' => 'application/json', |
24
|
|
|
'Accept' => 'application/json', |
25
|
|
|
], |
26
|
|
|
'timeout' => 15.0, |
27
|
|
|
]); |
28
|
|
|
} |
29
|
|
|
|
30
|
|
|
/** |
31
|
|
|
* @param string $url |
32
|
|
|
* @return array|null |
33
|
|
|
* @throws \Fenerum\API\Exceptions\FenerumApiException |
34
|
|
|
*/ |
35
|
|
|
public function get(string $url): ?array |
36
|
|
|
{ |
37
|
|
|
return $this->request('GET', $url); |
38
|
|
|
} |
39
|
|
|
|
40
|
|
|
/** |
41
|
|
|
* @param string $url |
42
|
|
|
* @param array $data |
43
|
|
|
* @return array|null |
44
|
|
|
* @throws \Fenerum\API\Exceptions\FenerumApiException |
45
|
|
|
*/ |
46
|
|
|
public function post(string $url, array $data): ?array |
47
|
|
|
{ |
48
|
|
|
return $this->request('POST', $url, $data); |
49
|
|
|
} |
50
|
|
|
|
51
|
|
|
/** |
52
|
|
|
* @param string $url |
53
|
|
|
* @param array $data |
54
|
|
|
* @return array |
55
|
|
|
* @throws \Fenerum\API\Exceptions\FenerumApiException |
56
|
|
|
*/ |
57
|
|
|
public function put(string $url, array $data): ?array |
58
|
|
|
{ |
59
|
|
|
return $this->request('PUT', $url, $data); |
60
|
|
|
} |
61
|
|
|
|
62
|
|
|
/** |
63
|
|
|
* @param string $url |
64
|
|
|
* @param array $data |
65
|
|
|
* @return array|null |
66
|
|
|
* @throws \Fenerum\API\Exceptions\FenerumApiException |
67
|
|
|
*/ |
68
|
|
|
public function patch(string $url, array $data): ?array |
69
|
|
|
{ |
70
|
|
|
return $this->request('PATCH', $url, $data); |
71
|
|
|
} |
72
|
|
|
|
73
|
|
|
/** |
74
|
|
|
* @param string $url |
75
|
|
|
* @return array|null |
76
|
|
|
* @throws \Fenerum\API\Exceptions\FenerumApiException |
77
|
|
|
*/ |
78
|
|
|
public function delete(string $url): ?array |
79
|
|
|
{ |
80
|
|
|
return $this->request('DELETE', $url); |
81
|
|
|
} |
82
|
|
|
|
83
|
|
|
/** |
84
|
|
|
* Send Request. |
85
|
|
|
* |
86
|
|
|
* @param string $method |
87
|
|
|
* @param string $uri |
88
|
|
|
* @param array|null $payload |
89
|
|
|
* @param array $headers |
90
|
|
|
* @return array|null |
91
|
|
|
* @throws \Fenerum\API\Exceptions\FenerumApiException |
92
|
|
|
*/ |
93
|
|
|
public function request(string $method, string $uri, $payload = null, array $headers = []): ?array |
94
|
|
|
{ |
95
|
|
|
if (! $this->isEnabled()) { |
96
|
|
|
$this->logger('is not enabled. Please review config'); |
97
|
|
|
|
98
|
|
|
return null; |
99
|
|
|
} |
100
|
|
|
|
101
|
|
|
try { |
102
|
|
|
$response = $this->client->request($method, $uri, [ |
103
|
|
|
'json' => $payload, |
104
|
|
|
'headers' => $headers, |
105
|
|
|
]); |
106
|
|
|
$this->logger("Request url: {$uri}", $payload ?? []); |
107
|
|
|
|
108
|
|
|
return json_decode($response->getBody()->getContents(), true); |
109
|
|
|
} catch (GuzzleException $exception) { |
110
|
|
|
$this->handleException($exception, $uri); |
111
|
|
|
} |
112
|
|
|
} |
113
|
|
|
|
114
|
|
|
/** |
115
|
|
|
* @param GuzzleException $exception |
116
|
|
|
* @param string $uri |
117
|
|
|
* @throws \Fenerum\API\Exceptions\FenerumApiException |
118
|
|
|
*/ |
119
|
|
|
private function handleException(GuzzleException $exception, string $uri): void |
120
|
|
|
{ |
121
|
|
|
$response = $exception->getResponse(); |
122
|
|
|
$code = $exception->getCode(); |
123
|
|
|
$body = $exception->getMessage(); |
124
|
|
|
|
125
|
|
|
if (null !== $response) { |
126
|
|
|
$code = $response->getStatusCode(); |
127
|
|
|
$body = $response->getBody()->getContents(); |
128
|
|
|
} |
129
|
|
|
|
130
|
|
|
$this->logger("Response Error: url: {$uri} Response: {$body}. Response code: $code."); |
131
|
|
|
|
132
|
|
|
throw new FenerumApiException($body, $code, $exception); |
133
|
|
|
} |
134
|
|
|
|
135
|
|
|
/** |
136
|
|
|
* Makes sure that all config objects are set before we can use this. |
137
|
|
|
* @return bool |
138
|
|
|
*/ |
139
|
|
|
private function isEnabled(): bool |
140
|
|
|
{ |
141
|
|
|
return null !== config('fenerum.base_uri') && null !== config('fenerum.api_token'); |
142
|
|
|
} |
143
|
|
|
|
144
|
|
|
/** |
145
|
|
|
* @param string $string |
146
|
|
|
* @param array|null $context |
147
|
|
|
*/ |
148
|
|
|
private function logger(string $string, ?array $context = []): void |
149
|
|
|
{ |
150
|
|
|
if (true === config('fenerum.debug')) { |
151
|
|
|
Log::debug(\get_class($this) . ' ' . $string, $context); |
|
|
|
|
152
|
|
|
} |
153
|
|
|
} |
154
|
|
|
} |
155
|
|
|
|
This check looks at variables that have been passed in as parameters and are passed out again to other methods.
If the outgoing method call has stricter type requirements than the method itself, an issue is raised.
An additional type check may prevent trouble.