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