diff --git a/app/controllers/api/locale.php b/app/controllers/api/locale.php index 581008511e..b79416bfb6 100644 --- a/app/controllers/api/locale.php +++ b/app/controllers/api/locale.php @@ -1,9 +1,7 @@ inject('request') ->inject('response') ->inject('locale') - ->inject('geodb') - ->inject('geodbClient') - ->action(function (Request $request, Response $response, Locale $locale, Reader $geodb, Client $geodbClient) { - $eu = Config::getParam('locale-eu'); - $currencies = Config::getParam('locale-currencies'); - $output = []; - $ip = $request->getIP(); + ->inject('geoRecord') + ->action(function (Request $request, Response $response, Locale $locale, array $geoRecord) { $time = (60 * 60 * 24 * 45); // 45 days cache - - $output['ip'] = $ip; - $currency = null; - - try { - $record = $geodbClient->fetch("/ips/{$ip}", Client::METHOD_GET); - $record = $record->json(); - $output['countryCode'] = $record['countryCode']; - $output['country'] = $locale->getText('countries.' . strtolower($record['countryCode']), $locale->getText('locale.country.unknown')); - $output['continent'] = $locale->getText('continents.' . strtolower($record['continentCode']), $locale->getText('locale.country.unknown')); - $output['continentCode'] = $record['continentCode']; - $output['eu'] = (\in_array($record['countryCode'], $eu)) ? true : false; - - foreach ($currencies as $code => $element) { - if (isset($element['locations']) && isset($element['code']) && \in_array($record['countryCode'], $element['locations'])) { - $currency = $element['code']; - } - } - - $output['currency'] = $currency; - } catch (Exception $e) { - // Fallback to hosted geodb - $record = $geodb->get($ip); - if ($record) { - $output['countryCode'] = $record['country']['iso_code']; - $output['country'] = $locale->getText('countries.' . strtolower($record['country']['iso_code']), $locale->getText('locale.country.unknown')); - $output['continent'] = $locale->getText('continents.' . strtolower($record['continent']['code']), $locale->getText('locale.country.unknown')); - $output['continentCode'] = $record['continent']['code']; - $output['eu'] = (\in_array($record['country']['iso_code'], $eu)) ? true : false; - - foreach ($currencies as $code => $element) { - if (isset($element['locations']) && isset($element['code']) && \in_array($record['country']['iso_code'], $element['locations'])) { - $currency = $element['code']; - } - } - - $output['currency'] = $currency; - } - } - - if (!$record) { - $output['countryCode'] = '--'; - $output['country'] = $locale->getText('locale.country.unknown'); - $output['continent'] = $locale->getText('locale.country.unknown'); - $output['continentCode'] = '--'; - $output['eu'] = false; - $output['currency'] = $currency; - } - + $output = $geoRecord; $response ->addHeader('Cache-Control', 'public, max-age=' . $time) ->addHeader('Expires', \date('D, d M Y H:i:s', \time() + $time) . ' GMT') // 45 days cache diff --git a/app/init.php b/app/init.php index 9217485b4f..6906c1522c 100644 --- a/app/init.php +++ b/app/init.php @@ -1624,6 +1624,10 @@ App::setResource('geodb', function ($register) { return $register->get('geodb'); }, ['register']); +App::setResource('ip', function ($request) { + return $request->getIp(); +}, ['request']); + App::setResource('geodbClient', function () { $client = new Client(); $client->addHeader('Authorization', 'Bearer ' . System::getEnv('_APP_GEO_SECRET')); @@ -1631,6 +1635,65 @@ App::setResource('geodbClient', function () { return $client; }); +App::setResource('geoRecordDocker', function ($ip, $geodbClient) { + $record = null; + try { + $record = $geodbClient->fetch("/ips/{$ip}", Client::METHOD_GET); + $record = $record->json(); + } catch (Throwable $th) { + Console::error($th->getMessage()); + Console::error($th->getTraceAsString()); + $record = null; + } + + return $record; +}); + +App::setResource('geoRecordEmbeded', function ($ip, $geodb) { + $record = $geodb->get($ip); + $output = null; + if ($record) { + $output['countryCode'] = $record['country']['iso_code']; + $output['country'] = $record['country']['names']; + $output['continent'] = $record['continent']['names']; + $output['continentCode'] = $record['continent']['code']; + } + return $output; +}, ['ip', 'geodb']); + +App::setResource('geoRecord', function ($geoRecordDocker, $geoRecordEmbeded, $locale, $ip) { + $record = $geoRecordDocker ??= $geoRecordEmbeded; + $eu = Config::getParam('locale-eu'); + $currencies = Config::getParam('locale-currencies'); + + $output = []; + $output['ip'] = $ip; + $currency = null; + if (!empty($geoRecord)) { + $output['countryCode'] = $record['countryCode']; + $output['country'] = $locale->getText('countries.' . strtolower($record['countryCode']), $locale->getText('locale.country.unknown')); + $output['continent'] = $locale->getText('continents.' . strtolower($record['continentCode']), $locale->getText('locale.country.unknown')); + $output['continentCode'] = $record['continentCode']; + $output['eu'] = (\in_array($record['countryCode'], $eu)) ? true : false; + + foreach ($currencies as $code => $element) { + if (isset($element['locations']) && isset($element['code']) && \in_array($record['countryCode'], $element['locations'])) { + $currency = $element['code']; + } + } + + $output['currency'] = $currency; + } else { + $output['countryCode'] = '--'; + $output['country'] = $locale->getText('locale.country.unknown'); + $output['continent'] = $locale->getText('locale.country.unknown'); + $output['continentCode'] = '--'; + $output['eu'] = false; + $output['currency'] = $currency; + } + return $output; +}, ['geoRecordDocker', 'geoRecordEmbeded', 'locale', 'ip']); + App::setResource('passwordsDictionary', function ($register) { /** @var Utopia\Registry\Registry $register */ return $register->get('passwordsDictionary');