-
Notifications
You must be signed in to change notification settings - Fork 48
/
errors.rb
113 lines (98 loc) · 2.9 KB
/
errors.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# rubocop:disable Metrics/AbcSize
# rubocop:disable Metrics/MethodLength
# rubocop:disable Metrics/PerceivedComplexity
# rubocop:disable Metrics/CyclomaticComplexity
# rubocop:disable Metrics/ParameterLists
module Adyen
class AdyenError < StandardError
attr_reader :code, :response, :request, :msg
def initialize(request = nil, response = nil, msg = nil, code = nil)
unless request.nil?
request = request.is_a?(Hash) ? request : JSON.parse(request, symbolize_names: true)
mask_fields(request)
end
# components of formatted error message
attributes = {
code: code,
msg: msg,
request: request,
response: response
}.select { |_k, v| v }.map { |k, v| "#{k}:#{v}" }.join(', ')
message = "#{self.class.name} #{attributes}"
super(message)
# internal variables
@code = code
@response = response
@request = request
@msg = msg
end
# mask PCI data in request
def mask_fields(request)
return if request.nil?
# sensitive fields
fields_to_mask = %i[
expiryMonth
expiryYear
encryptedCardNumber
encryptedExpiryMonth
encryptedExpiryYear
encryptedSecurityCode
]
# convert to hash if necessary
request = request.is_a?(Hash) ? request : JSON.parse(request, symbolize_names: true)
# iterate through request to find fields to mask
request.each do |k, v|
if request[k].is_a?(Hash)
# recursively traverse multi-level hashes
mask_fields(request[k])
elsif k == :number
request[k] = "#{v[0, 6]}******#{v[12, 16]}"
# show first 6 and last 4 for cards
elsif k == :cvc
# show length of cvc for debugging
request[k] = '*' * v.length
elsif fields_to_mask.include? k
# generic mask for other fields
request[k] = '***'
end
end
end
end
class AuthenticationError < AdyenError
def initialize(msg, request)
super(request, nil, msg, 401)
end
end
class PermissionError < AdyenError
def initialize(msg, request, response)
super(request, response, msg, 403)
end
end
class FormatError < AdyenError
def initialize(msg, request, response)
super(request, response, msg, 422)
end
end
class ServerError < AdyenError
def initialize(msg, request, response)
super(request, response, msg, 500)
end
end
class ConfigurationError < AdyenError
def initialize(msg, request)
super(request, nil, msg, 905)
end
end
class ValidationError < AdyenError
def initialize(msg, request)
super(request, nil, msg, nil)
end
end
# catchall for errors which don't have more specific classes
class APIError < AdyenError
def initialize(msg, request, response, code)
super(request, response, msg, code)
end
end
end
# rubocop:enable all