theseus/app/services/geocoding_service/usps_facilities.rb

66 lines
2 KiB
Ruby

module GeocodingService
class USPSFacilities
class << self
SPECIAL_CASES = {
"001376" => {
lat: "40.6532171",
lon: "-73.7712486",
},
}
def coords_for_locale_key(locale_key, event = nil)
SPECIAL_CASES[locale_key] ||
Rails.cache.fetch("geocode_usps_facility_#{locale_key}", expires_in: 1.day) do
address = address_for_locale_key(locale_key)
if address
GeocodingService.first_hit(address) ||
GeocodingService.first_hit(address.slice(:city, :state, :postalcode, :country))
elsif event
# Fallback to event scan facility data when USPS facility lookup fails
facility = event.scan_facility
fallback_address = {
city: facility[:city],
state: facility[:state],
postalcode: facility[:zip],
country: "US",
}
Rails.logger.warn "USPS facility not found for locale_key #{locale_key}, falling back to scan facility data: #{fallback_address}"
GeocodingService.first_hit(fallback_address)
else
nil
end
end
end
def address_for_locale_key(locale_key)
facility = find_facility(locale_key)
return nil unless facility
{
street: facility["FACILITY ADDRESS"],
city: facility["FACILITY CITY"],
state: facility["FACILITY STATE"],
postalcode: facility["ZIP"][0...5],
country: "US",
}
end
def find_facility(locale_key)
facilities[locale_key]
end
private
def facilities
@facilities ||= load_facilities
end
def load_facilities
Rails.logger.info "Loading USPS facilities"
facilities_file = File.join(File.dirname(__FILE__), "FACILITY.xlsx")
xsv = Xsv.open(facilities_file, parse_headers: true).first
return xsv.to_a.index_by { |row| row["LOCALE KEY"] }
end
end
end
end