File: /var/www/quadcode/app/Helpers/GeoHelper.php
<?php
namespace App\Helpers;
use Exception;
use GeoIp2\Database\Reader;
use GeoIp2\Exception\AddressNotFoundException;
use Illuminate\Support\Facades\Log;
use Psr\Log\LoggerInterface;
class GeoHelper
{
const LOG_CHANNEL = 'geoIp';
private LoggerInterface $logger;
private string $path;
private ?string $error = null;
public function __construct()
{
$this->logger = Log::channel(self::LOG_CHANNEL);
$this->path = env('MAX_MIND_PATH');
}
private function error(string $error, array $data = []): void
{
$this->error = $error;
$this->logger->error($error, $data);
}
public function getError(): ?string
{
return $this->error;
}
public function getGeo(): ?string
{
$IP = $_SERVER['REMOTE_ADDR'] ?? null;
if (empty($IP)) {
$this->error('IP not found', $_SERVER);
return null;
}
if (empty($this->path) || !file_exists($this->path)) {
$this->error('Database not found', ['path' => $this->path]);
return null;
}
if (AppHelper::isTest() && str_starts_with($IP, '192.168.')) {
return 'BR';
}
try {
$record = (new Reader($this->path))->city($IP);
} catch (AddressNotFoundException) {
$this->error('Address not found in database', ['ip' => $IP]);
return null;
} catch (Exception $exception) {
$this->error(AppHelper::isTest() ? $exception->getMessage() : 'Unexpected exception');
return null;
}
return $record->country->isoCode;
}
}