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
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
|
|
|