Passed
Push — master ( 75a5a1...f82d0e )
by Carsten
04:19 queued 11s
created

HttpClientLocationCreator::setApiEndpoint()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 5
ccs 3
cts 3
cp 1
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 1
crap 1
1
<?php
2
namespace Germania\ClientIpLocation;
3
4
use Psr\Http\Client\ClientInterface;
5
use Psr\Http\Client\ClientExceptionInterface;
6
use Psr\Http\Client\RequestExceptionInterface;
7
8
use Psr\Http\Message\RequestInterface;
9
use Psr\Http\Message\RequestFactoryInterface;
10
use Psr\Http\Message\ResponseInterface;
11
12
use Psr\Log\LoggerInterface;
13
use Psr\Log\NullLogger;
14
use Psr\Log\LogLevel;
15
use Psr\Log\LoggerAwareTrait;
16
17
class HttpClientLocationCreator
18
{
19 1
    use LoggerAwareTrait;
20
21
    /**
22
     * @var ClientInterface
23
     */
24
    protected $client;
25
26
27
    /**
28
     * @var RequestFactoryInterface
29
     */
30
    public $request_factory;
31
32
33
    /**
34
     * Geocoder API endpoint.
35
     *
36
     * @var string
37
     */
38
    public $api;
39
40
41
    /**
42
     * IP adress query parameter
43
     *
44
     * @var string
45
     */
46
    public $ip_var_name = "ip";
47
48
49
    /**
50
     * @var callable
51
     */
52
    public $response_decoder;
53
54
55
    /**
56
     * @var mixed
57
     */
58
    public $default_location;
59
60
61
    /**
62
     * @var string
63
     */
64
    protected $error_loglevel = LogLevel::ERROR;
65
66
67
    /**
68
     * @param string                  $api              Geocoder API endpoint
69
     * @param ClientInterface         $client           PSR-18 HTTP Client
70
     * @param RequestFactoryInterface $request_factory  PSR-17 Request factory
71
     * @param callable|null           $response_decoder Optional: PSR-7 Response decoder callable
72
     */
73 2
    public function __construct( string $api, ClientInterface $client, RequestFactoryInterface $request_factory, callable $response_decoder = null, LoggerInterface $logger = null)
74
    {
75 2
        $this->setApiEndpoint( $api )
76 2
             ->setClient($client)
77 2
             ->setRequestFactory($request_factory)
78 2
             ->setResponseDecoder($response_decoder)
79 2
             ->setLogger( $logger ?: new NullLogger);
80 2
    }
81
82
83
84
    /**
85
     * @param  string $client_ip Client IP address
86
     */
87 2
    public function __invoke( string $client_ip )
88
    {
89 2
        $request = $this->createRequest($client_ip);
90
91
        try {
92 2
            $response = $this->client->sendRequest( $request);
93 2
            return $this->decodeResponse($response);
94
        }
95
        catch (ClientExceptionInterface $e) {
96
            $msg = $e->getMessage();
97
            $msg_location = sprintf("%s:%s", $e->getFile(), $e->getLine());
98
            $this->logger->log( $this->error_loglevel, $msg, [
99
                'exception' => get_class($e),
100
                'location' => $msg_location,
101
                'apiEndpoint' => $this->api,
102
                'clientIp' => $client_ip
103
            ]);
104
105
            return $this->default_location;
106
        }
107
    }
108
109
110
111
    /**
112
     * @param  string $client_ip Client IP address
113
     * @return RequestInterface
114
     */
115 4
    public function createRequest( string $client_ip ) : RequestInterface
116
    {
117 4
        $client_ip_urlencoded = urlencode($client_ip);
118 4
        $query_parameter_field = "{{" . $this->ip_var_name . "}}";
119
120 4
        $api = str_replace($query_parameter_field, $client_ip_urlencoded, $this->api);
121
122 4
        return $this->request_factory->createRequest("GET", $api);
123
    }
124
125
126
127
    /**
128
     * @param  ResponseInterface $response
129
     * @return mixed
130
     */
131 4
    public function decodeResponse(ResponseInterface $response)
132
    {
133 4
        return $this->response_decoder
134 4
        ? ($this->response_decoder)($response)
135 4
        : json_decode($response->getBody(), "assoc");
136
    }
137
138
139
140
    /**
141
     * Sets the default location to return on error
142
     *
143
     * @param mixed $location
144
     */
145 2
    public function setDefaultLocation( $location ) : self
146
    {
147 2
        $this->default_location = $location;
148 2
        return $this;
149
    }
150
151
152
153
    /**
154
     * Sets the API endpoint
155
     *
156
     * @param string $api
157
     */
158 4
    public function setApiEndpoint( string $api ) : self
159
    {
160 4
        $this->api = $api;
161 4
        return $this;
162
    }
163
164
165
166
    /**
167
     * Sets the HTTP Client to use.
168
     *
169
     * @param ClientInterface $client
170
     */
171 6
    public function setClient( ClientInterface $client ) : self
172
    {
173 6
        $this->client = $client;
174 6
        return $this;
175
    }
176
177
178
    /**
179
     * Sets the PSR-17 Request factory
180
     *
181
     * @param RequestFactoryInterface $request_factory
182
     */
183 4
    public function setRequestFactory( RequestFactoryInterface $request_factory ) : self
184
    {
185 4
        $this->request_factory = $request_factory;
186 4
        return $this;
187
    }
188
189
190
    /**
191
     * Sets the PSR-7 Response decoder callable.
192
     *
193
     * @param callable $response_decoder
194
     */
195 4
    public function setResponseDecoder( callable $response_decoder = null ) : self
196
    {
197 4
        $this->response_decoder = $response_decoder;
198 4
        return $this;
199
    }
200
201
}
202