geoLiteDbReader = $geoLiteDbReader; } /** * @param string $ipAddress * @return array * @throws WrongIpException */ public function resolveIpLocation(string $ipAddress): array { try { $city = $this->geoLiteDbReader->city($ipAddress); return $this->mapFields($city); } catch (AddressNotFoundException $e) { throw WrongIpException::fromIpAddress($ipAddress, $e); } catch (InvalidDatabaseException $e) { throw new WrongIpException('Provided GeoLite2 db file is invalid', 0, $e); } } private function mapFields(City $city): array { return [ 'country_code' => $city->country->isoCode ?? '', 'country_name' => $city->country->name ?? '', 'region_name' => $city->mostSpecificSubdivision->name ?? '', 'city' => $city->city->name ?? '', 'latitude' => (string) $city->location->latitude, // FIXME Cast to string for BC compatibility 'longitude' => (string) $city->location->longitude, // FIXME Cast to string for BC compatibility 'time_zone' => $city->location->timeZone ?? '', ]; } /** * Returns the interval in seconds that needs to be waited when the API limit is reached * * @return int */ public function getApiInterval(): int { return 0; } /** * Returns the limit of requests that can be performed to the API in a specific interval, or null if no limit exists * * @return int|null */ public function getApiLimit(): ?int { return null; } }