Module: Callcredit::Validations

Defined in:
lib/callcredit/validations.rb

Constant Summary collapse

VALIDATIONS =
{
  date_of_birth:     ->(val) { clean_date_of_birth(val) },
  title:             ->(val) { val || "Unknown" },
  first_name:        ->(val) { clean_name(val, :first_name) },
  last_name:         ->(val) { clean_name(val, :last_name) },
  middle_names:      ->(val) { clean_name(val, :middle_names) },
  postcode:          ->(val) { clean_postcode(val, :postcode) },
  previous_postcode: ->(val) { clean_postcode(val, :previous_postcode) },
  account_number:    ->(val) { (val) },
  sort_code:         ->(val) { clean_sort_code(val) },
}

Class Method Summary collapse

Class Method Details

.clean_account_number(account_number) ⇒ Object



43
44
45
46
47
48
49
50
# File 'lib/callcredit/validations.rb', line 43

def self.()
  return unless 
  cleaned_value = .to_s.gsub(/[-\s]/, '')
  unless cleaned_value =~ /\A\d{6,8}\z/
    input_error(:account_number, )
  end
  cleaned_value
end

.clean_date_of_birth(date_of_birth) ⇒ Object



20
21
22
23
24
25
26
# File 'lib/callcredit/validations.rb', line 20

def self.clean_date_of_birth(date_of_birth)
  return unless date_of_birth
  date_of_birth = Date.parse(date_of_birth) if date_of_birth.is_a? String
  date_of_birth.strftime("%d/%m/%Y")
rescue
  input_error(:date_of_birth, date_of_birth)
end

.clean_name(name, param) ⇒ Object



28
29
30
31
32
33
34
# File 'lib/callcredit/validations.rb', line 28

def self.clean_name(name, param)
  return unless name
  # Convert name to ASCII characters only
  name = UnicodeUtils.nfkd(name).gsub(/(\p{Letter})\p{Mark}+/, '\\1')
  input_error(param, name) unless name =~ /\A[a-z A-Z'-]{1,30}\z/
  name
end

.clean_param(key, value) ⇒ Object



15
16
17
18
# File 'lib/callcredit/validations.rb', line 15

def self.clean_param(key, value)
  validator = VALIDATIONS.fetch(key, ->(val) { val })
  validator.call(value)
end

.clean_postcode(postcode, param) ⇒ Object



36
37
38
39
40
41
# File 'lib/callcredit/validations.rb', line 36

def self.clean_postcode(postcode, param)
  return unless postcode
  postcode = postcode.upcase.strip
  input_error(param, postcode) unless postcode =~ /\A[A-Z 0-9]{5,8}\z/
  postcode
end

.clean_sort_code(sort_code) ⇒ Object



52
53
54
55
56
57
# File 'lib/callcredit/validations.rb', line 52

def self.clean_sort_code(sort_code)
  return unless sort_code
  cleaned_value = sort_code.to_s.gsub(/[-\s]/, '')
  input_error(:sort_code, sort_code) unless cleaned_value =~ /\A\d{6}\z/
  cleaned_value
end

.input_error(param, value = nil) ⇒ Object



59
60
61
62
63
64
65
66
67
# File 'lib/callcredit/validations.rb', line 59

def self.input_error(param, value = nil)
  msg = if value.nil?
          "#{param} is a required param"
        else
          "Invalid value \"#{value}\" for #{param}"
        end

  raise InvalidRequestError.new(msg, param)
end