Submit social housing lettings and sales data (CORE)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

27 lines
1.0 KiB

class PostcodeService
def lookup(postcode)
# Avoid network calls when postcode is invalid
return unless postcode.match(POSTCODE_REGEXP)
result = nil
begin
# URI encoding only supports ASCII characters
ascii_postcode = self.class.clean(postcode)
response = Excon.get("https://api.postcodes.io/postcodes/#{ascii_postcode}", idempotent: true, timeout: 30, expects: [200])
parsed_response = JSON.parse(response.body)
result = {
location_code: parsed_response["result"]["codes"]["admin_district"],
location_admin_district: parsed_response["result"]["admin_district"],
}
rescue Excon::Error => e
Rails.logger.warn("Postcode lookup request was not successful: #{e} #{e.response.body}")
rescue StandardError => e
Rails.logger.error("Unexpected error with postcode lookup request: #{e}")
end
result
end
def self.clean(postcode)
postcode.encode("ASCII", "UTF-8", invalid: :replace, undef: :replace, replace: "").delete(" ").upcase
end
end