dawarich/app/services/reverse_geocoding/points/fetch_data.rb

56 lines
1.6 KiB
Ruby
Raw Normal View History

2024-07-12 15:59:03 -04:00
# frozen_string_literal: true
2024-08-05 15:23:08 -04:00
class ReverseGeocoding::Points::FetchData
2024-07-12 15:59:03 -04:00
attr_reader :point
def initialize(point_id)
@point = Point.find(point_id)
rescue ActiveRecord::RecordNotFound => e
ExceptionReporter.call(e)
2024-07-12 15:59:03 -04:00
Rails.logger.error("Point with id #{point_id} not found: #{e.message}")
end
def call
return if point.reverse_geocoded?
2024-07-12 15:59:03 -04:00
2024-12-17 06:56:21 -05:00
update_point_with_geocoding_data
end
private
def update_point_with_geocoding_data
response = Geocoder.search([point.lat, point.lon]).first
2024-07-12 15:59:03 -04:00
return if response.blank? || response.data['error'].present?
2025-06-26 13:24:40 -04:00
country_record = Country.find_or_create_by(name: response.country) do |country|
2025-06-30 16:08:34 -04:00
iso_a2, iso_a3 = extract_iso_codes(response)
country.iso_a2 = iso_a2
country.iso_a3 = iso_a3
2025-06-26 13:24:40 -04:00
country.geom = "MULTIPOLYGON (((0 0, 1 0, 1 1, 0 1, 0 0)))"
end if response.country
point.update!(
city: response.city,
2025-06-26 13:24:40 -04:00
country_id: country_record&.id,
geodata: response.data,
reverse_geocoded_at: Time.current
)
2024-07-12 15:59:03 -04:00
end
2025-06-30 16:08:34 -04:00
def extract_iso_codes(response)
# First, try to get the ISO A2 code from the Geocoder response
iso_a2 = response.data.dig('properties', 'countrycode')&.upcase
if iso_a2.present?
# If we have a valid ISO A2 code, get the corresponding ISO A3 code
iso_a3 = Countries::IsoCodeMapper.iso_a3_from_a2(iso_a2)
return [iso_a2, iso_a3] if iso_a3.present?
end
# If no valid ISO code from Geocoder, try to match the country name
# This will return proper ISO codes if the country name is recognized
Countries::IsoCodeMapper.fallback_codes_from_country_name(response.country)
end
2024-07-12 15:59:03 -04:00
end