dawarich/app/services/reverse_geocoding/places/fetch_data.rb
2024-08-05 21:23:08 +02:00

65 lines
1.6 KiB
Ruby

# frozen_string_literal: true
class ReverseGeocoding::Places::FetchData
attr_reader :place
def initialize(place_id)
@place = Place.find(place_id)
rescue ActiveRecord::RecordNotFound => e
Rails.logger.error("Place with id #{place_id} not found: #{e.message}")
end
def call
return if place.reverse_geocoded?
if ENV['GOOGLE_PLACES_API_KEY'].blank?
Rails.logger.warn('GOOGLE_PLACES_API_KEY is not set')
return
end
data = Geocoder.search([place.latitude, place.longitude])
google_place_ids = data.map { _1.data['place_id'] }
first_place = google_places_client.spot(google_place_ids.shift)
update_place(first_place)
google_place_ids.each { |google_place_id| fetch_and_create_place(google_place_id) }
end
private
def google_places_client
@google_places_client ||= GooglePlaces::Client.new(ENV['GOOGLE_PLACES_API_KEY'])
end
def update_place(place)
place.update!(
name: place.name,
latitude: place.lat,
longitude: place.lng,
city: place.city,
country: place.country,
raw_data: place.raw_data,
source: :google_places,
reverse_geocoded_at: Time.zone.now
)
end
def fetch_and_create_place(place_id)
place_data = google_places_client.spot(place_id)
Place.create!(
name: place_data.name,
latitude: place_data.lat,
longitude: place_data.lng,
city: place_data.city,
country: place_data.country,
raw_data: place_data.raw_data,
source: :google_places
)
end
def reverse_geocoded?
place.geodata.present?
end
end