class PostcodeValidation::UseCase::ValidateAddress

Attributes

address_match_gateway[R]
country[R]
logger[R]
postcode[R]

Public Class Methods

new(address_match_gateway:, logger: nil) click to toggle source
# File lib/postcode_validation/use_case/validate_address.rb, line 6
def initialize(address_match_gateway:, logger: nil)
  @format_validator = FormatValidator.new
  @address_match_gateway = address_match_gateway
  @logger = logger
end

Public Instance Methods

execute(postcode:, country:) click to toggle source
# File lib/postcode_validation/use_case/validate_address.rb, line 12
def execute(postcode:, country:)
  @errors = []
  check_country(country)

  postcode = postcode_without_spaces(postcode)
  return the_postcode_is_valid if use_local_validator?(country) && format_valid_for_country?(country, postcode)

  check_postcode_format(postcode, country)
  result = matched_addresses(postcode, country)

  check_matched_addresses(result)

  result_payload(result, postcode)
rescue PostcodeValidation::Error::RequestError => e
  gracefully_handle_error(e)
end

Private Instance Methods

check_country(country) click to toggle source
# File lib/postcode_validation/use_case/validate_address.rb, line 56
def check_country(country)
  @errors << 'no_country_provided' if country.nil?
end
check_matched_addresses(result) click to toggle source
# File lib/postcode_validation/use_case/validate_address.rb, line 52
def check_matched_addresses(result)
  @errors << 'no_matches' if result.first.nil?
end
check_postcode_format(postcode, country) click to toggle source
# File lib/postcode_validation/use_case/validate_address.rb, line 60
def check_postcode_format(postcode, country)
  return if country.nil?
  @errors << 'invalid_format' unless format_valid_for_country?(country, postcode)
end
format_check_only?(validator) click to toggle source
# File lib/postcode_validation/use_case/validate_address.rb, line 78
def format_check_only?(validator)
  validator.format_check_only?
end
format_valid?(postcode, validator) click to toggle source
# File lib/postcode_validation/use_case/validate_address.rb, line 70
def format_valid?(postcode, validator)
  validator.valid?(postcode)
end
format_valid_for_country?(country, postcode) click to toggle source
# File lib/postcode_validation/use_case/validate_address.rb, line 65
def format_valid_for_country?(country, postcode)
  validator = @format_validator.for(country)
  format_valid?(postcode, validator)
end
gracefully_handle_error(error) click to toggle source
# File lib/postcode_validation/use_case/validate_address.rb, line 82
def gracefully_handle_error(error)
  on_error(error)
  { valid?: true, reason: ['unable_to_reach_service'] }
end
matched_addresses(postcode, country) click to toggle source
# File lib/postcode_validation/use_case/validate_address.rb, line 47
def matched_addresses(postcode, country)
  @address_match_gateway.query(search_term: postcode,
                               country: country)
end
on_error(e) click to toggle source
# File lib/postcode_validation/use_case/validate_address.rb, line 43
def on_error(e)
  logger.error(e) unless logger.nil?
end
postcode_without_spaces(postcode) click to toggle source
# File lib/postcode_validation/use_case/validate_address.rb, line 87
def postcode_without_spaces(postcode)
  postcode.gsub(' ', '')
end
result_payload(result, postcode) click to toggle source
# File lib/postcode_validation/use_case/validate_address.rb, line 33
def result_payload(result, postcode)
  return { valid?: false, reason: @errors } unless @errors.empty?

  result.each do |address|
    return the_postcode_is_valid if address.postcode_matches? postcode
  end

  { valid?: false, reason: ['no_postcode_matches_found'] }
end
the_postcode_is_valid() click to toggle source
# File lib/postcode_validation/use_case/validate_address.rb, line 91
def the_postcode_is_valid
  { valid?: true, reason: ['valid_postcode'] }
end
use_local_validator?(country) click to toggle source
# File lib/postcode_validation/use_case/validate_address.rb, line 74
def use_local_validator?(country)
  format_check_only?(@format_validator.for(country))
end