class Services::Infrastructure::Adapters::Geocode::GoogleGeocode
Google Geocode API Adapter
Fetches geocoding data from the Google Geocode API. Responses are cached for 7 days per address.
Example
adapter = Services::Infrastructure::Adapters::Geocode::GoogleGeocode.new response = adapter.call("São Paulo, Brazil") response.latitude # => -23.5505 response.longitude # => -46.6333 response.zipcode # => "01310-100" response.source # => :api_response
Constants
- BASE_URL
Public Class Methods
Source
# File app/services/infrastructure/adapters/geocode/google_geocode.rb 28 def initialize 29 @api_key = Rails.configuration.weather_app.google_places_api_key 30 @cache = Rails.cache 31 end
Public Instance Methods
Source
# File app/services/infrastructure/adapters/geocode/google_geocode.rb 47 def call(address) 48 uri = URI.parse(BASE_URL) 49 uri.query = URI.encode_www_form({ 50 key: @api_key, 51 address: address 52 }) 53 54 cached_response = @cache.read("google_geocode_#{address}") 55 return GoogleGeocodeResponse.new(cached_response, :cached_response) if cached_response.present? 56 57 response = Net::HTTP.get_response(uri) 58 raise Error, "Failed to fetch Google Geocode data" unless response.is_a?(Net::HTTPSuccess) 59 60 response_data = JSON.parse(response.body) 61 raise NotFoundError, "No Google Geocode data found for address: #{address}" if response_data["status"] == "ZERO_RESULTS" 62 63 @cache.write("google_geocode_#{address}", response_data, expires_in: 7.days) 64 GoogleGeocodeResponse.new(response_data, :api_response) 65 end
Calls the Google Geocode API and returns a GoogleGeocodeResponse.
Parameters
-
address (
String) — Address or place name to geocode.
Returns
-
GoogleGeocodeResponsewithlatitude,longitude,zipcodeandsource(:api_responseor:cached_response).
Raises
-
NotFoundErrorwhen the API returns no results for the address. -
Errorwhen the HTTP request fails.