minfraud 1.0.2 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. checksums.yaml +5 -13
  2. data/.github/workflows/test.yml +46 -0
  3. data/.gitignore +2 -0
  4. data/.rubocop.yml +108 -0
  5. data/.travis.yml +19 -3
  6. data/CHANGELOG.md +65 -1
  7. data/CODE_OF_CONDUCT.md +4 -4
  8. data/Gemfile +11 -2
  9. data/LICENSE.txt +2 -1
  10. data/README.dev.md +4 -0
  11. data/README.md +245 -59
  12. data/Rakefile +18 -3
  13. data/bin/console +4 -3
  14. data/lib/maxmind/geoip2/model/city.rb +99 -0
  15. data/lib/maxmind/geoip2/model/country.rb +94 -0
  16. data/lib/maxmind/geoip2/model/insights.rb +38 -0
  17. data/lib/maxmind/geoip2/record/abstract.rb +46 -0
  18. data/lib/maxmind/geoip2/record/city.rb +62 -0
  19. data/lib/maxmind/geoip2/record/continent.rb +61 -0
  20. data/lib/maxmind/geoip2/record/country.rb +78 -0
  21. data/lib/maxmind/geoip2/record/location.rb +97 -0
  22. data/lib/maxmind/geoip2/record/maxmind.rb +41 -0
  23. data/lib/maxmind/geoip2/record/place.rb +52 -0
  24. data/lib/maxmind/geoip2/record/postal.rb +54 -0
  25. data/lib/maxmind/geoip2/record/represented_country.rb +47 -0
  26. data/lib/maxmind/geoip2/record/subdivision.rb +72 -0
  27. data/lib/maxmind/geoip2/record/traits.rb +233 -0
  28. data/lib/minfraud.rb +48 -8
  29. data/lib/minfraud/assessments.rb +118 -49
  30. data/lib/minfraud/components/account.rb +31 -9
  31. data/lib/minfraud/components/addressable.rb +73 -26
  32. data/lib/minfraud/components/base.rb +35 -11
  33. data/lib/minfraud/components/billing.rb +5 -0
  34. data/lib/minfraud/components/credit_card.rb +67 -18
  35. data/lib/minfraud/components/custom_inputs.rb +25 -0
  36. data/lib/minfraud/components/device.rb +51 -10
  37. data/lib/minfraud/components/email.rb +29 -7
  38. data/lib/minfraud/components/event.rb +60 -13
  39. data/lib/minfraud/components/order.rb +60 -22
  40. data/lib/minfraud/components/payment.rb +165 -21
  41. data/lib/minfraud/components/report/transaction.rb +80 -0
  42. data/lib/minfraud/components/shipping.rb +14 -5
  43. data/lib/minfraud/components/shopping_cart.rb +19 -12
  44. data/lib/minfraud/components/shopping_cart_item.rb +42 -13
  45. data/lib/minfraud/enum.rb +22 -8
  46. data/lib/minfraud/error_handler.rb +45 -12
  47. data/lib/minfraud/errors.rb +22 -2
  48. data/lib/minfraud/http_service.rb +22 -8
  49. data/lib/minfraud/http_service/request.rb +19 -18
  50. data/lib/minfraud/http_service/response.rb +49 -12
  51. data/lib/minfraud/model/abstract.rb +20 -0
  52. data/lib/minfraud/model/address.rb +52 -0
  53. data/lib/minfraud/model/billing_address.rb +11 -0
  54. data/lib/minfraud/model/credit_card.rb +75 -0
  55. data/lib/minfraud/model/device.rb +54 -0
  56. data/lib/minfraud/model/disposition.rb +35 -0
  57. data/lib/minfraud/model/email.rb +54 -0
  58. data/lib/minfraud/model/email_domain.rb +24 -0
  59. data/lib/minfraud/model/error.rb +28 -0
  60. data/lib/minfraud/model/factors.rb +24 -0
  61. data/lib/minfraud/model/geoip2_location.rb +25 -0
  62. data/lib/minfraud/model/insights.rb +68 -0
  63. data/lib/minfraud/model/ip_address.rb +82 -0
  64. data/lib/minfraud/model/issuer.rb +49 -0
  65. data/lib/minfraud/model/score.rb +76 -0
  66. data/lib/minfraud/model/score_ip_address.rb +23 -0
  67. data/lib/minfraud/model/shipping_address.rb +30 -0
  68. data/lib/minfraud/model/subscores.rb +178 -0
  69. data/lib/minfraud/model/warning.rb +63 -0
  70. data/lib/minfraud/report.rb +58 -0
  71. data/lib/minfraud/resolver.rb +25 -16
  72. data/lib/minfraud/validates.rb +187 -0
  73. data/lib/minfraud/version.rb +4 -1
  74. data/minfraud.gemspec +23 -18
  75. metadata +123 -48
@@ -1,20 +1,42 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Minfraud
2
4
  module Components
5
+ # Email corresponds to the email object of a minFraud request.
6
+ #
7
+ # @see https://dev.maxmind.com/minfraud/#Email_(/email)
3
8
  class Email < Base
4
- # @attribute address
5
- # @return [String] This field must be either a valid email address or an MD5 of the email used in the transaction
9
+ include Minfraud::Validates
10
+
11
+ # This field must be either be a valid email address or an MD5 of the
12
+ # lowercased email used in the transaction. Important: if using the MD5
13
+ # hash, please be sure to convert the email address to lowercase before
14
+ # calculating its MD5 hash.
15
+ #
16
+ # @return [String, nil]
6
17
  attr_accessor :address
7
18
 
8
- # @attribute domain
9
- # @return [String] The domain of the email address used in the transaction
19
+ # The domain of the email address used in the transaction.
20
+ #
21
+ # @return [String, nil]
10
22
  attr_accessor :domain
11
23
 
12
- # Creates Minfraud::Components::Email instance
13
- # @param [Hash] params hash of parameters
14
- # @return [Minfraud::Components::Email] an Email instance
24
+ # @param params [Hash] Hash of parameters. Each key/value should
25
+ # correspond to one of the available attributes.
15
26
  def initialize(params = {})
16
27
  @address = params[:address]
17
28
  @domain = params[:domain]
29
+
30
+ validate
31
+ end
32
+
33
+ private
34
+
35
+ def validate
36
+ return if !Minfraud.enable_validation
37
+
38
+ validate_email('email', @address)
39
+ validate_string('domain', 255, @domain)
18
40
  end
19
41
  end
20
42
  end
@@ -1,32 +1,79 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Minfraud
2
4
  module Components
5
+ # Event corresponds to the event object of a minFraud request.
6
+ #
7
+ # @see https://dev.maxmind.com/minfraud/#Event_(/event)
3
8
  class Event < Base
4
9
  include ::Minfraud::Enum
5
- # @attribute transaction_id
6
- # @return [String] Internal ID for the transaction. Used to locate a specific transaction in minFraud logs
10
+ include Minfraud::Validates
11
+
12
+ # Your internal ID for the transaction. MaxMind can use this to locate a
13
+ # specific transaction in logs, and it will also show up in email alerts
14
+ # and notifications from MaxMind to you. No specific format is required.
15
+ #
16
+ # @return [String, nil]
7
17
  attr_accessor :transaction_id
8
18
 
9
- # @attribute shop_id
10
- # @return [String] Internal ID for the shop, affiliate, or merchant this order is coming from
19
+ # Your internal ID for the shop, affiliate, or merchant this order is
20
+ # coming from. Required for minFraud users who are resellers, payment
21
+ # providers, gateways and affiliate networks. No specific format is
22
+ # required.
23
+ #
24
+ # @return [String, nil]
11
25
  attr_accessor :shop_id
12
26
 
13
- # @attribute time
14
- # @return [String] The date and time the event occurred. The string must be in the RFC 3339 date-time format.
15
- # If this field is not in the request, the current time will be used
27
+ # The date and time the event occurred. The string must be in the RFC
28
+ # 3339 date-time format, e.g., "2012-04-12T23:20:50.52Z". The time must
29
+ # be within the past 10 years. If this field is not in the request, the
30
+ # current time will be used.
31
+ #
32
+ # @see https://tools.ietf.org/html/rfc3339
33
+ #
34
+ # @return [String, nil]
16
35
  attr_accessor :time
17
36
 
18
- # @attribute type
19
- # @return [String] The type of event being scored
20
- enum_accessor :type, [:account_creation, :account_login, :purchase, :recurring_purchase, :referral, :survey]
37
+ # The type of event being scored. This must be one of
38
+ # +:account_creation+, +:account_login+, +:email_change+,
39
+ # +:password_reset+, +:payout_change+, +:purchase+,
40
+ # +:recurring_purchase+, +:referral+, or +:survey+.
41
+ #
42
+ # @!attribute type
43
+ #
44
+ # @return [Symbol, nil]
45
+ enum_accessor :type,
46
+ [
47
+ :account_creation,
48
+ :account_login,
49
+ :email_change,
50
+ :password_reset,
51
+ :payout_change,
52
+ :purchase,
53
+ :recurring_purchase,
54
+ :referral,
55
+ :survey,
56
+ ]
21
57
 
22
- # Creates Minfraud::Components::Event instance
23
- # @param [Hash] params hash of parameters
24
- # @return [Minfraud::Components::Event] an Event instance
58
+ # @param params [Hash] Hash of parameters. Each key/value should
59
+ # correspond to one of the available attributes.
25
60
  def initialize(params = {})
26
61
  @transaction_id = params[:transaction_id]
27
62
  @shop_id = params[:shop_id]
28
63
  @time = params[:time]
29
64
  self.type = params[:type]
65
+
66
+ validate
67
+ end
68
+
69
+ private
70
+
71
+ def validate
72
+ return if !Minfraud.enable_validation
73
+
74
+ validate_string('transaction_id', 255, @transaction_id)
75
+ validate_string('shop_id', 255, @shop_id)
76
+ validate_rfc3339('time', @time)
30
77
  end
31
78
  end
32
79
  end
@@ -1,50 +1,88 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Minfraud
2
4
  module Components
5
+ # Order corresponds to the order object of a minFraud request.
6
+ #
7
+ # @see https://dev.maxmind.com/minfraud/#Order_(/order)
3
8
  class Order < Base
4
- # @attribute amount
5
- # @return [Decimal] The total order amount for the transaction
9
+ include Minfraud::Validates
10
+
11
+ # The total order amount for the transaction before taxes and discounts.
12
+ # The value must be at least 0 and at most 1e14 - 1.
13
+ #
14
+ # @return [Float, nil]
6
15
  attr_accessor :amount
7
16
 
8
- # @attribute currency
9
- # @return [String] The ISO 4217 currency code for the currency used in the transaction
17
+ # The ISO 4217 currency code for the currency used in the transaction.
18
+ #
19
+ # @see https://en.wikipedia.org/wiki/ISO_4217
20
+ #
21
+ # @return [String, nil]
10
22
  attr_accessor :currency
11
23
 
12
- # @attribute discount_code
13
- # @return [String] The discount code applied to the transaction. If multiple discount codes are used,
14
- # please separate them with a comma.
24
+ # The discount code applied to the transaction. If multiple discount
25
+ # codes are used, please separate them with a comma.
26
+ #
27
+ # @return [String, nil]
15
28
  attr_accessor :discount_code
16
29
 
17
- # @attribute affiliate_id
18
- # @return [String] The ID of the affiliate where the order is coming from
30
+ # The ID of the affiliate where the order is coming from. No specific
31
+ # format is required.
32
+ #
33
+ # @return [String, nil]
19
34
  attr_accessor :affiliate_id
20
35
 
21
- # @attribute subaffiliate_id
22
- # @return [String] The ID of the sub-affiliate where the order is coming from
36
+ # The ID of the sub-affiliate where the order is coming from. No specific
37
+ # format is required.
38
+ #
39
+ # @return [String, nil]
23
40
  attr_accessor :subaffiliate_id
24
41
 
25
- # @attribute :referrer_uri
26
- # @return [String] The URI of the referring site for this order
42
+ # The URI of the referring site for this order. Needs to be absolute and
43
+ # have a URI scheme such as +https://+.
44
+ #
45
+ # @return [String, nil]
27
46
  attr_accessor :referrer_uri
28
47
 
29
- # @attribute :is_gift
30
- # @return [Boolean] Whether order was marked as a gift by the purchaser
48
+ # Whether order was marked as a gift by the purchaser.
49
+ #
50
+ # @return [Boolean, nil]
31
51
  attr_accessor :is_gift
32
52
 
33
- # @attribute :has_gift_message
34
- # @return [Boolean] Whether the purchaser included a gift message
53
+ # Whether the purchaser included a gift message.
54
+ #
55
+ # @return [Boolean, nil]
35
56
  attr_accessor :has_gift_message
36
57
 
37
- # Creates Minfraud::Components::Order instance
38
- # @param [Hash] params hash of parameters
39
- # @return [Minfraud::Components::Order] an Order instance
40
- def initialize (params = {})
58
+ # @param params [Hash] Hash of parameters. Each key/value should
59
+ # correspond to one of the available attributes.
60
+ def initialize(params = {})
61
+ @amount = params[:amount]
41
62
  @has_gift_message = params[:has_gift_message]
42
63
  @affiliate_id = params[:affiliate_id]
43
64
  @subaffiliate_id = params[:subaffiliate_id]
44
65
  @currency = params[:currency]
45
- @discount_code = params[:discount_cide]
66
+ @discount_code = params[:discount_code]
46
67
  @referrer_uri = params[:referrer_uri]
47
68
  @is_gift = params[:is_gift]
69
+
70
+ validate
71
+ end
72
+
73
+ private
74
+
75
+ def validate
76
+ return if !Minfraud.enable_validation
77
+
78
+ validate_nonnegative_number('amount', @amount)
79
+ validate_boolean('has_gift_message', @has_gift_message)
80
+ validate_string('affiliate_id', 255, @affiliate_id)
81
+ validate_string('subaffiliate_id', 255, @subaffiliate_id)
82
+ validate_regex('currency', /\A[A-Z]{3}\z/, @currency)
83
+ validate_string('discount_code', 255, @discount_code)
84
+ validate_uri('referrer_uri', @referrer_uri)
85
+ validate_boolean('is_gift', @is_gift)
48
86
  end
49
87
  end
50
88
  end
@@ -1,39 +1,183 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Minfraud
2
4
  module Components
5
+ # Payment corresponds to the payment object of a minFraud request.
6
+ #
7
+ # @see https://dev.maxmind.com/minfraud/#Payment_(/payment)
3
8
  class Payment < Base
4
9
  include ::Minfraud::Enum
5
- # @attribute processor
6
- # @return [String] The payment processor used for the transaction
10
+ include Minfraud::Validates
11
+
12
+ # The payment processor used for the transaction. The value is one
13
+ # listed as a valid value, as a symbol.
14
+ #
15
+ # @!attribute processor
16
+ #
17
+ # @return [Symbol, nil]
7
18
  enum_accessor :processor, [
8
- :adyen, :altapay, :amazon_payments, :authorizenet, :balanced, :beanstream,
9
- :bluepay, :braintree, :ccnow, :chase_paymentech, :cielo, :collector, :compropago,
10
- :concept_payments, :conekta, :cuentadigital, :dalpay, :dibs, :digital_river, :ecomm365,
11
- :elavon, :epay, :eprocessing_network, :eway, :first_data, :global_payments, :ingenico,
12
- :internetsecure, :intuit_quickbooks_payments, :iugu, :mastercard_payment_gateway,
13
- :mercadopago, :merchant_esolutions, :mirjeh, :mollie, :moneris_solutions, :nmi,
14
- :openpaymx, :optimal_payments, :orangepay, :other, :pacnet_services, :payfast,
15
- :paygate, :payone, :paypal, :payplus, :paystation, :paytrace, :paytrail, :payture,
16
- :payu, :payulatam, :pinpayments, :princeton_payment_solutions, :psigate, :qiwi,
17
- :quickpay, :raberil, :rede, :redpagos, :rewardspay, :sagepay, :simplify_commerce,
18
- :skrill, :smartcoin, :sps_decidir, :stripe, :telerecargas, :towah, :usa_epay,
19
- :verepay, :vindicia, :virtual_card_services, :vme, :worldpay
19
+ :adyen,
20
+ :affirm,
21
+ :afterpay,
22
+ :altapay,
23
+ :amazon_payments,
24
+ :american_express_payment_gateway,
25
+ :authorizenet,
26
+ :balanced,
27
+ :beanstream,
28
+ :bluepay,
29
+ :bluesnap,
30
+ :bpoint,
31
+ :braintree,
32
+ :cardpay,
33
+ :cashfree,
34
+ :ccavenue,
35
+ :ccnow,
36
+ :cetelem,
37
+ :chase_paymentech,
38
+ :checkout_com,
39
+ :cielo,
40
+ :collector,
41
+ :commdoo,
42
+ :compropago,
43
+ :concept_payments,
44
+ :conekta,
45
+ :ct_payments,
46
+ :cuentadigital,
47
+ :curopayments,
48
+ :cybersource,
49
+ :dalenys,
50
+ :dalpay,
51
+ :datacash,
52
+ :dibs,
53
+ :digital_river,
54
+ :dotpay,
55
+ :ebs,
56
+ :ecomm365,
57
+ :ecommpay,
58
+ :elavon,
59
+ :emerchantpay,
60
+ :epay,
61
+ :eprocessing_network,
62
+ :epx,
63
+ :eway,
64
+ :exact,
65
+ :first_atlantic_commerce,
66
+ :first_data,
67
+ :g2a_pay,
68
+ :global_payments,
69
+ :gocardless,
70
+ :heartland,
71
+ :hipay,
72
+ :ingenico,
73
+ :interac,
74
+ :internetsecure,
75
+ :intuit_quickbooks_payments,
76
+ :iugu,
77
+ :klarna,
78
+ :komoju,
79
+ :lemon_way,
80
+ :mastercard_payment_gateway,
81
+ :mercadopago,
82
+ :mercanet,
83
+ :merchant_esolutions,
84
+ :mirjeh,
85
+ :mollie,
86
+ :moneris_solutions,
87
+ :nmi,
88
+ :oceanpayment,
89
+ :oney,
90
+ :openpaymx,
91
+ :optimal_payments,
92
+ :orangepay,
93
+ :other,
94
+ :pacnet_services,
95
+ :payeezy,
96
+ :payfast,
97
+ :paygate,
98
+ :paylike,
99
+ :payment_express,
100
+ :paymentwall,
101
+ :payone,
102
+ :paypal,
103
+ :payplus,
104
+ :paysafecard,
105
+ :paystation,
106
+ :paytm,
107
+ :paytrace,
108
+ :paytrail,
109
+ :payture,
110
+ :payu,
111
+ :payulatam,
112
+ :payway,
113
+ :payza,
114
+ :pinpayments,
115
+ :posconnect,
116
+ :princeton_payment_solutions,
117
+ :psigate,
118
+ :qiwi,
119
+ :quickpay,
120
+ :raberil,
121
+ :razorpay,
122
+ :rede,
123
+ :redpagos,
124
+ :rewardspay,
125
+ :sagepay,
126
+ :securetrading,
127
+ :simplify_commerce,
128
+ :skrill,
129
+ :smartcoin,
130
+ :smartdebit,
131
+ :solidtrust_pay,
132
+ :sps_decidir,
133
+ :stripe,
134
+ :synapsefi,
135
+ :systempay,
136
+ :telerecargas,
137
+ :towah,
138
+ :transact_pro,
139
+ :usa_epay,
140
+ :vantiv,
141
+ :verepay,
142
+ :vericheck,
143
+ :vindicia,
144
+ :virtual_card_services,
145
+ :vme,
146
+ :vpos,
147
+ :wirecard,
148
+ :worldpay
20
149
  ]
21
150
 
22
- # @attribute was_authorized
23
- # @return [Boolean] The authorization outcome from the payment processor. If the transaction has not yet been approved or denied, do not include this field
151
+ # The authorization outcome from the payment processor. If the
152
+ # transaction has not yet been approved or denied, do not include this
153
+ # field.
154
+ #
155
+ # @return [Boolean, nil]
24
156
  attr_accessor :was_authorized
25
157
 
26
- # @attribute decline_code
27
- # @return [String] The decline code as provided by your payment processor. If the transaction was not declined, do not include this field
158
+ # The decline code as provided by your payment processor. If the
159
+ # transaction was not declined, do not include this field.
160
+ #
161
+ # @return [String, nil]
28
162
  attr_accessor :decline_code
29
163
 
30
- # Creates Minfraud::Components::Payment instance
31
- # @param [Hash] params hash of parameters
32
- # @return [Minfraud::Components::Payment] Payment instance
164
+ # @param params [Hash] Hash of parameters. Each key/value should
165
+ # correspond to one of the available attributes.
33
166
  def initialize(params = {})
34
167
  @was_authorized = params[:was_authorized]
35
168
  @decline_code = params[:decline_code]
36
169
  self.processor = params[:processor]
170
+
171
+ validate
172
+ end
173
+
174
+ private
175
+
176
+ def validate
177
+ return if !Minfraud.enable_validation
178
+
179
+ validate_boolean('was_authorized', @was_authorized)
180
+ validate_string('decline_code', 255, @decline_code)
37
181
  end
38
182
  end
39
183
  end