class AddressSearchController < ApplicationController before_action :authenticate_user! def index query = params[:query] if query.match?(/\A\d+\z/) && query.length > 5 # Query is all numbers and greater than 5 digits, assume it's a UPRN service = UprnClient.new(query) service.call if service.error.present? render json: { error: service.error }, status: :unprocessable_entity else render json: [{ address: service.result["ADDRESS"], uprn: service.result["UPRN"] }] end elsif query.match?(/[a-zA-Z]/) # Query contains letters, assume it's an address service = AddressClient.new(query) service.call if service.error.present? render json: { error: service.error }, status: :unprocessable_entity else render json: service.result.map { |result| { address: result["ADDRESS"], uprn: result["UPRN"] } } end else # Query is ambiguous, use both APIs and merge results address_service = AddressClient.new(query) uprn_service = UprnClient.new(query) address_service.call uprn_service.call results = (address_service.result || []) + (uprn_service.result || []) if address_service.error.present? && uprn_service.error.present? render json: { error: "Address and UPRN are not recognised. Check the input." }, status: :unprocessable_entity else render json: results.map { |result| { address: result["ADDRESS"], uprn: result["UPRN"] } } end end end def manual_input log = params[:log_type] == "lettings_log" ? LettingsLog.find(params[:log_id]) : SalesLog.find(params[:log_id]) log.update!(uprn: nil, uprn_known: 0, uprn_confirmed: nil, address_search: nil) redirect_to manual_address_link(log) end def search_input log = params[:log_type] == "lettings_log" ? LettingsLog.find(params[:log_id]) : SalesLog.find(params[:log_id]) if log.log_type == "lettings_log" log.update!(uprn: nil, uprn_known: 0, uprn_confirmed: nil, address_search: nil, address_line1: nil, address_line2: nil, town_or_city: nil, county: nil, postcode_full: nil, is_la_inferred: false) else log.update!(uprn: nil, uprn_known: 0, uprn_confirmed: nil, address_search: nil, address_line1: nil, address_line2: nil, town_or_city: nil, county: nil, postcode_full: nil, is_la_inferred: false, pcode1: nil, pcode2: nil) end redirect_to search_address_link(log) end private def manual_address_link(log) base_url = send("#{log.log_type}_url", log) "#{base_url}/address" end def search_address_link(log) base_url = send("#{log.log_type}_url", log) "#{base_url}/address-search" end end