sift 4.2.0 → 4.5.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: cf4d6cd2e8ea54d5ea80fdca8b5668a1f86aa2639eaa1b69a105e8e81dd31222
4
- data.tar.gz: cd087556fba6bbfd8269366fb8a7ae1c4727841a184056f09406a9c6d78658f5
3
+ metadata.gz: 71be696ff04ffb1503d22a724241e5087809d2ffa2ab29f08666939ecd6bb98b
4
+ data.tar.gz: e2e841d8259fbea8c247b1b2bd3cdf208bd53ded613a765a75f595714a2e1e8d
5
5
  SHA512:
6
- metadata.gz: 66a74c28328b082be3b0f492f0f001c998a7bc99bd95ede179a4c950974b332b4b55158cf418677ce4b904307464912f3248a56b200b88bb76038fd38cdff281
7
- data.tar.gz: e6bb108cbcbf692266ff6d87a0a426476e8ad0a4523a2436a9f3d6f201ceeab63baad1121466e6a1ef7ec16df7135a577e59e532fe3d463ea47c6c7f47955576
6
+ metadata.gz: 9b578f6bccf6323d4ef53947cea5a517678920d882439da1d1df262cf5eb39e45064aab3a1dee702da01f41f29a522df0c5e7b850c68e1ac302fa0f7d9830e29
7
+ data.tar.gz: 3c4565ffc5f98626ac67a07b378adfd80aaef787e47ffc50d84780da4b62788bdfb43e1b2e4ed90ca59cb4ee0fe23ec727dad8d1c0dd9413c137d7ec1de95510
data/.circleci/config.yml CHANGED
@@ -81,8 +81,25 @@ jobs:
81
81
  - slack/notify:
82
82
  <<: *slack_notify
83
83
 
84
+ run_integration_tests:
85
+ docker:
86
+ - image: circleci/ruby:2.4.2-jessie-node
87
+ steps:
88
+ - checkout
89
+ - run:
90
+ name: Install bundle and run the tests
91
+ command: |
92
+ bundle check || bundle install
93
+ bundle exec ruby test_integration_app/main.rb
94
+
84
95
  workflows:
85
96
  ruby-test:
86
97
  jobs:
87
98
  - build:
88
99
  context: *context
100
+ ruby-integration-tests:
101
+ jobs:
102
+ - run_integration_tests:
103
+ filters:
104
+ branches:
105
+ only: master
@@ -0,0 +1,38 @@
1
+ name: Build and Publish Gem
2
+ on:
3
+ release:
4
+ types: [published]
5
+
6
+ env:
7
+ GH_TOKEN: ${{ github.token }}
8
+
9
+ jobs:
10
+ build_and_publish:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - name: Checkout code
14
+ uses: actions/checkout@v3
15
+ - name: Set up Ruby
16
+ uses: ruby/setup-ruby@v1
17
+ with:
18
+ ruby-version: 2.7
19
+ - name: Install Bundler
20
+ run: |
21
+ sudo gem install bundler
22
+ bundle install
23
+ - name: Build and push gem
24
+ run: |
25
+ mkdir -p $HOME/.gem
26
+ touch $HOME/.gem/credentials
27
+ chmod 0600 $HOME/.gem/credentials
28
+ printf -- "---\n:rubygems_api_key: ${{ secrets.GH_RGEMS_KEY }}\n" > $HOME/.gem/credentials
29
+ version=$(awk -F'"' '/ VERSION = / {print $2}' < lib/sift/version.rb)
30
+ all_versions=$(gem list -r -e --all sift --no-verbose)
31
+ if [[ $all_versions != *"$version"* ]]; then
32
+ echo "Gem version does not exist on RubyGems. Building and pushing!"
33
+ gem build sift.gemspec
34
+ gem push sift-$version.gem
35
+ rm -rf $HOME/.gem
36
+ else
37
+ echo "Gem version $version exists on RubyGems"
38
+ fi
data/.gitignore CHANGED
@@ -3,3 +3,4 @@
3
3
  .bundle
4
4
  Gemfile.lock
5
5
  pkg/*
6
+ .idea
@@ -0,0 +1,103 @@
1
+ // Load Jenkins shared library
2
+ jenkinsBranch = 'v0.37.0'
3
+ sharedLib = library("shared-lib@${jenkinsBranch}")
4
+
5
+ def siftRubyWorkflow = sharedLib.com.sift.ci.SiftRubyWorkflow.new()
6
+ def ciUtil = sharedLib.com.sift.ci.CIUtil.new()
7
+ def stackdriver = sharedLib.com.sift.ci.StackDriverMetrics.new()
8
+
9
+ // Default GitHub status context for automatically triggered builds
10
+ def defaultStatusContext = 'Jenkins:auto'
11
+
12
+ // Pod template file for Jenkins agent pod
13
+ // Pod template yaml file is defined in https://github.com/SiftScience/jenkins/tree/master/resources/jenkins-k8s-pod-templates
14
+ def ruby2PodTemplateFile = 'ruby-2-4-2-pod-template.yaml'
15
+ def ruby2PodLabel = "ruby2-${BUILD_TAG}"
16
+
17
+
18
+ // GitHub repo name
19
+ def repoName = 'sift-ruby'
20
+
21
+ pipeline {
22
+ agent none
23
+ options {
24
+ timestamps()
25
+ skipDefaultCheckout()
26
+ disableConcurrentBuilds()
27
+ disableRestartFromStage()
28
+ parallelsAlwaysFailFast()
29
+ buildDiscarder logRotator(artifactDaysToKeepStr: '', artifactNumToKeepStr: '', daysToKeepStr: '30', numToKeepStr: '')
30
+ timeout(time: 1, unit: 'HOURS')
31
+ }
32
+ environment {
33
+ GIT_BRANCH = "${env.CHANGE_BRANCH != null? env.CHANGE_BRANCH : env.BRANCH_NAME}"
34
+ }
35
+ stages {
36
+ stage('Initialize') {
37
+ steps {
38
+ script {
39
+ statusContext = defaultStatusContext
40
+ // Get the commit sha for the build
41
+ commitSha = ciUtil.commitHashForBuild()
42
+ ciUtil.updateGithubCommitStatus(repoName, statusContext, 'Started', 'pending', commitSha)
43
+ }
44
+ }
45
+ }
46
+ stage ('Build and Test Workflows') {
47
+ steps {
48
+ script {
49
+ def workflows = [:]
50
+ def stage1 = 'Run Integration Tests - ruby'
51
+ workflows[stage1] = {
52
+ stage(stage1) {
53
+ if (env.GIT_BRANCH.equals('master')) {
54
+ ciUtil.updateGithubCommitStatus(repoName, stage1, 'Started', 'pending', commitSha)
55
+ try {
56
+ siftRubyWorkflow.runSiftRubyIntegration(ruby2PodTemplateFile, ruby2PodLabel)
57
+ ciUtil.updateGithubCommitStatus(repoName, stage1, 'SUCCESS', 'success', commitSha)
58
+ } catch (Exception e) {
59
+ ciUtil.updateGithubCommitStatus(repoName, stage1, 'FAILURE', 'failure', commitSha)
60
+ print("${stage1} failed")
61
+ throw e
62
+ }
63
+ }
64
+ }
65
+ }
66
+ def stage2 = 'Test - ruby'
67
+ workflows[stage2] = {
68
+ stage(stage2) {
69
+ ciUtil.updateGithubCommitStatus(repoName, stage2, 'Started', 'pending', commitSha)
70
+ try {
71
+ siftRubyWorkflow.runSiftRubyTest(ruby2PodTemplateFile, ruby2PodLabel)
72
+ ciUtil.updateGithubCommitStatus(repoName, stage2, 'SUCCESS', 'success', commitSha)
73
+ } catch (Exception e) {
74
+ ciUtil.updateGithubCommitStatus(repoName, stage2, 'FAILURE', 'failure', commitSha)
75
+ print("${stage2} failed")
76
+ throw e
77
+ }
78
+ }
79
+ }
80
+ parallel workflows
81
+ }
82
+ }
83
+ }
84
+ }
85
+ post {
86
+ success {
87
+ script {
88
+ ciUtil.updateGithubCommitStatus(repoName, statusContext, currentBuild.currentResult, 'success', commitSha)
89
+ }
90
+ }
91
+ unsuccessful {
92
+ script {
93
+ ciUtil.updateGithubCommitStatus(repoName, statusContext, currentBuild.currentResult, 'failure', commitSha)
94
+ ciUtil.notifySlack(repoName, commitSha)
95
+ }
96
+ }
97
+ always {
98
+ script {
99
+ stackdriver.updatePipelineStatistics(this)
100
+ }
101
+ }
102
+ }
103
+ }
data/HISTORY CHANGED
@@ -1,3 +1,12 @@
1
+ === 4.5.0 2024-05-16
2
+ - Support for warnings in Events API
3
+
4
+ === 4.4.0 2023-10-05
5
+ - Score percentiles in Score API
6
+
7
+ === 4.3.0 2023-08-21
8
+ - PSP Merchant Management API
9
+
1
10
  === 4.2.0 2023-06-20
2
11
  - Verification API support [Verification API](https://sift.com/developers/docs/curl/verification-api/overview)
3
12
  - Support for score percentiles (only applicable for the accounts with the feature enabled)
data/README.md CHANGED
@@ -1,5 +1,4 @@
1
1
  # sift-ruby
2
- [![CircleCI](https://circleci.com/gh/SiftScience/sift-ruby.svg?style=svg)](https://circleci.com/gh/SiftScience/sift-ruby)
3
2
 
4
3
  The official Ruby bindings for the latest version (v205) of the [Sift API](https://sift.com/developers/docs/java/apis-overview).
5
4
 
@@ -39,8 +38,22 @@ client = Sift::Client.new(api_key: '<your_api_key_here>', account_id: '<your_acc
39
38
 
40
39
  ```
41
40
 
42
- ### Sending a transaction event
41
+ ### Sending an event
42
+ Send event to Sift.
43
+ To learn more about the Events API visit our [developer docs](https://developers.sift.com/docs/ruby/events-api/overview).
43
44
 
45
+
46
+ **Optional Params**
47
+ - `return_score`: `:true` or `:false`
48
+ - `return_action`: `:true` or `:false`
49
+ - `return_workflow_status`: `:true` or `:false`
50
+ - `return_route_info`: `:true` or `:false`
51
+ - `force_workflow_run`: `:true` or `:false`
52
+ - `include_score_percentiles`: `:true` or `:false`
53
+ - `warnings`: `:true` or `:false`
54
+ - `abuse_types`: `["payment_abuse", "content_abuse", "content_abuse", "account_abuse", "legacy", "account_takeover"]`
55
+
56
+ **Example:**
44
57
  ```ruby
45
58
  event = "$transaction"
46
59
 
@@ -217,6 +230,72 @@ response = client.get_session_decisions('example_user_id', 'example_session_id')
217
230
  response = client.get_content_decisions('example_user_id', 'example_order_id')
218
231
  ```
219
232
 
233
+ ## PSP Merchant Management API
234
+
235
+ To learn more about the decisions endpoint visit our [developer docs](https://sift.com/developers/docs/ruby/psp-merchant-management-api).
236
+
237
+ ```ruby
238
+ # On-board a PSP merchant summary to Sift Platform.
239
+ # Sample psp_merchant_profile
240
+ properties = {
241
+ "id": "merchant_id_01000",
242
+ "name": "Wonderful Payments Inc.",
243
+ "description": "Wonderful Payments payment provider.",
244
+ "address": {
245
+ "name": "Alany",
246
+ "address_1": "Big Payment blvd, 22",
247
+ "address_2": "apt, 8",
248
+ "city": "New Orleans",
249
+ "region": "NA",
250
+ "country": "US",
251
+ "zipcode": "76830",
252
+ "phone": "0394888320"
253
+ },
254
+ "category": "1002",
255
+ "service_level": "Platinum",
256
+ "status": "active",
257
+ "risk_profile": {
258
+ "level": "low",
259
+ "score": 10
260
+ }
261
+ }
262
+ response = client.create_psp_merchant_profile(properties)
263
+
264
+ # Update a merchant summary to reflect changes in the status or service level or address etc.
265
+ properties = {
266
+ "id": "merchant_id_01000",
267
+ "name": "Wonderful Payments Inc.",
268
+ "description": "Wonderful Payments payment provider.",
269
+ "address": {
270
+ "name": "Alany",
271
+ "address_1": "Big Payment blvd, 22",
272
+ "address_2": "apt, 8",
273
+ "city": "New Orleans",
274
+ "region": "NA",
275
+ "country": "US",
276
+ "zipcode": "76830",
277
+ "phone": "0394888320"
278
+ },
279
+ "category": "1002",
280
+ "service_level": "Platinum",
281
+ "status": "active",
282
+ "risk_profile": {
283
+ "level": "low",
284
+ "score": 10
285
+ }
286
+ }
287
+ response = client.update_psp_merchant_profile('merchant_id', properties)
288
+
289
+ # Get the existing PSP merchant summaries.
290
+ response = client.get_a_psp_merchant_profile('merchant_id')
291
+
292
+ # Get all PSP merchant summaries
293
+ response = client.get_psp_merchant_profiles()
294
+
295
+ # Get PSP merchant summaries paginated
296
+ response = client.get_psp_merchant_profiles('batch_size', 'batch_token')
297
+ ```
298
+
220
299
  ## Response Object
221
300
 
222
301
  All requests to our apis will return a `Response` instance.
@@ -252,3 +331,21 @@ To run the various tests use the rake command as follows:
252
331
  ```ruby
253
332
  $ rake spec
254
333
  ```
334
+
335
+ ## Integration testing app
336
+
337
+ For testing the app with real calls it is possible to run the integration testing app,
338
+ it makes calls to almost all our public endpoints to make sure the library integrates
339
+ well. At the moment, the app is run on every merge to master
340
+
341
+ #### How to run it locally
342
+
343
+ 1. Add env variable `ACCOUNT_ID` with the valid account id
344
+ 2. Add env variable `API_KEY` with the valid Api Key associated from the account
345
+ 3. Run the following under the project root folder
346
+ ```
347
+ # Install the budle locally
348
+ bundle check || bundle install
349
+ # Run the app
350
+ bundle exec ruby test_integration_app/main.rb
351
+ ```
@@ -0,0 +1,105 @@
1
+ require 'rubygems'
2
+ require 'sift'
3
+ require 'multi_json'
4
+
5
+ class MyLogger
6
+ def warn(e)
7
+ puts "[WARN] " + e.to_s
8
+ end
9
+
10
+ def error(e)
11
+ puts "[ERROR] " + e.to_s
12
+ end
13
+
14
+ def fatal(e)
15
+ puts "[FATAL] " + e.to_s
16
+ end
17
+
18
+ def info(e)
19
+ puts "[INFO] " + e.to_s
20
+ end
21
+ end
22
+
23
+ def handle_response(response)
24
+ if response.nil?
25
+ puts 'Error: there was an HTTP error calling through the API'
26
+ else
27
+ puts 'Successfully sent request; was ok? : ' + response.ok?.to_s
28
+ puts 'API error message : ' + response.api_error_message.to_s
29
+ puts 'API status code : ' + response.api_status.to_s
30
+ puts 'HTTP status code : ' + response.http_status_code.to_s
31
+ puts 'original request : ' + response.original_request.to_s
32
+ puts 'response body : ' + response.body.to_s
33
+ end
34
+ end
35
+
36
+ Sift.logger = MyLogger.new
37
+
38
+ $api_key = 'put-valid-api-key'
39
+ $account_id = 'put-valid-account-id'
40
+
41
+ def post_merchant_properties
42
+ # Sample psp_merchant_profile
43
+ {
44
+ "id": "merchant_id_01004",
45
+ "name": "Wonderful Payments Inc.",
46
+ "description": "Wonderful Payments payment provider.",
47
+ "address": {
48
+ "name": "Alany",
49
+ "address_1": "Big Payment blvd, 22",
50
+ "address_2": "apt, 8",
51
+ "city": "New Orleans",
52
+ "region": "NA",
53
+ "country": "US",
54
+ "zipcode": "76830",
55
+ "phone": "0394888320"
56
+ },
57
+ "category": "1002",
58
+ "service_level": "Platinum",
59
+ "status": "active",
60
+ "risk_profile": {
61
+ "level": "low",
62
+ "score": 10
63
+ }
64
+ }
65
+ end
66
+
67
+ def put_merchant_properties
68
+ # Sample update psp_merchant_profile
69
+ {
70
+ "id": "merchant_id_01004",
71
+ "name": "Wonderful Payments Inc. update",
72
+ "description": "Wonderful Payments payment provider. update",
73
+ "address": {
74
+ "name": "Alany",
75
+ "address_1": "Big Payment blvd, 22",
76
+ "address_2": "apt, 8",
77
+ "city": "New Orleans",
78
+ "region": "NA",
79
+ "country": "US",
80
+ "zipcode": "76830",
81
+ "phone": "0394888320"
82
+ },
83
+ "category": "1002",
84
+ "service_level": "Platinum",
85
+ "status": "active",
86
+ "risk_profile": {
87
+ "level": "low",
88
+ "score": 10
89
+ }
90
+ }
91
+ end
92
+
93
+ # handle_response Sift::Client.new(:api_key => $api_key, :account_id => $account_id).create_psp_merchant_profile(post_merchant_properties)
94
+
95
+ # handle_response Sift::Client.new(:api_key => $api_key, :account_id => $account_id).update_psp_merchant_profile("merchant_id_01004", put_merchant_properties)
96
+
97
+ # handle_response Sift::Client.new(:api_key => $api_key, :account_id => $account_id).get_a_psp_merchant_profile("merchant_id_01004")
98
+
99
+ # handle_response Sift::Client.new(:api_key => $api_key, :account_id => $account_id).get_psp_merchant_profiles()
100
+
101
+ # handle_response Sift::Client.new(:api_key => $api_key, :account_id => $account_id).get_psp_merchant_profiles(2)
102
+
103
+ handle_response Sift::Client.new(:api_key => $api_key, :account_id => $account_id).get_psp_merchant_profiles(5, "next_ref")
104
+
105
+ puts "request completed"
data/lib/sift/client.rb CHANGED
@@ -201,6 +201,12 @@ module Sift
201
201
  #
202
202
  # :path::
203
203
  # Overrides the URI path for this API call.
204
+ #
205
+ # :include_score_percentiles::
206
+ # include_score_percentiles(optional) : Whether to add new parameter in the query parameter.
207
+ #
208
+ # :warnings::
209
+ # warnings(optional) : Whether to add list of warnings (if any) to response.
204
210
  #
205
211
  # ==== Returns:
206
212
  #
@@ -220,6 +226,7 @@ module Sift
220
226
  force_workflow_run = opts[:force_workflow_run]
221
227
  abuse_types = opts[:abuse_types]
222
228
  include_score_percentiles = opts[:include_score_percentiles]
229
+ warnings = opts[:warnings]
223
230
 
224
231
  raise("event must be a non-empty string") if (!event.is_a? String) || event.empty?
225
232
  raise("properties cannot be empty") if properties.empty?
@@ -232,8 +239,12 @@ module Sift
232
239
  query["return_route_info"] = "true" if return_route_info
233
240
  query["force_workflow_run"] = "true" if force_workflow_run
234
241
  query["abuse_types"] = abuse_types.join(",") if abuse_types
235
- if include_score_percentiles == "true"
236
- query["fields"] = "SCORE_PERCENTILES"
242
+
243
+ if include_score_percentiles == "true" || warnings == "true"
244
+ fields = []
245
+ fields << "SCORE_PERCENTILES" if include_score_percentiles == "true"
246
+ fields << "WARNINGS" if warnings == "true"
247
+ query["fields"] = fields.join(",")
237
248
  end
238
249
 
239
250
  options = {
@@ -275,6 +286,9 @@ module Sift
275
286
  #
276
287
  # :version::
277
288
  # Overrides the version of the Events API to call.
289
+ #
290
+ # :include_score_percentiles::
291
+ # include_score_percentiles(optional) : Whether to add new parameter in the query parameter.
278
292
  #
279
293
  # ==== Returns:
280
294
  #
@@ -286,6 +300,7 @@ module Sift
286
300
  api_key = opts[:api_key] || @api_key
287
301
  timeout = opts[:timeout] || @timeout
288
302
  version = opts[:version] || @version
303
+ include_score_percentiles = opts[:include_score_percentiles]
289
304
 
290
305
  raise("user_id must be a non-empty string") if (!user_id.is_a? String) || user_id.to_s.empty?
291
306
  raise("Bad api_key parameter") if api_key.empty?
@@ -293,6 +308,9 @@ module Sift
293
308
  query = {}
294
309
  query["api_key"] = api_key
295
310
  query["abuse_types"] = abuse_types.join(",") if abuse_types
311
+ if include_score_percentiles == "true"
312
+ query["fields"] = "SCORE_PERCENTILES"
313
+ end
296
314
 
297
315
  options = {
298
316
  :headers => {"User-Agent" => user_agent},
@@ -332,6 +350,9 @@ module Sift
332
350
  #
333
351
  # :timeout::
334
352
  # Overrides the timeout (in seconds) for this call.
353
+ #
354
+ # :include_score_percentiles::
355
+ # include_score_percentiles(optional) : Whether to add new parameter in the query parameter.
335
356
  #
336
357
  # ==== Returns:
337
358
  #
@@ -342,6 +363,7 @@ module Sift
342
363
  abuse_types = opts[:abuse_types]
343
364
  api_key = opts[:api_key] || @api_key
344
365
  timeout = opts[:timeout] || @timeout
366
+ include_score_percentiles = opts[:include_score_percentiles]
345
367
 
346
368
  raise("user_id must be a non-empty string") if (!user_id.is_a? String) || user_id.to_s.empty?
347
369
  raise("Bad api_key parameter") if api_key.empty?
@@ -349,6 +371,9 @@ module Sift
349
371
  query = {}
350
372
  query["api_key"] = api_key
351
373
  query["abuse_types"] = abuse_types.join(",") if abuse_types
374
+ if include_score_percentiles == "true"
375
+ query["fields"] = "SCORE_PERCENTILES"
376
+ end
352
377
 
353
378
  options = {
354
379
  :headers => {"User-Agent" => user_agent},
@@ -785,6 +810,111 @@ module Sift
785
810
  Response.new(response.body, response.code, response.response)
786
811
  end
787
812
 
813
+ def create_psp_merchant_profile(properties = {}, opts = {})
814
+ # Create a new PSP Merchant profile
815
+ # Args:
816
+ # properties: A dict of merchant profile data.
817
+ # Returns
818
+ # A sift.client.Response object if the call succeeded, else raises an ApiException
819
+
820
+ account_id = opts[:account_id] || @account_id
821
+ api_key = opts[:api_key] || @api_key
822
+ timeout = opts[:timeout] || @timeout
823
+
824
+ raise("api_key cannot be empty") if api_key.empty?
825
+ raise("account_id cannot be empty") if account_id.empty?
826
+ raise("properties cannot be empty") if properties.empty?
827
+
828
+ options = {
829
+ :body => MultiJson.dump(delete_nils(properties)),
830
+ :headers => { "User-Agent" => user_agent, "Content-Type" => "application/json" },
831
+ :basic_auth => { :username => api_key, :password => "" }
832
+ }
833
+ options.merge!(:timeout => timeout) unless timeout.nil?
834
+ response = self.class.post(API_ENDPOINT + Sift.psp_merchant_api_path(account_id), options)
835
+ Response.new(response.body, response.code, response.response)
836
+ end
837
+
838
+ def update_psp_merchant_profile(merchant_id, properties = {}, opts = {})
839
+ # Update an existing PSP Merchant profile
840
+ # Args:
841
+ # merchant_id: id of merchant
842
+ # properties: A dict of merchant profile data.
843
+ # Returns
844
+ # A sift.client.Response object if the call succeeded, else raises an ApiException
845
+
846
+ account_id = opts[:account_id] || @account_id
847
+ api_key = opts[:api_key] || @api_key
848
+ timeout = opts[:timeout] || @timeout
849
+
850
+ raise("api_key cannot be empty") if api_key.empty?
851
+ raise("account_id cannot be empty") if account_id.empty?
852
+ raise("merchant_id cannot be empty") if merchant_id.empty?
853
+ raise("properties cannot be empty") if properties.empty?
854
+
855
+ options = {
856
+ :body => MultiJson.dump(delete_nils(properties)),
857
+ :headers => { "User-Agent" => user_agent, "Content-Type" => "application/json" },
858
+ :basic_auth => { :username => api_key, :password => "" }
859
+ }
860
+ options.merge!(:timeout => timeout) unless timeout.nil?
861
+ response = self.class.put(API_ENDPOINT + Sift.psp_merchant_id_api_path(account_id, merchant_id), options)
862
+ Response.new(response.body, response.code, response.response)
863
+ end
864
+
865
+ def get_a_psp_merchant_profile(merchant_id, opts = {})
866
+ # Gets a PSP merchant profile using merchant id.
867
+ # Args:
868
+ # merchant_id: id of merchant
869
+ # Returns
870
+ # A sift.client.Response object if the call succeeded, else raises an ApiException
871
+
872
+ account_id = opts[:account_id] || @account_id
873
+ api_key = opts[:api_key] || @api_key
874
+ timeout = opts[:timeout] || @timeout
875
+
876
+ raise("api_key cannot be empty") if api_key.empty?
877
+ raise("account_id cannot be empty") if account_id.empty?
878
+ raise("merchant_id cannot be empty") if merchant_id.empty?
879
+
880
+ options = {
881
+ :headers => { "User-Agent" => user_agent, "Content-Type" => "application/json" },
882
+ :basic_auth => { :username => api_key, :password => "" }
883
+ }
884
+ options.merge!(:timeout => timeout) unless timeout.nil?
885
+ response = self.class.get(API_ENDPOINT + Sift.psp_merchant_id_api_path(account_id, merchant_id), options)
886
+ Response.new(response.body, response.code, response.response)
887
+ end
888
+
889
+ def get_psp_merchant_profiles(batch_size = nil, batch_token = nil, opts = {})
890
+ # Get all PSP merchant profiles.
891
+ # Args:
892
+ # batch_size : Batch or page size of the paginated sequence.
893
+ # batch_token : Batch or page position of the paginated sequence.
894
+ # Returns
895
+ # A sift.client.Response object if the call succeeded, else raises an ApiException
896
+
897
+ account_id = opts[:account_id] || @account_id
898
+ api_key = opts[:api_key] || @api_key
899
+ timeout = opts[:timeout] || @timeout
900
+
901
+ raise("api_key cannot be empty") if api_key.empty?
902
+ raise("account_id cannot be empty") if account_id.empty?
903
+
904
+ query = {}
905
+ query["batch_size"] = batch_size if batch_size
906
+ query["batch_token"] = batch_token if batch_token
907
+
908
+ options = {
909
+ :headers => { "User-Agent" => user_agent, "Content-Type" => "application/json" },
910
+ :basic_auth => { :username => api_key, :password => "" },
911
+ :query => query
912
+ }
913
+ options.merge!(:timeout => timeout) unless timeout.nil?
914
+ response = self.class.get(API_ENDPOINT + Sift.psp_merchant_api_path(account_id), options)
915
+ Response.new(response.body, response.code, response.response)
916
+ end
917
+
788
918
  private
789
919
 
790
920
  def handle_response(response)
data/lib/sift/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Sift
2
- VERSION = "4.2.0"
2
+ VERSION = "4.5.0"
3
3
  API_VERSION = "205"
4
4
  end
data/lib/sift.rb CHANGED
@@ -71,6 +71,18 @@ module Sift
71
71
  "/content/#{ERB::Util.url_encode(content_id)}/decisions"
72
72
  end
73
73
 
74
+ # Returns the path for psp Merchant API
75
+ def self.psp_merchant_api_path(account_id)
76
+ "/v3/accounts/#{ERB::Util.url_encode(account_id)}" \
77
+ "/psp_management/merchants"
78
+ end
79
+
80
+ # Returns the path for psp Merchant with id
81
+ def self.psp_merchant_id_api_path(account_id, merchant_id)
82
+ "/v3/accounts/#{ERB::Util.url_encode(account_id)}" \
83
+ "/psp_management/merchants/#{ERB::Util.url_encode(merchant_id)}"
84
+ end
85
+
74
86
  # Module-scoped public API key
75
87
  class << self
76
88
  attr_accessor :api_key