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(); |
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
|
|
|
|
Scrutinizer analyzes your
composer.json
/composer.lock
file if available to determine the classes, and functions that are defined by your dependencies.It seems like the listed class was neither found in your dependencies, nor was it found in the analyzed files in your repository. If you are using some other form of dependency management, you might want to disable this analysis.