datadome_fraud_sdk_ruby 1.1.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 92c514d743f75302d1d5feafa93f424f0835edf132d509586bbda5ecb7a88a46
4
- data.tar.gz: 7ede40dea73ad22e61f486122f157e977856ca11ca9e7222de4294ef4e4c7262
3
+ metadata.gz: c2434a89b8290f901080492cb9491bfa2c56cf62da19504d1eb6ae987d411fdb
4
+ data.tar.gz: 121d6dbc02235af5e37c71a7acf58ce65bc1c8e3d65df37aea5e98ac115b8752
5
5
  SHA512:
6
- metadata.gz: 7d955b2b2051ecf0107fbd2a7f47d79471c6fa7774b61109c347a3a034fa1a2e1b972b08592332e89519686574f7d1c6f5468186210c3e0f0aef057f7357a882
7
- data.tar.gz: ba94a9908561d38ef52605aedbccd8c567f8362cc188f688d4b40416b3353fec52efdef3135864830d4f304191c61ed1b23d607947f3cb3387e4bef3e14fcd53
6
+ metadata.gz: 78b9a208bff8a41ea879cc4e70584f63156af5892b8cc2402647d112224902f071bc98b769903aa445ce5afebdde5d316de7064b1123028929a148cc63a4bce1
7
+ data.tar.gz: bebb991f6d5bd9f9c1faef493473e145cef3f4755b0633e26671d604e6ee0d39413d3f5f7c30c24adea391d52ce0d11364693de07f9c93841874a54a5a774445
data/lib/constants.rb CHANGED
@@ -1,2 +1,2 @@
1
- SDK_VERSION = '1.1.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"
@@ -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)
@@ -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,6 +87,23 @@ class DataDome
86
87
 
87
88
  private
88
89
 
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))
103
+ end
104
+ payload
105
+ end
106
+
89
107
  def send_request(operation, event, payload)
90
108
  api_response = client.post("/v1/" + operation + "/" + event) do |req|
91
109
  req.body = payload.to_json
@@ -93,16 +111,6 @@ class DataDome
93
111
  api_response
94
112
  end
95
113
 
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)
102
- end
103
- payload
104
- end
105
-
106
114
  def client
107
115
  Faraday.new(api_uri) do |req|
108
116
  req.adapter Faraday.default_adapter
data/lib/model/address.rb CHANGED
@@ -1,20 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class DataDomeAddress
4
- attr_accessor :name, :line1, :line2, :city, :countryCode, :regionCode, :zipCode
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
- "DataDomeAddress: 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 DataDomeAddress
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
@@ -12,7 +12,12 @@ module DataDomeResponseStatus
12
12
  end
13
13
 
14
14
  class DataDomeError
15
- attr_accessor :field, :error
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 = {})
@@ -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
data/lib/model/session.rb CHANGED
@@ -3,21 +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
data/lib/model/user.rb CHANGED
@@ -11,27 +11,29 @@ module DataDomeTitle
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,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: datadome_fraud_sdk_ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.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-24 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
@@ -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