require "net/http" class UprnClient attr_reader :uprn attr_accessor :error ADDRESS = "api.os.uk".freeze PATH = "/search/places/v1/uprn".freeze def initialize(uprn) @uprn = uprn end def call unless response.is_a?(Net::HTTPSuccess) && result.present? @error = "UPRN is not recognised. Check the number, or enter the address." end rescue JSON::ParserError @error = "UPRN is not recognised. Check the number, or enter the address." end def result @result ||= JSON.parse(response.body).dig("results", 0, "DPA") || JSON.parse(response.body).dig("results", 0, "LPI") end private def http_client client = Net::HTTP.new(ADDRESS, 443) client.use_ssl = true client.verify_mode = OpenSSL::SSL::VERIFY_PEER client.max_retries = 3 client.read_timeout = 30 # seconds client end def endpoint_uri uri = URI(PATH) params = { uprn:, key: ENV["OS_DATA_KEY"], dataset: %w[DPA LPI].join(","), } uri.query = URI.encode_www_form(params) uri.to_s end def response @response ||= http_client.request_get(endpoint_uri) end end