sift 2.1.1 → 2.2.1
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 +4 -4
- data/HISTORY +3 -0
- data/README.md +13 -3
- data/lib/sift/client/decision/apply_to.rb +9 -0
- data/lib/sift/validate/decision.rb +6 -0
- data/lib/sift/version.rb +1 -1
- data/spec/unit/client/decision/apply_to_spec.rb +76 -4
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e4c2e3042d8ff485909a45e093bfe1f1145e8f28
|
4
|
+
data.tar.gz: 57c0c4e3bb6cfdfe26cb5907717581d4ba8d3e25
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8f81535b358bab94f1156197e54612f3e8c81210dbbe38a45e68309eb3327bfc9c6ac164921fcece99059577ded9b6431f65caae9016513c00dfb512e4e76d3a
|
7
|
+
data.tar.gz: 063f7691c9f6f99f241db47f837135dd0e32fcb1d65d5c35aea1aece78effb4fa6fdfbdb97d758d2b9d6fb8905837f030bfd7b56b5c1ab942f7787bb1ef73a9f
|
data/HISTORY
CHANGED
data/README.md
CHANGED
@@ -32,7 +32,7 @@ client = Sift::Client.new()
|
|
32
32
|
|
33
33
|
##### OR
|
34
34
|
|
35
|
-
client = Sift::
|
35
|
+
client = Sift::Client.new(api_key: '<your_api_key_here>', account_id: '<your_account_id_here>'
|
36
36
|
|
37
37
|
```
|
38
38
|
|
@@ -80,9 +80,9 @@ To learn more about the decisions endpoint visit our [developer docs](https://si
|
|
80
80
|
Get a list of your decisions.
|
81
81
|
|
82
82
|
**Optional Params**
|
83
|
-
- `entity_type`: `:user` or `:order`
|
83
|
+
- `entity_type`: `:user` or `:order` or `:session`
|
84
84
|
- `abuse_types`: `["payment_abuse", "content_abuse", "content_abuse",
|
85
|
-
"account_abuse", "legacy"]`
|
85
|
+
"account_abuse", "legacy", "account_takeover"]`
|
86
86
|
|
87
87
|
**Returns**
|
88
88
|
|
@@ -124,6 +124,7 @@ Applies a decision to an entity. Visit our [developer docs](http://siftscience.c
|
|
124
124
|
|
125
125
|
**Other Params**
|
126
126
|
- `order_id`: when applying a decision to an order, you must pass in the `order_id`
|
127
|
+
- `session_id`: when applying a decision to a session, you must pass in the `session_id`
|
127
128
|
- `analyst`: when `source` is set to `manual_review`, this field *is required*
|
128
129
|
|
129
130
|
**Returns**
|
@@ -148,6 +149,15 @@ response = client.apply_decision({
|
|
148
149
|
order_id: "ORDER_1234"
|
149
150
|
})
|
150
151
|
|
152
|
+
# apply decision to "bob@example.com"'s session
|
153
|
+
response = client.apply_decision({
|
154
|
+
decision_id: "block_bad_session",
|
155
|
+
source: "manual_review",
|
156
|
+
analyst: "bob@your_company.com",
|
157
|
+
user_id: "john@example.com",
|
158
|
+
session_id: "SESSION_ID_1234"
|
159
|
+
})
|
160
|
+
|
151
161
|
# Make sure you handle the response after applying a decision:
|
152
162
|
|
153
163
|
if response.ok?
|
@@ -14,6 +14,7 @@ module Sift
|
|
14
14
|
analyst
|
15
15
|
description
|
16
16
|
order_id
|
17
|
+
session_id
|
17
18
|
user_id
|
18
19
|
account_id
|
19
20
|
time
|
@@ -75,6 +76,8 @@ module Sift
|
|
75
76
|
|
76
77
|
if applying_to_order?
|
77
78
|
validator.valid_order?
|
79
|
+
elsif applying_to_session?
|
80
|
+
validator.valid_session?
|
78
81
|
else
|
79
82
|
validator.valid_user?
|
80
83
|
end
|
@@ -86,9 +89,15 @@ module Sift
|
|
86
89
|
configs.has_key?("order_id") || configs.has_key?(:order_id)
|
87
90
|
end
|
88
91
|
|
92
|
+
def applying_to_session?
|
93
|
+
configs.has_key?("session_id") || configs.has_key?(:session_id)
|
94
|
+
end
|
95
|
+
|
89
96
|
def path
|
90
97
|
if applying_to_order?
|
91
98
|
"#{user_path}/orders/#{CGI.escape(order_id)}/decisions"
|
99
|
+
elsif applying_to_session?
|
100
|
+
"#{user_path}/sessions/#{CGI.escape(session_id)}/decisions"
|
92
101
|
else
|
93
102
|
"#{user_path}/decisions"
|
94
103
|
end
|
data/lib/sift/version.rb
CHANGED
@@ -112,6 +112,42 @@ module Sift
|
|
112
112
|
end
|
113
113
|
end
|
114
114
|
|
115
|
+
context "without a valid user_id or session_id" do
|
116
|
+
it "will return a response object with the error message" do
|
117
|
+
configs = {
|
118
|
+
source: "manual",
|
119
|
+
analyst: "foobar@example.com",
|
120
|
+
description: "be blocking errrday allday",
|
121
|
+
decision: decision,
|
122
|
+
"session_id" => nil,
|
123
|
+
user_id: "user_1234"
|
124
|
+
}
|
125
|
+
|
126
|
+
applier = ApplyTo.new(api_key, decision_id, configs)
|
127
|
+
|
128
|
+
response = applier.run
|
129
|
+
non_empty_string_error =
|
130
|
+
Validate::Primitive::ERROR_MESSAGES[:non_empty_string]
|
131
|
+
error_message = "session_id #{non_empty_string_error}, got NilClass"
|
132
|
+
|
133
|
+
expect(response.ok?).to be(false)
|
134
|
+
expect(response.body["error_message"]).to eq(error_message)
|
135
|
+
|
136
|
+
## Invalid user_id
|
137
|
+
|
138
|
+
configs.delete(:user_id)
|
139
|
+
configs.delete("session_id")
|
140
|
+
|
141
|
+
applier = ApplyTo.new(api_key, decision_id, configs)
|
142
|
+
|
143
|
+
response = applier.run
|
144
|
+
error_message = "user_id #{non_empty_string_error}, got NilClass"
|
145
|
+
|
146
|
+
expect(response.ok?).to be(false)
|
147
|
+
expect(response.body["error_message"]).to eq(error_message)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
115
151
|
context "when api returns an error code" do
|
116
152
|
it "will return a response with the information" do
|
117
153
|
configs = {
|
@@ -141,7 +177,7 @@ module Sift
|
|
141
177
|
end
|
142
178
|
end
|
143
179
|
|
144
|
-
describe "
|
180
|
+
describe "#run" do
|
145
181
|
it "will construct the right path given the configs" do
|
146
182
|
user_id = "bad_user@example.com"
|
147
183
|
order_id = "ORDER_1235"
|
@@ -156,8 +192,8 @@ module Sift
|
|
156
192
|
"/users/#{CGI.escape(user_id)}" +
|
157
193
|
"/decisions"
|
158
194
|
|
159
|
-
|
160
|
-
|
195
|
+
expect("https://api3.siftscience.com/v3/accounts/account_id" +
|
196
|
+
"/users/bad_user%40example.com/decisions").to eq(path)
|
161
197
|
|
162
198
|
applier = ApplyTo.new(api_key, decision_id, {
|
163
199
|
user_id: user_id,
|
@@ -169,11 +205,47 @@ module Sift
|
|
169
205
|
"/v3/accounts/#{decision.account_id}/users/" +
|
170
206
|
"#{CGI.escape(user_id)}/orders/#{CGI.escape(order_id)}" +
|
171
207
|
"/decisions"
|
208
|
+
|
209
|
+
expect("https://api3.siftscience.com/v3/accounts/account_id" +
|
210
|
+
"/users/bad_user%40example.com/orders/ORDER_1235/decisions").to eq(path)
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
describe "#run" do
|
215
|
+
it "will construct the right path given the configs" do
|
216
|
+
user_id = "bad_user@example.com"
|
217
|
+
session_id = "gigtleqddo84l8cm15qe4il"
|
218
|
+
|
219
|
+
applier = ApplyTo.new(api_key, decision_id, {
|
220
|
+
user_id: user_id,
|
221
|
+
account_id: decision.account_id,
|
222
|
+
})
|
223
|
+
|
224
|
+
path = Client::API3_ENDPOINT +
|
225
|
+
"/v3/accounts/#{decision.account_id}" +
|
226
|
+
"/users/#{CGI.escape(user_id)}" +
|
227
|
+
"/decisions"
|
172
228
|
|
173
|
-
expect(
|
229
|
+
expect("https://api3.siftscience.com/v3/accounts/account_id" +
|
230
|
+
"/users/bad_user%40example.com/decisions").to eq(path)
|
231
|
+
|
232
|
+
applier = ApplyTo.new(api_key, decision_id, {
|
233
|
+
user_id: user_id,
|
234
|
+
account_id: decision.account_id,
|
235
|
+
session_id: session_id
|
236
|
+
})
|
237
|
+
|
238
|
+
path = Client::API3_ENDPOINT +
|
239
|
+
"/v3/accounts/#{decision.account_id}/users/" +
|
240
|
+
"#{CGI.escape(user_id)}/sessions/#{CGI.escape(session_id)}" +
|
241
|
+
"/decisions"
|
242
|
+
|
243
|
+
expect("https://api3.siftscience.com/v3/accounts/account_id" +
|
244
|
+
"/users/bad_user%40example.com/sessions/gigtleqddo84l8cm15qe4il/decisions").to eq(path)
|
174
245
|
end
|
175
246
|
end
|
176
247
|
|
248
|
+
|
177
249
|
# TODO(Kaoru): When we move to webmock 2 we won't need to do this
|
178
250
|
# hackery
|
179
251
|
#
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sift
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Fred Sadaghiani
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2018-02-15 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rspec
|
@@ -158,7 +158,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
158
158
|
version: '0'
|
159
159
|
requirements: []
|
160
160
|
rubyforge_project: sift
|
161
|
-
rubygems_version: 2.
|
161
|
+
rubygems_version: 2.4.6
|
162
162
|
signing_key:
|
163
163
|
specification_version: 4
|
164
164
|
summary: Sift Science Ruby API Gem
|