Created service to resolve IP locations

This commit is contained in:
Alejandro Celaya 2016-07-20 12:37:48 +02:00
parent 06fa33877b
commit d3c2f4ed2a
3 changed files with 63 additions and 0 deletions

View File

@ -0,0 +1,10 @@
<?php
namespace Shlinkio\Shlink\Common\Exception;
class WrongIpException extends RuntimeException
{
public static function fromIpAddress($ipAddress, \Exception $prev = null)
{
return new self(sprintf('Provided IP "%s" is invalid', $ipAddress), 0, $prev);
}
}

View File

@ -0,0 +1,42 @@
<?php
namespace Shlinkio\Shlink\Common\Service;
use Acelaya\ZsmAnnotatedServices\Annotation\Inject;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
use Shlinkio\Shlink\Common\Exception\WrongIpException;
class IpLocationResolver implements IpLocationResolverInterface
{
const SERVICE_PATTERN = 'http://freegeoip.net/json/%s';
/**
* @var Client
*/
private $httpClient;
/**
* IpLocationResolver constructor.
* @param Client $httpClient
*
* @Inject({"httpClient"})
*/
public function __construct(Client $httpClient)
{
$this->httpClient = $httpClient;
}
/**
* @param $ipAddress
* @return array
*/
public function resolveIpLocation($ipAddress)
{
try {
$response = $this->httpClient->get(sprintf(self::SERVICE_PATTERN, $ipAddress));
return json_decode($response->getBody(), true);
} catch (GuzzleException $e) {
throw WrongIpException::fromIpAddress($ipAddress, $e);
}
}
}

View File

@ -0,0 +1,11 @@
<?php
namespace Shlinkio\Shlink\Common\Service;
interface IpLocationResolverInterface
{
/**
* @param $ipAddress
* @return array
*/
public function resolveIpLocation($ipAddress);
}