sift 2.1.1 → 2.2.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|