minfraud 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +46 -0
  3. data/.rubocop.yml +127 -0
  4. data/CHANGELOG.md +14 -0
  5. data/Gemfile +4 -2
  6. data/README.md +1 -1
  7. data/Rakefile +18 -3
  8. data/bin/console +4 -3
  9. data/lib/maxmind/geoip2/model/city.rb +3 -3
  10. data/lib/maxmind/geoip2/model/country.rb +5 -5
  11. data/lib/maxmind/geoip2/record/traits.rb +1 -1
  12. data/lib/minfraud.rb +29 -6
  13. data/lib/minfraud/assessments.rb +6 -2
  14. data/lib/minfraud/components/account.rb +2 -0
  15. data/lib/minfraud/components/addressable.rb +9 -7
  16. data/lib/minfraud/components/base.rb +6 -4
  17. data/lib/minfraud/components/billing.rb +2 -0
  18. data/lib/minfraud/components/credit_card.rb +4 -2
  19. data/lib/minfraud/components/custom_inputs.rb +2 -0
  20. data/lib/minfraud/components/device.rb +4 -2
  21. data/lib/minfraud/components/email.rb +2 -0
  22. data/lib/minfraud/components/event.rb +13 -11
  23. data/lib/minfraud/components/order.rb +3 -1
  24. data/lib/minfraud/components/payment.rb +14 -2
  25. data/lib/minfraud/components/report/transaction.rb +6 -6
  26. data/lib/minfraud/components/shipping.rb +2 -0
  27. data/lib/minfraud/components/shopping_cart.rb +4 -1
  28. data/lib/minfraud/components/shopping_cart_item.rb +2 -2
  29. data/lib/minfraud/enum.rb +6 -3
  30. data/lib/minfraud/error_handler.rb +15 -15
  31. data/lib/minfraud/errors.rb +2 -0
  32. data/lib/minfraud/http_service.rb +14 -4
  33. data/lib/minfraud/http_service/request.rb +3 -0
  34. data/lib/minfraud/http_service/response.rb +4 -2
  35. data/lib/minfraud/model/address.rb +4 -4
  36. data/lib/minfraud/model/credit_card.rb +7 -7
  37. data/lib/minfraud/model/device.rb +2 -2
  38. data/lib/minfraud/model/email.rb +4 -4
  39. data/lib/minfraud/model/error.rb +1 -1
  40. data/lib/minfraud/model/insights.rb +5 -5
  41. data/lib/minfraud/model/issuer.rb +3 -3
  42. data/lib/minfraud/model/score.rb +6 -6
  43. data/lib/minfraud/model/shipping_address.rb +1 -1
  44. data/lib/minfraud/model/subscores.rb +35 -16
  45. data/lib/minfraud/model/warning.rb +2 -2
  46. data/lib/minfraud/report.rb +5 -3
  47. data/lib/minfraud/resolver.rb +14 -12
  48. data/lib/minfraud/version.rb +3 -1
  49. data/minfraud.gemspec +4 -1
  50. metadata +18 -2
@@ -1,11 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Minfraud
2
4
  module Components
3
5
  # @note This class is used as a parent class for all other components
4
6
  # @note It defines a method which is used for basic JSON representation of PORO objects
5
7
  class Base
6
8
  # @return [Hash] a JSON representation of component attributes
7
- def to_json
8
- instance_variables.inject({}) { |mem, e| populate!(mem, e) }
9
+ def to_json(*_args)
10
+ instance_variables.reduce({}) { |mem, e| populate!(mem, e) }
9
11
  end
10
12
 
11
13
  private
@@ -15,7 +17,7 @@ module Minfraud
15
17
  # @param [Symbol] v_sym an instance variable symbol
16
18
  # @return [Hash] a hash containing a JSON representation of instance variable name and it's value
17
19
  def populate!(hash, v_sym)
18
- return hash unless value = instance_variable_get(v_sym)
20
+ return hash unless (value = instance_variable_get(v_sym))
19
21
 
20
22
  key = v_sym.to_s.gsub(/@/, '')
21
23
  hash.merge!(key => represent(key, value))
@@ -29,7 +31,7 @@ module Minfraud
29
31
  end
30
32
 
31
33
  # Keys that have to remain boolean
32
- BOOLS = %w(was_authorized is_gift has_gift_message)
34
+ BOOLS = %w[was_authorized is_gift has_gift_message].freeze
33
35
  end
34
36
  end
35
37
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Minfraud
2
4
  module Components
3
5
  class Billing < Addressable; end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Minfraud
2
4
  module Components
3
5
  class CreditCard < Base
@@ -22,8 +24,8 @@ module Minfraud
22
24
  # @return [String] The phone number, without the country code, for the issuing bank as provided by the end user
23
25
  attr_accessor :bank_phone_number
24
26
 
25
- #@attribute token
26
- #@return [String] A token uniquely identifying the card. The token should consist of non-space printable ASCII characters.
27
+ # @attribute token
28
+ # @return [String] A token uniquely identifying the card. The token should consist of non-space printable ASCII characters.
27
29
  attr_accessor :token
28
30
 
29
31
  # @attribute avs_result
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Minfraud
2
4
  module Components
3
5
  class CustomInputs < Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Minfraud
2
4
  module Components
3
5
  class Device < Base
@@ -15,12 +17,12 @@ module Minfraud
15
17
  attr_accessor :accept_language
16
18
 
17
19
  # @attribute :session_age
18
- # @return [Decimal] The number of seconds between the creation of the users session and the time of the transaction.
20
+ # @return [Decimal] The number of seconds between the creation of the user's session and the time of the transaction.
19
21
  # Note that session_age is not the duration of the current visit, but the time since the start of the first visit.
20
22
  attr_accessor :session_age
21
23
 
22
24
  # @attribute :session_id
23
- # @return [String] An ID that uniquely identifies a visitors session on the site.
25
+ # @return [String] An ID that uniquely identifies a visitor's session on the site.
24
26
  attr_accessor :session_id
25
27
 
26
28
  # Creates Minfraud::Components::Device instance
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Minfraud
2
4
  module Components
3
5
  class Email < Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Minfraud
2
4
  module Components
3
5
  class Event < Base
@@ -18,17 +20,17 @@ module Minfraud
18
20
  # @attribute type
19
21
  # @return [String] The type of event being scored
20
22
  enum_accessor :type,
21
- [
22
- :account_creation,
23
- :account_login,
24
- :email_change,
25
- :password_reset,
26
- :payout_change,
27
- :purchase,
28
- :recurring_purchase,
29
- :referral,
30
- :survey,
31
- ]
23
+ [
24
+ :account_creation,
25
+ :account_login,
26
+ :email_change,
27
+ :password_reset,
28
+ :payout_change,
29
+ :purchase,
30
+ :recurring_purchase,
31
+ :referral,
32
+ :survey,
33
+ ]
32
34
 
33
35
  # Creates Minfraud::Components::Event instance
34
36
  # @param [Hash] params hash of parameters
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Minfraud
2
4
  module Components
3
5
  class Order < Base
@@ -37,7 +39,7 @@ module Minfraud
37
39
  # Creates Minfraud::Components::Order instance
38
40
  # @param [Hash] params hash of parameters
39
41
  # @return [Minfraud::Components::Order] an Order instance
40
- def initialize (params = {})
42
+ def initialize(params = {})
41
43
  @amount = params[:amount]
42
44
  @has_gift_message = params[:has_gift_message]
43
45
  @affiliate_id = params[:affiliate_id]
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Minfraud
2
4
  module Components
3
5
  class Payment < Base
@@ -19,6 +21,7 @@ module Minfraud
19
21
  :bpoint,
20
22
  :braintree,
21
23
  :cardpay,
24
+ :cashfree,
22
25
  :ccavenue,
23
26
  :ccnow,
24
27
  :cetelem,
@@ -50,6 +53,7 @@ module Minfraud
50
53
  :epx,
51
54
  :eway,
52
55
  :exact,
56
+ :first_atlantic_commerce,
53
57
  :first_data,
54
58
  :g2a_pay,
55
59
  :global_payments,
@@ -62,6 +66,7 @@ module Minfraud
62
66
  :intuit_quickbooks_payments,
63
67
  :iugu,
64
68
  :klarna,
69
+ :komoju,
65
70
  :lemon_way,
66
71
  :mastercard_payment_gateway,
67
72
  :mercadopago,
@@ -89,6 +94,7 @@ module Minfraud
89
94
  :payplus,
90
95
  :paysafecard,
91
96
  :paystation,
97
+ :paytm,
92
98
  :paytrace,
93
99
  :paytrail,
94
100
  :payture,
@@ -103,6 +109,7 @@ module Minfraud
103
109
  :qiwi,
104
110
  :quickpay,
105
111
  :raberil,
112
+ :razorpay,
106
113
  :rede,
107
114
  :redpagos,
108
115
  :rewardspay,
@@ -116,6 +123,7 @@ module Minfraud
116
123
  :sps_decidir,
117
124
  :stripe,
118
125
  :synapsefi,
126
+ :systempay,
119
127
  :telerecargas,
120
128
  :towah,
121
129
  :transact_pro,
@@ -132,11 +140,15 @@ module Minfraud
132
140
  ]
133
141
 
134
142
  # @attribute was_authorized
135
- # @return [Boolean] The authorization outcome from the payment processor. If the transaction has not yet been approved or denied, do not include this field
143
+ # @return [Boolean] The authorization outcome from the payment processor.
144
+ # If the transaction has not yet been approved or denied, do not include
145
+ # this field
136
146
  attr_accessor :was_authorized
137
147
 
138
148
  # @attribute decline_code
139
- # @return [String] The decline code as provided by your payment processor. If the transaction was not declined, do not include this field
149
+ # @return [String] The decline code as provided by your payment
150
+ # processor. If the transaction was not declined, do not include this
151
+ # field
140
152
  attr_accessor :decline_code
141
153
 
142
154
  # Creates Minfraud::Components::Payment instance
@@ -55,13 +55,13 @@ module Minfraud
55
55
  # @return [Minfraud::Components::Report::Transaction] a Report::Transaction
56
56
  # instance
57
57
  def initialize(params = {})
58
- @ip_address = params[:ip_address]
58
+ @ip_address = params[:ip_address]
59
59
  @chargeback_code = params[:chargeback_code]
60
- @maxmind_id = params[:maxmind_id]
61
- @minfraud_id = params[:minfraud_id]
62
- @notes = params[:notes]
63
- @transaction_id = params[:transaction_id]
64
- self.tag = params[:tag]
60
+ @maxmind_id = params[:maxmind_id]
61
+ @minfraud_id = params[:minfraud_id]
62
+ @notes = params[:notes]
63
+ @transaction_id = params[:transaction_id]
64
+ self.tag = params[:tag]
65
65
  end
66
66
  end
67
67
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Minfraud
2
4
  module Components
3
5
  class Shipping < Addressable
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Minfraud
2
4
  module Components
3
5
  class ShoppingCart < Base
@@ -5,6 +7,7 @@ module Minfraud
5
7
  # @return [Array] An array of Minfraud::Components::ShoppingCartItem instances
6
8
 
7
9
  attr_accessor :items
10
+
8
11
  # Creates Minfraud::Components::ShoppingCart instance
9
12
  # @param [Hash] params hash of parameters
10
13
  # @return [Minfraud::Components::ShoppingCart] ShoppingCart instance
@@ -13,7 +16,7 @@ module Minfraud
13
16
  end
14
17
 
15
18
  # @return [Array] a JSON representation of Minfraud::Components::ShoppingCart items
16
- def to_json
19
+ def to_json(*_args)
17
20
  @items.map(&:to_json)
18
21
  end
19
22
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Minfraud
2
4
  module Components
3
5
  class ShoppingCartItem < Base
@@ -29,5 +31,3 @@ module Minfraud
29
31
  end
30
32
  end
31
33
  end
32
-
33
-
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Minfraud
2
4
  module Enum
3
5
  def self.included(base)
@@ -21,10 +23,11 @@ module Minfraud
21
23
  define_method("#{attribute}_values") { mapping[attribute] }
22
24
  end
23
25
 
24
- self.class_eval do
25
- define_method("#{attribute}") { instance_variable_get("@#{attribute}") }
26
+ class_eval do
27
+ define_method(attribute.to_s) { instance_variable_get("@#{attribute}") }
26
28
  define_method "#{attribute}=" do |value|
27
- raise NotEnumValueError, 'Value is not permitted' if value && !self.class.mapping[attribute].include?(value.intern)
29
+ raise NotEnumValueError, 'Value is not permitted' if value && !self.class.mapping[attribute].include?(value.intern)
30
+
28
31
  instance_variable_set("@#{attribute}", value ? value.intern : nil)
29
32
  end
30
33
  end
@@ -9,54 +9,54 @@ module Minfraud
9
9
  def examine(response)
10
10
  return response if response.status > 199 && response.status < 300
11
11
 
12
- raise *STATUS_CODES.fetch(response.code, [ServerError, 'Server error'])
12
+ raise(*STATUS_CODES.fetch(response.code, [ServerError, 'Server error']))
13
13
  end
14
14
 
15
15
  # A hash that maps status codes returned by minFraud with errors & messages
16
16
  STATUS_CODES = {
17
- IP_ADDRESS_INVALID: [
17
+ IP_ADDRESS_INVALID: [
18
18
  ClientError, 'You have not supplied a valid IPv4 or IPv6 address'
19
19
  ],
20
- IP_ADDRESS_REQUIRED: [
20
+ IP_ADDRESS_REQUIRED: [
21
21
  ClientError, 'You have not supplied an IP address which is a required field'
22
22
  ],
23
- IP_ADDRESS_RESERVED: [
23
+ IP_ADDRESS_RESERVED: [
24
24
  ClientError, 'You have supplied an IP address which is reserved'
25
25
  ],
26
- JSON_INVALID: [
26
+ JSON_INVALID: [
27
27
  ClientError, 'JSON body cannot be decoded'
28
28
  ],
29
- MAXMIND_ID_INVALID: [
29
+ MAXMIND_ID_INVALID: [
30
30
  ClientError, 'You have not supplied a valid maxmind_id'
31
31
  ],
32
- MINFRAUD_ID_INVALID: [
32
+ MINFRAUD_ID_INVALID: [
33
33
  ClientError, 'You have not supplied a valid minfraud_id'
34
34
  ],
35
- PARAMETER_UNKNOWN: [
35
+ PARAMETER_UNKNOWN: [
36
36
  ClientError, 'You have supplied an unknown parameter'
37
37
  ],
38
- TAG_REQUIRED: [
38
+ TAG_REQUIRED: [
39
39
  ClientError, 'You have not supplied a tag, which is a required field'
40
40
  ],
41
- TAG_INVALID: [
41
+ TAG_INVALID: [
42
42
  ClientError, 'You have not supplied a valid tag'
43
43
  ],
44
- ACCOUNT_ID_REQUIRED: [
44
+ ACCOUNT_ID_REQUIRED: [
45
45
  AuthorizationError, 'You have not supplied a account ID'
46
46
  ],
47
47
  AUTHORIZATION_INVALID: [
48
48
  AuthorizationError, 'Invalid license key and / or account ID'
49
49
  ],
50
- LICENSE_KEY_REQUIRED: [
50
+ LICENSE_KEY_REQUIRED: [
51
51
  AuthorizationError, 'You have not supplied a license key'
52
52
  ],
53
- USER_ID_REQUIRED: [
53
+ USER_ID_REQUIRED: [
54
54
  AuthorizationError, 'You have not supplied a account id'
55
55
  ],
56
- INSUFFICIENT_FUNDS: [
56
+ INSUFFICIENT_FUNDS: [
57
57
  ClientError, 'The license key you have provided does not have a sufficient funds to use this service'
58
58
  ],
59
- PERMISSION_REQUIRED: [
59
+ PERMISSION_REQUIRED: [
60
60
  ClientError, 'You do not have permission to use this service'
61
61
  ]
62
62
  }.freeze
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Minfraud
2
4
  # A list of Minfraud custom errors
3
5
  class BaseError < StandardError; end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'faraday'
2
4
  require 'faraday_middleware'
3
5
 
@@ -6,18 +8,26 @@ module Minfraud
6
8
  class << self
7
9
  # @return [Hash] default HTTPService configuration
8
10
  def configuration
11
+ server = DEFAULT_SERVER
12
+ if !Minfraud.host.nil?
13
+ server = 'https://' + Minfraud.host + '/minfraud/v2.0'
14
+ end
15
+
9
16
  {
10
17
  middleware: DEFAULT_MIDDLEWARE,
11
- server: DEFAULT_SERVER
18
+ server: server,
12
19
  }
13
20
  end
14
21
  end
15
22
 
16
23
  # Minfraud default middleware stack
17
- DEFAULT_MIDDLEWARE = Proc.new do |builder|
24
+ DEFAULT_MIDDLEWARE = proc do |builder|
18
25
  builder.request :json
19
26
 
20
- builder.basic_auth *::Minfraud.configuration.values
27
+ account_id = Minfraud.account_id
28
+ account_id = Minfraud.user_id if account_id.nil?
29
+
30
+ builder.basic_auth account_id, Minfraud.license_key
21
31
 
22
32
  builder.response :json, content_type: /\bjson$/
23
33
 
@@ -25,6 +35,6 @@ module Minfraud
25
35
  end
26
36
 
27
37
  # Minfraud default server
28
- DEFAULT_SERVER = 'https://minfraud.maxmind.com/minfraud/v2.0'.freeze
38
+ DEFAULT_SERVER = 'https://minfraud.maxmind.com/minfraud/v2.0'
29
39
  end
30
40
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'faraday'
2
4
 
3
5
  module Minfraud
@@ -27,6 +29,7 @@ module Minfraud
27
29
  end
28
30
 
29
31
  private
32
+
30
33
  # Creates memoized Faraday::Connection instance
31
34
  # @return [Faraday::Connection] Faraday::Connection instance
32
35
  def adapter
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'minfraud/model/error'
2
4
  require 'minfraud/model/factors'
3
5
  require 'minfraud/model/insights'
@@ -55,9 +57,9 @@ module Minfraud
55
57
  end
56
58
 
57
59
  ENDPOINT_TO_CLASS = {
58
- factors: Minfraud::Model::Factors,
60
+ factors: Minfraud::Model::Factors,
59
61
  insights: Minfraud::Model::Insights,
60
- score: Minfraud::Model::Score
62
+ score: Minfraud::Model::Score
61
63
  }.freeze
62
64
  end
63
65
  end