datadome_fraud_sdk_ruby 1.0.0 → 2.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2b8713046c4239173b65684b92fd86c95371bd74f7dfeb71ad7cfe7c8d3ba2f5
4
- data.tar.gz: 5acc8e0e5f7b878ebc92637052cd10b7fca76f20492cafc47e02741fcc2064d2
3
+ metadata.gz: c2434a89b8290f901080492cb9491bfa2c56cf62da19504d1eb6ae987d411fdb
4
+ data.tar.gz: 121d6dbc02235af5e37c71a7acf58ce65bc1c8e3d65df37aea5e98ac115b8752
5
5
  SHA512:
6
- metadata.gz: 42b2be325fe412f8e21a1a0f7be4641a01568f5b3e4ee06cdde3af8c264ec4f686530d00f34877c58fc8171c62ddc68dadd2ba0cafbb94504ba1798e2f5993e4
7
- data.tar.gz: 72364626f1bfe4378696d3db32a3617a7f909642c0d18baa83f0c3cece393492321afe9830ca116aee0ea389d49459feedaf4c397538a9e566c7b57b6e1dfcd7
6
+ metadata.gz: 78b9a208bff8a41ea879cc4e70584f63156af5892b8cc2402647d112224902f071bc98b769903aa445ce5afebdde5d316de7064b1123028929a148cc63a4bce1
7
+ data.tar.gz: bebb991f6d5bd9f9c1faef493473e145cef3f4755b0633e26671d604e6ee0d39413d3f5f7c30c24adea391d52ce0d11364693de07f9c93841874a54a5a774445
data/lib/constants.rb CHANGED
@@ -1,2 +1,2 @@
1
- SDK_VERSION = '1.0.0'
1
+ SDK_VERSION = '2.0.0'
2
2
  SDK_NAME = 'datadome_fraud_sdk_ruby'
@@ -3,6 +3,7 @@
3
3
  require "faraday"
4
4
  require "json"
5
5
  require_relative "model/events"
6
+ require_relative "model/location"
6
7
  require_relative "model/user"
7
8
  require_relative "model/session"
8
9
  require_relative "model/operation"
@@ -12,21 +13,21 @@ require_relative "model/api/response"
12
13
  class DataDome
13
14
  attr_accessor :timeout, :endpoint, :logger
14
15
 
15
- def initialize(timeout = 1500, endpoint = "account-api.datadome.co", logger = Logger.new(STDOUT))
16
+ def initialize(timeout: 1500, endpoint: "account-api.datadome.co", logger: Logger.new(STDOUT))
16
17
  @timeout = timeout
17
18
  @endpoint = endpoint
18
19
  @logger = logger
19
20
  end
20
21
 
21
- def validate(request, event)
22
- if event.status == StatusType::UNDEFINED
23
- event.status = StatusType::SUCCEEDED
22
+ def validate(request:, event:)
23
+ if event.status == DataDomeStatusType::UNDEFINED
24
+ event.status = DataDomeStatusType::SUCCEEDED
24
25
  end
25
26
 
26
27
  payload = build_payload(request, event)
27
28
 
28
29
  begin
29
- api_response = sendRequest(OperationType::VALIDATE, event.action, payload)
30
+ api_response = send_request(DataDomeOperationType::VALIDATE, event.action, payload)
30
31
 
31
32
  begin
32
33
  body = JSON.parse(api_response.body) unless api_response.body.nil?
@@ -36,13 +37,13 @@ class DataDome
36
37
  end
37
38
 
38
39
  if api_response.success?
39
- datadome_response = DataDomeResponseSuccess.new(DataDomeResponseAction::ALLOW, DataDomeResponseStatus::OK, body["reasons"], body["ip"], body["location"])
40
+ datadome_response = DataDomeResponseSuccess.new(DataDomeResponseAction::ALLOW, DataDomeResponseStatus::OK, body["reasons"], body["ip"], DataDomeLocation.new(location: body["location"]))
40
41
  if body["action"] === DataDomeResponseAction::DENY
41
42
  datadome_response.action = DataDomeResponseAction::DENY
42
43
  end
43
44
  else
44
45
  @logger.error("DataDome: error on Fraud API /validate response #{body["errors"]}")
45
- return DataDomeResponseError.new(DataDomeResponseAction::ALLOW, DataDomeResponseStatus::FAILURE, body["message"], body["errors"])
46
+ return DataDomeResponseError.new(DataDomeResponseAction::ALLOW, DataDomeResponseStatus::FAILURE, body["message"], body["errors"].map { |error| DataDomeError.new(error) })
46
47
  end
47
48
  rescue Faraday::TimeoutError => e
48
49
  return DataDomeResponseError.new(DataDomeResponseAction::ALLOW, DataDomeResponseStatus::TIMEOUT, "DataDome Fraud API request timeout", e.message)
@@ -53,15 +54,15 @@ class DataDome
53
54
  datadome_response
54
55
  end
55
56
 
56
- def collect(request, event)
57
- if event.status == StatusType::UNDEFINED
58
- event.status = StatusType::FAILED
57
+ def collect(request:, event:)
58
+ if event.status == DataDomeStatusType::UNDEFINED
59
+ event.status = DataDomeStatusType::FAILED
59
60
  end
60
61
 
61
62
  payload = build_payload(request, event)
62
63
 
63
64
  begin
64
- api_response = sendRequest(OperationType::COLLECT, event.action, payload)
65
+ api_response = send_request(DataDomeOperationType::COLLECT, event.action, payload)
65
66
 
66
67
  if api_response.success?
67
68
  datadome_response = DataDomeResponseSuccess.new(nil, DataDomeResponseStatus::OK, nil, nil, nil)
@@ -69,7 +70,7 @@ class DataDome
69
70
  begin
70
71
  body = JSON.parse(api_response.body)
71
72
  @logger.error("DataDome: error on Fraud API /collect response #{body["errors"]}")
72
- datadome_response = DataDomeResponseError.new(nil, DataDomeResponseStatus::FAILURE, body["message"], body["errors"])
73
+ datadome_response = DataDomeResponseError.new(nil, DataDomeResponseStatus::FAILURE, body["message"], body["errors"].map { |error| DataDomeError.new(error) })
73
74
  rescue JSON::ParserError => e
74
75
  @logger.error("DataDome: error parsing JSON from Fraud API /collect #{e.message}")
75
76
  return DataDomeResponseError.new(nil, DataDomeResponseStatus::FAILURE, "DataDome: error parsing JSON from Fraud API", e.message)
@@ -86,21 +87,28 @@ class DataDome
86
87
 
87
88
  private
88
89
 
89
- def sendRequest(operation, event, payload)
90
- api_response = client.post("/v1/" + operation + "/" + event) do |req|
91
- req.body = payload.to_json
90
+ def build_payload(request, event)
91
+ # Check if the request is an instance of DataDomeRequest
92
+ if request.instance_of?(DataDomeRequest)
93
+ # If it is, simply merge the event data with the request data
94
+ payload = event.merge_with(request)
95
+ else
96
+ # If it's not, create a new instance of DataDomeHeaders
97
+ datadome_headers = DataDomeHeaders.new
98
+ # Populate the DataDomeHeaders instance with data from the HTTP request
99
+ datadome_headers.build_from_http_request(request)
100
+ # Create a new DataDomeRequest instance with the DataDomeHeaders instance
101
+ # and merge the event data with the DataDomeRequest
102
+ payload = event.merge_with(DataDomeRequest.new(datadome_headers))
92
103
  end
93
- api_response
104
+ payload
94
105
  end
95
106
 
96
- def build_payload(request, event)
97
- metadata = event.merge_with(DataDomeRequest.new(request))
98
- payload = {}
99
- metadata.instance_variables.each do |var|
100
- key = var.to_s.delete("@") # Remove '@' from variable name to get key
101
- payload[key] = metadata.instance_variable_get(var)
107
+ def send_request(operation, event, payload)
108
+ api_response = client.post("/v1/" + operation + "/" + event) do |req|
109
+ req.body = payload.to_json
102
110
  end
103
- payload
111
+ api_response
104
112
  end
105
113
 
106
114
  def client
data/lib/model/address.rb CHANGED
@@ -1,20 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Address
4
- attr_accessor :name, :line1, :line2, :city, :countryCode, :regionCode, :zipCode
3
+ class DataDomeAddress
4
+ attr_accessor :name, :line1, :line2, :city, :country_code, :region_code, :zip_code
5
5
 
6
- def initialize(name = nil, line1 = nil, line2 = nil, city = nil, countryCode = nil, regionCode = nil, zipCode = nil)
6
+ def initialize(name: nil, line1: nil, line2: nil, city: nil, country_code: nil, region_code: nil, zip_code: nil)
7
7
  @name = name
8
8
  @line1 = line1
9
9
  @line2 = line2
10
10
  @city = city
11
- @countryCode = countryCode
12
- @regionCode = regionCode
13
- @zipCode = zipCode
11
+ @country_code = country_code
12
+ @region_code = region_code
13
+ @zip_code = zip_code
14
14
  end
15
15
 
16
16
  def to_s
17
- "Address: name=#{name}, line1=#{line1}, line2=#{line2}, city=#{city}, countryCode=#{countryCode}, regionCode=#{regionCode}, zipCode=#{zipCode}"
17
+ "DataDomeAddress: name=#{@name}, line1=#{@line1}, line2=#{@line2}, city=#{@city}, countryCode=#{@country_code}, regionCode=#{@region_code}, zipCode=#{@zip_code}"
18
18
  end
19
19
 
20
20
  def to_json(options = {})
@@ -23,9 +23,9 @@ class Address
23
23
  line1: line1,
24
24
  line2: line2,
25
25
  city: city,
26
- countryCode: countryCode,
27
- regionCode: regionCode,
28
- zipCode: zipCode,
26
+ countryCode: country_code,
27
+ regionCode: region_code,
28
+ zipCode: zip_code,
29
29
  }.to_json
30
30
  end
31
31
  end
@@ -3,80 +3,203 @@
3
3
  require_relative "../../constants"
4
4
 
5
5
  class DataDomeModule
6
- attr_accessor :requestTimeMicros, :name, :version
6
+ attr_reader :request_time_micros, :name, :version
7
7
 
8
8
  def initialize
9
- @requestTimeMicros = Time.now.strftime("%s%6N").to_i
9
+ @request_time_micros = Time.now.strftime("%s%6N").to_i
10
10
  @name = "Fraud SDK Ruby"
11
11
  @version = SDK_VERSION
12
12
  end
13
13
 
14
- def to_json(options = {})
14
+ def to_hash
15
15
  {
16
- requestTimeMicros: @requestTimeMicros,
16
+ requestTimeMicros: @request_time_micros,
17
17
  name: @name,
18
18
  version: @version,
19
- }.to_json
19
+ }
20
20
  end
21
21
  end
22
22
 
23
23
  class DataDomeHeaders
24
- attr_accessor :addr, :clientIp, :contentType, :host, :port, :xRealIP, :xForwardedForIp,
25
- :acceptEncoding, :acceptLanguage, :accept, :method, :protocol, :serverHostname,
26
- :referer, :userAgent, :from, :request, :origin, :acceptCharset, :connection,
27
- :clientID, :secCHUA, :secCHUAMobile, :secCHUAPlatform, :secCHUAArch,
28
- :secCHUAFullVersionList, :secCHUAModel, :secCHDeviceMemory
24
+ attr_accessor :addr, :client_ip, :content_type, :host, :port, :x_real_ip, :x_forwarded_for_ip,
25
+ :accept_encoding, :accept_language, :accept, :method, :protocol, :server_hostname,
26
+ :referer, :user_agent, :from, :request, :origin, :accept_charset, :connection,
27
+ :client_id, :sec_ch_ua, :sec_ch_ua_mobile, :sec_ch_ua_platform, :sec_ch_ua_arch,
28
+ :sec_ch_ua_full_version_list, :sec_ch_ua_model, :sec_ch_device_memory
29
+
30
+ def initialize(addr: nil, client_ip: nil, content_type: nil, host: nil, port: nil, x_real_ip: nil,
31
+ x_forwarded_for_ip: nil, accept_encoding: nil, accept_language: nil, accept: nil,
32
+ method: nil, protocol: nil, server_hostname: nil, referer: nil, user_agent: nil,
33
+ from: nil, request: nil, origin: nil, accept_charset: nil, connection: nil,
34
+ client_id: nil, sec_ch_ua: nil, sec_ch_ua_mobile: nil, sec_ch_ua_platform: nil,
35
+ sec_ch_ua_arch: nil, sec_ch_ua_full_version_list: nil, sec_ch_ua_model: nil,
36
+ sec_ch_device_memory: nil)
37
+ @addr = addr
38
+ @client_ip = client_ip
39
+ @content_type = content_type
40
+ @host = host
41
+ @port = port
42
+ @x_real_ip = x_real_ip
43
+ @x_forwarded_for_ip = x_forwarded_for_ip
44
+ @accept_encoding = accept_encoding
45
+ @accept_language = accept_language
46
+ @accept = accept
47
+ @method = method
48
+ @protocol = protocol
49
+ @server_hostname = server_hostname
50
+ @referer = referer
51
+ @user_agent = user_agent
52
+ @from = from
53
+ @request = request
54
+ @origin = origin
55
+ @accept_charset = accept_charset
56
+ @connection = connection
57
+ @client_id = client_id
58
+ @sec_ch_ua = sec_ch_ua
59
+ @sec_ch_ua_mobile = sec_ch_ua_mobile
60
+ @sec_ch_ua_platform = sec_ch_ua_platform
61
+ @sec_ch_ua_arch = sec_ch_ua_arch
62
+ @sec_ch_ua_full_version_list = sec_ch_ua_full_version_list
63
+ @sec_ch_ua_model = sec_ch_ua_model
64
+ @sec_ch_device_memory = sec_ch_device_memory
65
+ end
29
66
 
30
- def initialize(request)
67
+ def build_from_http_request(request)
31
68
  @addr = request.remote_ip
32
- @clientIp = request.headers["HTTP_CLIENT_IP"]
33
- @contentType = truncate(request.headers["Content-Type"], 64) # this value is a meta-variable of the request
34
- @host = truncate(request.headers["HTTP_HOST"], 512)
69
+ @client_ip = request.headers["HTTP_CLIENT_IP"]
70
+ @content_type = request.headers["Content-Type"] # this value is a meta-variable of the request
71
+ @host = request.headers["HTTP_HOST"]
35
72
  @port = request.port || 0
36
- @xRealIP = truncate(request.headers["HTTP_X_REAL_IP"], 128)
37
- @xForwardedForIp = truncate(request.headers["HTTP_X_FORWARDED_FOR"], -512)
38
- @acceptEncoding = truncate(request.headers["HTTP_ACCEPT_ENCODING"], 128)
39
- @acceptLanguage = truncate(request.headers["HTTP_ACCEPT_LANGUAGE"], 256)
40
- @accept = truncate(request.headers["HTTP_ACCEPT"], 512)
73
+ @x_real_ip = request.headers["HTTP_X_REAL_IP"]
74
+ @x_forwarded_for_ip = request.headers["HTTP_X_FORWARDED_FOR"]
75
+ @accept_encoding = request.headers["HTTP_ACCEPT_ENCODING"]
76
+ @accept_language = request.headers["HTTP_ACCEPT_LANGUAGE"]
77
+ @accept = request.headers["HTTP_ACCEPT"]
41
78
  @method = request.method
42
79
  @protocol = request.protocol.gsub("://", "")
43
- @serverHostname = truncate(request.headers["HTTP_HOST"], 256)
44
- @referer = truncate(request.headers["HTTP_REFERER"], 1024)
45
- @userAgent = truncate(request.headers["HTTP_USER_AGENT"], 768)
46
- @from = truncate(request.headers["HTTP_FROM"], 128)
47
- @request = [request.path, request.query_string].reject(&:blank?).join("?")[0, 2048]
48
- @origin = truncate(request.headers["HTTP_ORIGIN"], 512)
49
- @acceptCharset = truncate(request.headers["HTTP_ACCEPT_CHARSET"], 128)
50
- @connection = truncate(request.headers["HTTP_CONNECTION"], 128)
51
- @clientID = request.cookies["datadome"]
52
- @secCHUA = truncate(request.headers["HTTP_SEC_CH_UA"], 128)
53
- @secCHUAMobile = truncate(request.headers["HTTP_SEC_CH_UA_MOBILE"], 8)
54
- @secCHUAPlatform = truncate(request.headers["HTTP_SEC_CH_UA_PLATFORM"], 32)
55
- @secCHUAArch = truncate(request.headers["HTTP_SEC_CH_UA_ARCH"], 16)
56
- @secCHUAFullVersionList = truncate(request.headers["HTTP_SEC_CH_UA_FULL_VERSION_LIST"], 256)
57
- @secCHUAModel = truncate(request.headers["HTTP_SEC_CH_UA_MODEL"], 128)
58
- @secCHDeviceMemory = truncate(request.headers["HTTP_SEC_CH_DEVICE_MEMORY"], 8)
80
+ @server_hostname = request.headers["HTTP_HOST"]
81
+ @referer = request.headers["HTTP_REFERER"]
82
+ @user_agent = request.headers["HTTP_USER_AGENT"]
83
+ @from = request.headers["HTTP_FROM"]
84
+ @request = [request.path, request.query_string].reject(&:blank?).join("?")
85
+ @origin = request.headers["HTTP_ORIGIN"]
86
+ @accept_charset = request.headers["HTTP_ACCEPT_CHARSET"]
87
+ @connection = request.headers["HTTP_CONNECTION"]
88
+ @client_id = request.cookies["datadome"]
89
+ @sec_ch_ua = request.headers["HTTP_SEC_CH_UA"]
90
+ @sec_ch_ua_mobile = request.headers["HTTP_SEC_CH_UA_MOBILE"]
91
+ @sec_ch_ua_platform = request.headers["HTTP_SEC_CH_UA_PLATFORM"]
92
+ @sec_ch_ua_arch = request.headers["HTTP_SEC_CH_UA_ARCH"]
93
+ @sec_ch_ua_full_version_list = request.headers["HTTP_SEC_CH_UA_FULL_VERSION_LIST"]
94
+ @sec_ch_ua_model = request.headers["HTTP_SEC_CH_UA_MODEL"]
95
+ @sec_ch_device_memory = request.headers["HTTP_SEC_CH_DEVICE_MEMORY"]
59
96
  end
60
97
 
61
- def truncate(value, max_length = nil)
62
- return value if value.nil? || max_length.nil?
98
+ def truncate_attributes
99
+ # Hash containing the headers size limit
100
+ headers_max_length = {
101
+ addr: nil, # No size limit
102
+ client_ip: nil,
103
+ content_type: 64,
104
+ host: 512,
105
+ port: nil,
106
+ x_real_ip: 128,
107
+ x_forwarded_for_ip: -512, # Truncate backwards
108
+ accept_encoding: 128,
109
+ accept_language: 256,
110
+ accept: 512,
111
+ method: nil,
112
+ protocol: nil,
113
+ server_hostname: 256,
114
+ referer: 1024,
115
+ user_agent: 768,
116
+ from: 128,
117
+ request: 2048,
118
+ origin: 512,
119
+ accept_charset: 128,
120
+ connection: 128,
121
+ client_id: nil,
122
+ sec_ch_ua: 128,
123
+ sec_ch_ua_mobile: 8,
124
+ sec_ch_ua_platform: 32,
125
+ sec_ch_ua_arch: 16,
126
+ sec_ch_ua_full_version_list: 256,
127
+ sec_ch_ua_model: 128,
128
+ sec_ch_device_memory: 8,
129
+ }
130
+
131
+ headers_max_length.each do |attribute, max_size|
132
+ next unless self.respond_to?("#{attribute}=") # Skip if attribute setter method doesn't exist
133
+
134
+ value = self.send(attribute) # Get the value of the attribute dynamically
135
+ next unless value.is_a?(String) # Skip if the value is not a string
63
136
 
64
- max_length < 0 ? value[max_length] : value[0, max_length]
137
+ if max_size && value.length > max_size
138
+ # Truncate the value if it exceeds the max size
139
+ truncated_value = max_size < 0 ? value[max_size] : value[0, max_size]
140
+ self.send("#{attribute}=", truncated_value) # Set the truncated value to the attribute
141
+ end
142
+ end
143
+ end
144
+
145
+ def to_hash
146
+ {
147
+ addr: @addr,
148
+ clientIp: @client_ip,
149
+ contentType: @content_type,
150
+ host: @host,
151
+ port: @port,
152
+ xRealIP: @x_real_ip,
153
+ xForwardedForIp: @x_forwarded_for_ip,
154
+ acceptEncoding: @accept_encoding,
155
+ acceptLanguage: @accept_language,
156
+ accept: @accept,
157
+ method: @method,
158
+ protocol: @protocol,
159
+ serverHostname: @server_hostname,
160
+ referer: @referer,
161
+ userAgent: @user_agent,
162
+ from: @from,
163
+ request: @request,
164
+ origin: @origin,
165
+ acceptCharset: @accept_charset,
166
+ connection: @connection,
167
+ clientID: @client_id,
168
+ secCHUA: @sec_ch_ua,
169
+ secCHUAMobile: @sec_ch_ua_mobile,
170
+ secCHUAPlatform: @sec_ch_ua_platform,
171
+ secCHUAArch: @sec_ch_ua_arch,
172
+ secCHUAFullVersionList: @sec_ch_ua_full_version_list,
173
+ secCHUAModel: @sec_ch_ua_model,
174
+ secCHDeviceMemory: @sec_ch_device_memory,
175
+ }
65
176
  end
66
177
  end
67
178
 
68
179
  class DataDomeRequest
69
- attr_accessor :module, :header
180
+ attr_reader :module, :header, :account, :status, :session, :user
70
181
 
71
- def initialize(request)
182
+ def initialize(datadome_headers)
72
183
  @module = DataDomeModule.new
73
- @header = DataDomeHeaders.new(request)
184
+ @header = datadome_headers
185
+ # Do not forget headers truncation
186
+ @header.truncate_attributes
187
+ # Dynamic attributes that holds Event data when payload is created
188
+ @account = {}
189
+ @status = {}
190
+ @session = {}
191
+ @user = {}
74
192
  end
75
193
 
76
194
  def to_json(options = {})
77
- {
78
- module: @module.to_json,
79
- header: @header.to_json,
80
- }.to_json
195
+ data = {
196
+ module: @module.to_hash,
197
+ header: @header.to_hash,
198
+ account: @account,
199
+ status: @status,
200
+ session: @session,
201
+ user: @user,
202
+ }
203
+ JSON.generate(data, options)
81
204
  end
82
205
  end
@@ -11,8 +11,13 @@ module DataDomeResponseStatus
11
11
  TIMEOUT = "timeout"
12
12
  end
13
13
 
14
- class Error
15
- attr_accessor :field, :error
14
+ class DataDomeError
15
+ attr_reader :field, :error
16
+
17
+ def initialize(error)
18
+ @field = error&.fetch("field", nil)
19
+ @error = error&.fetch("error", nil)
20
+ end
16
21
  end
17
22
 
18
23
  class DataDomeResponse
@@ -24,7 +29,7 @@ class DataDomeResponse
24
29
  end
25
30
 
26
31
  def to_s
27
- "DataDomeResponse: action=#{action}, status=#{status}"
32
+ "DataDomeResponse: action=#{@action}, status=#{@status}"
28
33
  end
29
34
 
30
35
  def to_json(options = {})
@@ -36,7 +41,7 @@ class DataDomeResponse
36
41
  end
37
42
 
38
43
  class DataDomeResponseSuccess < DataDomeResponse
39
- attr_accessor :ip, :reasons, :location
44
+ attr_reader :ip, :reasons, :location
40
45
 
41
46
  def initialize(action, status, reasons, ip, location)
42
47
  super(action, status)
@@ -46,7 +51,7 @@ class DataDomeResponseSuccess < DataDomeResponse
46
51
  end
47
52
 
48
53
  def to_s
49
- "DataDomeResponseSuccess: action=#{action}, status=#{status}, reasons=#{reasons}, ip=#{ip}, location=#{location}"
54
+ "DataDomeResponseSuccess: action=#{@action}, status=#{@status}, reasons=#{@reasons}, ip=#{@ip}, location=#{@location}"
50
55
  end
51
56
 
52
57
  def to_json(options = {})
@@ -61,7 +66,7 @@ class DataDomeResponseSuccess < DataDomeResponse
61
66
  end
62
67
 
63
68
  class DataDomeResponseError < DataDomeResponse
64
- attr_accessor :message, :errors
69
+ attr_reader :message, :errors
65
70
 
66
71
  def initialize(action, status, message, errors)
67
72
  super(action, status)
@@ -70,7 +75,7 @@ class DataDomeResponseError < DataDomeResponse
70
75
  end
71
76
 
72
77
  def to_s
73
- "DataDomeResponseError: action=#{action}, status=#{status}, message=#{message}, errors=#{errors}"
78
+ "DataDomeResponseError: action=#{@action}, status=#{@status}, message=#{@message}, errors=#{@errors}"
74
79
  end
75
80
 
76
81
  def to_json(options = {})
data/lib/model/events.rb CHANGED
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module ActionType
3
+ module DataDomeActionType
4
4
  LOGIN = "login"
5
5
  REGISTER = "registration"
6
6
  end
7
7
 
8
- module StatusType
8
+ module DataDomeStatusType
9
9
  SUCCEEDED = "succeeded"
10
10
  FAILED = "failed"
11
11
  UNDEFINED = "undefined"
@@ -14,7 +14,7 @@ end
14
14
  class DataDomeEvent
15
15
  attr_accessor :action, :status, :account
16
16
 
17
- def initialize(action, account, status = StatusType::UNDEFINED)
17
+ def initialize(action, account, status = DataDomeStatusType::UNDEFINED)
18
18
  @action = action
19
19
  @account = account
20
20
  @status = status
@@ -27,17 +27,17 @@ class DataDomeEvent
27
27
  end
28
28
  end
29
29
 
30
- class LoginEvent < DataDomeEvent
31
- def initialize(account, status = StatusType::UNDEFINED)
32
- super(ActionType::LOGIN, account, status)
30
+ class DataDomeLoginEvent < DataDomeEvent
31
+ def initialize(account:, status: DataDomeStatusType::UNDEFINED)
32
+ super(DataDomeActionType::LOGIN, account, status)
33
33
  end
34
34
  end
35
35
 
36
- class RegistrationEvent < DataDomeEvent
36
+ class DataDomeRegistrationEvent < DataDomeEvent
37
37
  attr_accessor :user, :session
38
38
 
39
- def initialize(account, user, session = nil, status = StatusType::UNDEFINED)
40
- super(ActionType::REGISTER, account, status)
39
+ def initialize(account:, user:, session: nil, status: DataDomeStatusType::UNDEFINED)
40
+ super(DataDomeActionType::REGISTER, account, status)
41
41
  @session = session
42
42
  @user = user
43
43
  end
@@ -0,0 +1,21 @@
1
+ class DataDomeLocation
2
+ attr_reader :country_code, :country, :city
3
+
4
+ def initialize(location: nil)
5
+ @country_code = location&.fetch("countryCode", nil)
6
+ @country = location&.fetch("country", nil)
7
+ @city = location&.fetch("city", nil)
8
+ end
9
+
10
+ def to_s
11
+ "DataDomeLocation: countryCode=#{@country_code}, country=#{@country}, city=#{@city}"
12
+ end
13
+
14
+ def to_json(options = {})
15
+ {
16
+ countryCode: @country_code,
17
+ country: @country,
18
+ city: @city,
19
+ }.to_json
20
+ end
21
+ end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module OperationType
3
+ module DataDomeOperationType
4
4
  VALIDATE = "validate"
5
5
  COLLECT = "collect"
6
6
  end
data/lib/model/session.rb CHANGED
@@ -3,22 +3,21 @@
3
3
  require "time"
4
4
 
5
5
  class DataDomeSession
6
- attr_reader :id, :createdAt
6
+ attr_reader :id, :created_at
7
7
 
8
- def initialize(id, createdAt = Time.now.iso8601)
8
+ def initialize(id:, created_at: Time.now.iso8601)
9
9
  @id = id
10
- @createdAt = createdAt
10
+ @created_at = created_at
11
11
  end
12
12
 
13
13
  def to_s
14
- "DataDomeSession: id=#{id}, createdAt =#{createdAt}"
14
+ "DataDomeSession: id=#{@id}, createdAt =#{@created_at}"
15
15
  end
16
16
 
17
17
  def to_json(options = {})
18
18
  {
19
19
  id: id,
20
- createdAt: createdAt,
20
+ createdAt: created_at,
21
21
  }.to_json
22
22
  end
23
23
  end
24
-
data/lib/model/user.rb CHANGED
@@ -3,7 +3,7 @@
3
3
  require "time"
4
4
  require_relative "./address"
5
5
 
6
- module Title
6
+ module DataDomeTitle
7
7
  EMPTY = nil
8
8
  MR = "mr"
9
9
  MRS = "mrs"
@@ -11,27 +11,29 @@ module Title
11
11
  end
12
12
 
13
13
  class DataDomeUser
14
- def initialize(id, title = nil, firstName = nil, lastName = nil, createdAt = Time.now.iso8601, phone = nil, email = nil, address = nil)
14
+ attr_accessor :id, :title, :first_name, :last_name, :created_at, :phone, :email, :address
15
+
16
+ def initialize(id:, title: nil, first_name: nil, last_name: nil, created_at: Time.now.iso8601, phone: nil, email: nil, address: nil)
15
17
  @id = id
16
18
  @title = title
17
- @firstName = firstName
18
- @lastName = lastName
19
- @createdAt = createdAt
19
+ @first_name = first_name
20
+ @last_name = last_name
21
+ @created_at = created_at
20
22
  @phone = phone
21
23
  @email = email
22
24
  @address = address
23
25
  end
24
26
 
25
27
  def to_s
26
- "DataDomeUser: id=#{id}, title =#{title}, firstname =#{firstName}, lastname =#{lastName} createdAt =#{createdAt}, phone =#{phone}, address= #{address}"
28
+ "DataDomeUser: id=#{@id}, title=#{@title}, firstName=#{@first_name}, lastName=#{@last_name}, createdAt=#{@created_at}, phone=#{@phone}, address=#{@address}"
27
29
  end
28
30
 
29
31
  def to_json(options = {})
30
32
  {
31
33
  id: @id,
32
- firstName: @firstName,
33
- lastName: @lastName,
34
- createdAt: @createdAt,
34
+ firstName: @first_name,
35
+ lastName: @last_name,
36
+ createdAt: @created_at,
35
37
  phone: @phone,
36
38
  email: @email,
37
39
  address: @address,
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: datadome_fraud_sdk_ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - DataDome
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-04-18 00:00:00.000000000 Z
11
+ date: 2024-05-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.8'
19
+ version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.8'
26
+ version: '0'
27
27
  description: DataDome Fraud Protection - Ruby SDK
28
28
  email: support@datadome.co
29
29
  executables: []
@@ -37,6 +37,7 @@ files:
37
37
  - lib/model/api/request.rb
38
38
  - lib/model/api/response.rb
39
39
  - lib/model/events.rb
40
+ - lib/model/location.rb
40
41
  - lib/model/operation.rb
41
42
  - lib/model/session.rb
42
43
  - lib/model/user.rb