bloom_remit_client 0.15.0 → 0.17.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.
Files changed (57) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/push.yml +27 -0
  3. data/.ruby-version +1 -1
  4. data/CHANGELOG.md +24 -0
  5. data/Gemfile +2 -1
  6. data/README.md +61 -0
  7. data/bloom_remit_client.gemspec +5 -5
  8. data/lib/bloom_remit_client.rb +43 -50
  9. data/lib/bloom_remit_client/client.rb +7 -133
  10. data/lib/bloom_remit_client/models/deposit_target.rb +23 -0
  11. data/lib/bloom_remit_client/models/txn.rb +39 -0
  12. data/lib/bloom_remit_client/models/txn_preview.rb +15 -0
  13. data/lib/bloom_remit_client/requests/base_request.rb +18 -0
  14. data/lib/bloom_remit_client/requests/create_txn_preview_request.rb +24 -0
  15. data/lib/bloom_remit_client/requests/create_txn_request.rb +79 -0
  16. data/lib/bloom_remit_client/requests/get_deposit_targets_request.rb +13 -0
  17. data/lib/bloom_remit_client/responses/base_response.rb +18 -0
  18. data/lib/bloom_remit_client/responses/create_txn_preview_response.rb +16 -0
  19. data/lib/bloom_remit_client/responses/create_txn_response.rb +16 -0
  20. data/lib/bloom_remit_client/responses/get_deposit_targets_response.rb +14 -0
  21. data/lib/bloom_remit_client/version.rb +1 -1
  22. metadata +26 -50
  23. data/.travis.yml +0 -9
  24. data/lib/bloom_remit_client/coercers/path.rb +0 -11
  25. data/lib/bloom_remit_client/concerns/has_base_authentification.rb +0 -16
  26. data/lib/bloom_remit_client/models/biller.rb +0 -16
  27. data/lib/bloom_remit_client/models/credit.rb +0 -12
  28. data/lib/bloom_remit_client/models/deposit_strategy.rb +0 -11
  29. data/lib/bloom_remit_client/models/payment.rb +0 -23
  30. data/lib/bloom_remit_client/models/recipient.rb +0 -18
  31. data/lib/bloom_remit_client/models/remittance.rb +0 -22
  32. data/lib/bloom_remit_client/models/user.rb +0 -21
  33. data/lib/bloom_remit_client/requests/base.rb +0 -55
  34. data/lib/bloom_remit_client/requests/billers/list.rb +0 -23
  35. data/lib/bloom_remit_client/requests/credit/history.rb +0 -20
  36. data/lib/bloom_remit_client/requests/credit/list.rb +0 -20
  37. data/lib/bloom_remit_client/requests/deposit_strategies/list.rb +0 -21
  38. data/lib/bloom_remit_client/requests/payments/create.rb +0 -31
  39. data/lib/bloom_remit_client/requests/rate/show.rb +0 -29
  40. data/lib/bloom_remit_client/requests/recipients/create.rb +0 -32
  41. data/lib/bloom_remit_client/requests/recipients/list.rb +0 -34
  42. data/lib/bloom_remit_client/requests/remittances/calculate.rb +0 -33
  43. data/lib/bloom_remit_client/requests/remittances/create.rb +0 -30
  44. data/lib/bloom_remit_client/requests/requests_sender.rb +0 -35
  45. data/lib/bloom_remit_client/requests/senders/create.rb +0 -30
  46. data/lib/bloom_remit_client/requests/txns/create.rb +0 -30
  47. data/lib/bloom_remit_client/requests/url_builder.rb +0 -51
  48. data/lib/bloom_remit_client/responses/base.rb +0 -31
  49. data/lib/bloom_remit_client/responses/billers/list.rb +0 -17
  50. data/lib/bloom_remit_client/responses/deposit_strategies/list.rb +0 -20
  51. data/lib/bloom_remit_client/responses/payments/create.rb +0 -17
  52. data/lib/bloom_remit_client/responses/recipients/create.rb +0 -20
  53. data/lib/bloom_remit_client/responses/recipients/list.rb +0 -20
  54. data/lib/bloom_remit_client/responses/remittances/calculate.rb +0 -69
  55. data/lib/bloom_remit_client/responses/remittances/create.rb +0 -20
  56. data/lib/bloom_remit_client/responses/senders/create.rb +0 -21
  57. data/lib/bloom_remit_client/responses/txns/create.rb +0 -20
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 7e3d3eb4e19e4f0df31b5199543356abe637ac2c
4
- data.tar.gz: d4ae32bcd68390aeadc409f8d1bf0001f4216e47
2
+ SHA256:
3
+ metadata.gz: 22bca419858375c58c67060d10b221c404dfb69e5edaa78561106647273d8590
4
+ data.tar.gz: d8de77bc7e9205a5a4048b5c39f5b6d55d623dc5957685bf60ea4525390f4f03
5
5
  SHA512:
6
- metadata.gz: 4bb2d94df2377fde8b3316aebfc25807688c9b8b10e809adcf478fb01a2c60e6b063587dd3df12bc07e4d1d3ba466510af12389c796d5c7b672ca5187a954a66
7
- data.tar.gz: abc4eb600379b1ea90900c1356a52043d1cb48bd91309b7b4d9c901a715836557cff9f5c7835b7a06aa3cf912f5f87a13bff46fbb98b785037e855df9e93a943
6
+ metadata.gz: 3a6ca007f405f223d7d9c3f1d7b78166b28525e2de8d30b5bc47e4f179c87312a639737b752f481ab288db867ee2b9af37babf080fbe773617f45915cd0695b1
7
+ data.tar.gz: 5e28b826243ab762b174d31900a2a7355853259c2ebb71b30c7ae480e267e661c8b1c541a4109062fd4e5599cbfb91044e07783fdb680a3297e9d8107cee69e7
@@ -0,0 +1,27 @@
1
+ name: Ruby Gem
2
+
3
+ on:
4
+ pull_request:
5
+ branches:
6
+ - master
7
+ push:
8
+ branches:
9
+ - master
10
+
11
+ jobs:
12
+ test:
13
+
14
+ runs-on: ubuntu-latest
15
+
16
+ steps:
17
+ - uses: actions/checkout@v2
18
+ - name: Set up Ruby
19
+ uses: ruby/setup-ruby@v1
20
+ with:
21
+ ruby-version: 2.7.2
22
+ - name: Bundle install
23
+ run: bundle install
24
+ - name: Copy spec config
25
+ run: cp spec/config.yml{.sample,}
26
+ - name: Run tests
27
+ run: bundle exec rspec
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- ruby-2.3.1
1
+ ruby-2.7.2
data/CHANGELOG.md CHANGED
@@ -2,6 +2,30 @@
2
2
  All notable changes to this project will be documented in this file.
3
3
  This project adheres to [Semantic Versioning](http://semver.org/).
4
4
 
5
+ ## [0.17.1] - 2021-02-03
6
+ ### Added
7
+ - Add `create_txn#errors` to easily access errors
8
+
9
+ ## [0.17.0] - 2021-02-01
10
+ ### Added
11
+ - `#get_deposit_targets` to list all deposit targets
12
+
13
+ ## [0.16.2] - 2021-01-26
14
+ ### Changed
15
+ - `CreateTxnPreviewResponse#errors` change from `Hash` to `Array`
16
+
17
+ ## [0.16.1] - 2021-01-19
18
+ ### Changed
19
+ - Allow nil for both `partner_id` and `api_secret
20
+
21
+ ## [0.16.0] - 2021-01-18
22
+ ### Changed
23
+ - Removed all API methods (complete overhaul)
24
+
25
+ ### Added
26
+ - `#create_txn` to create transactions
27
+ - `#create_txn_preview` to determine fees, eta, and max amount of a transaction
28
+
5
29
  ## [0.15.0] - 2017-04-26
6
30
  ### Changed
7
31
  - Production domain is now `www.bloomremit.net`
data/Gemfile CHANGED
@@ -5,4 +5,5 @@ gemspec
5
5
 
6
6
  gem "pry"
7
7
  gem "pry-byebug"
8
- gem "virtus-matchers", github: "g5/virtus-matchers"
8
+
9
+ gem "message_bus_client_worker", github: "bloom-solutions/message_bus_client_worker", branch: "feat-subscribe"
data/README.md CHANGED
@@ -22,6 +22,67 @@ Or install it yourself as:
22
22
 
23
23
  See `spec/functional` for examples.
24
24
 
25
+ To subscribe to transaction updates, configure the following (in an initializer if you're using Rails):
26
+
27
+ ```ruby
28
+ MessageBusClientWorker.configure do |c|
29
+ c.subscriptions = {
30
+ "https://bloomremit.net" => {
31
+ headers: {
32
+ # TOKEN here is a Base64.strict_encode64 string composed of
33
+ # your PARTNER_ID and API_SECRET joined by a colon character
34
+ "Authorization" => "Basic #{TOKEN}"
35
+ },
36
+ channels: {
37
+ "/v2/txns" => { processor: "ProcessBloomRemitTxnUpdate" },
38
+ }
39
+ },
40
+ }
41
+
42
+ # Consider changing MessageBusClientWorker to incrementally add subscriptions
43
+ # and not overwrite like above. Warn if a host is already defined.
44
+ # If we do this, then we can add a helper method to this gem, that adds the sub:
45
+ # BloomRemitClient.configure do |c|
46
+ # c.partner_id = ENV["BLOOM_REMIT_PARTNER_ID"]
47
+ # c.api_secret = ENV["BLOOM_REMIT_API_SECRET"]
48
+ # c.on_txn_update = "ProcessBloomRemitTxnUpdate" # setting this will trigger the MBCW subscription
49
+ # end
50
+ c.subscribe(
51
+ "https://bloomremit.net" => {
52
+ headers: { "Authorization" => "Basic #{TOKEN}" },
53
+ channels: {
54
+ "/v2/txns" => { processor: "ProcessBloomRemitTxnUpdate" },
55
+ }
56
+ },
57
+ )
58
+ end
59
+ ```
60
+
61
+ ```ruby
62
+ BloomRemitClient.configure do |c|
63
+ c.partner_id = ENV["BLOOM_REMIT_PARTNER_ID"]
64
+ c.api_secret = ENV["BLOOM_REMIT_API_SECRET"]
65
+ c.on_txn_update = "ProcessBloomRemitTxnUpdate"
66
+ end
67
+
68
+ BloomRemitClient.configure_message_bus_client_worker!
69
+ ```
70
+
71
+ Make sure `MessageBusClientWorker` (the gem used underneath this gem) is enqueued at an interval, so your app will continually fetch updates. See [Staying subscribed](https://github.com/bloom-solutions/message_bus_client_worker#staying-subscribed) in MessageBusClientWorker. Note that you will need to have Sidekiq for `MessageBusClientWorker` to function.
72
+
73
+ Somewhere in your app, define `ProcessBloomRemitTxnUpdates` to update your own database:
74
+
75
+ ```ruby
76
+ class ProcessBloomRemitTxnUpdates
77
+ def self.call(remote_txn)
78
+ # remote_txn passed to you is an instance of BloomRemitClient::Txn model
79
+ if withdrawal = Withdrawal.find_by(id: remote_txn.client_external_id)
80
+ withdrawal.update(status: remote_txn.status)
81
+ end
82
+ end
83
+ end
84
+ ```
85
+
25
86
  ## Factories
26
87
 
27
88
  To make testing easier, you may `require 'bloom_remit_client/factories'` in your app.
@@ -26,17 +26,17 @@ Gem::Specification.new do |spec|
26
26
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
27
27
  spec.require_paths = ["lib"]
28
28
 
29
- spec.add_dependency "activemodel"
30
29
  spec.add_dependency "activesupport"
31
- spec.add_dependency "httparty"
32
- spec.add_dependency "addressable"
30
+ spec.add_dependency "api_client_base"
31
+ spec.add_dependency "typhoeus"
32
+ spec.add_dependency "message_bus_client_worker"
33
33
 
34
- spec.add_development_dependency "bundler", "~> 1.12"
34
+ spec.add_development_dependency "bundler", "~> 2.0"
35
35
  spec.add_development_dependency "rake", "~> 10.0"
36
36
  spec.add_development_dependency "rspec", "~> 3.0"
37
37
  spec.add_development_dependency "vcr"
38
38
  spec.add_development_dependency 'faker'
39
39
  spec.add_development_dependency "webmock"
40
40
  spec.add_development_dependency "dotenv"
41
- spec.add_development_dependency "shoulda-matchers"
41
+ spec.add_development_dependency "virtus-matchers"
42
42
  end
@@ -1,66 +1,59 @@
1
1
  # frozen_string_literal: true
2
- require 'virtus'
3
- require 'httparty'
4
- require 'active_model'
2
+ require "api_client_base"
5
3
  require 'active_support/core_ext/hash/indifferent_access'
6
4
  require 'active_support/core_ext/object/try'
5
+ require "message_bus_client_worker"
7
6
  require 'bloom_remit_client/coercers/indifferent_hash'
8
- require 'bloom_remit_client/coercers/path'
9
- require 'bloom_remit_client/concerns/has_base_authentification'
10
7
  require "bloom_remit_client/version"
11
8
  require "bloom_remit_client/client"
12
- require "bloom_remit_client/models/biller"
13
- require "bloom_remit_client/models/deposit_strategy"
14
- require "bloom_remit_client/models/user"
15
- require "bloom_remit_client/models/payment"
16
- require "bloom_remit_client/models/remittance"
17
- require "bloom_remit_client/models/credit"
18
- require "bloom_remit_client/models/recipient"
9
+ require "bloom_remit_client/models/txn"
10
+ require "bloom_remit_client/models/txn_preview"
11
+ require "bloom_remit_client/models/deposit_target"
19
12
  require "bloom_remit_client/requests"
20
- require "bloom_remit_client/requests/url_builder"
21
- require "bloom_remit_client/requests/requests_sender"
22
- require "bloom_remit_client/requests/base"
23
- require "bloom_remit_client/requests/credit/list"
24
- require "bloom_remit_client/requests/credit/history"
25
- require "bloom_remit_client/requests/rate/show"
26
- require "bloom_remit_client/requests/billers/list"
27
- require "bloom_remit_client/requests/deposit_strategies/list"
28
- require "bloom_remit_client/requests/senders/create"
29
- require "bloom_remit_client/requests/payments/create"
30
- require "bloom_remit_client/requests/remittances/create"
31
- require "bloom_remit_client/requests/recipients/create"
32
- require "bloom_remit_client/requests/recipients/list"
33
- require "bloom_remit_client/requests/remittances/calculate"
34
- require "bloom_remit_client/requests/txns/create"
35
- require "bloom_remit_client/responses/base"
36
- require "bloom_remit_client/responses/billers/list"
37
- require "bloom_remit_client/responses/deposit_strategies/list"
38
- require "bloom_remit_client/responses/senders/create"
39
- require "bloom_remit_client/responses/payments/create"
40
- require "bloom_remit_client/responses/remittances/create"
41
- require "bloom_remit_client/responses/recipients/create"
42
- require "bloom_remit_client/responses/recipients/list"
43
- require "bloom_remit_client/responses/remittances/calculate"
44
- require "bloom_remit_client/responses/txns/create"
13
+ require "bloom_remit_client/requests/base_request"
14
+ require "bloom_remit_client/requests/create_txn_request"
15
+ require "bloom_remit_client/requests/create_txn_preview_request"
16
+ require "bloom_remit_client/requests/get_deposit_targets_request"
17
+ require "bloom_remit_client/responses/base_response"
18
+ require "bloom_remit_client/responses/create_txn_response"
19
+ require "bloom_remit_client/responses/create_txn_preview_response"
20
+ require "bloom_remit_client/responses/get_deposit_targets_response"
45
21
 
46
22
  module BloomRemitClient
47
- PRODUCTION = 'www.bloomremit.net'
48
- STAGING = 'staging.bloomremit.net'
49
23
 
50
- class << self
51
- attr_accessor :host
52
- attr_accessor :sandbox
24
+ PRODUCTION = 'https://www.bloomremit.net'
25
+ STAGING = 'https://staging.bloomremit.net'
53
26
 
54
- def new(args={})
55
- client_args = {}
56
- client_args[:host] = self.host if self.host.present?
57
- client_args[:sandbox] = self.sandbox if self.sandbox.present?
58
- client_args.merge!(args)
27
+ include APIClientBase::Base.module
59
28
 
60
- client = Client.new(client_args)
61
- raise ArgumentError, client.errors.full_messages if client.invalid?
62
- client
29
+ TXN_UPDATES_CHANNEL = "/v2/txns".freeze
30
+
31
+ with_configuration do
32
+ has :host, classes: String, default: STAGING
33
+ has :partner_id, classes: [String, NilClass]
34
+ has :api_secret, classes: [String, NilClass]
35
+ has :on_txn_update, classes: [String, NilClass]
36
+ end
37
+
38
+ def self.configure_message_bus_client_worker!
39
+ if configuration.on_txn_update.blank?
40
+ fail "`on_txn_update` must be defined"
63
41
  end
64
42
 
43
+ token = [
44
+ configuration.partner_id,
45
+ configuration.api_secret,
46
+ ].join(":")
47
+ token = Base64.strict_encode64(token)
48
+
49
+ MessageBusClientWorker.subscribe(configuration.host, {
50
+ headers: {
51
+ "HTTP_AUTHORIZATION" => "Basic #{token}"
52
+ },
53
+ channels: {
54
+ TXN_UPDATES_CHANNEL => { processor: configuration.on_txn_update },
55
+ }
56
+ })
65
57
  end
58
+
66
59
  end
@@ -1,144 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
  module BloomRemitClient
3
3
  class Client
4
- include Virtus.model
5
- include ActiveModel::Validations
4
+ include APIClientBase::Client.module(default_opts: :default_opts)
6
5
 
7
- attribute :api_token, String
6
+ attribute :partner_id, String
8
7
  attribute :api_secret, String
9
- attribute :agent_id, String
10
8
  attribute :host, String, lazy: true, default: :default_host
11
- attribute :sandbox, Boolean, default: true
12
9
 
13
- validates :host, presence: true
14
- validates :sandbox, inclusion: { in: [true, false] }
10
+ api_action :create_txn
11
+ api_action :create_txn_preview
12
+ api_action :get_deposit_targets
15
13
 
16
- # GET
17
- # /api/v1/partners/:api_token/credits
18
- # Parameters: none
19
- def credits(params = {})
20
- request_params = params.merge(access_params)
21
- request = Requests::Credit::List.new(request_params)
22
- request.call!
23
- end
24
-
25
- # GET
26
- # /api/v1/partners/:api_token/credits/history
27
- # Parameters: none
28
- def credits_history(params = {})
29
- request_params = params.merge(access_params)
30
- request = Requests::Credit::History.new(request_params)
31
- request.call!
32
- end
33
-
34
- # GET
35
- # /api/v1/rates
36
- # Parameters:
37
- # partner_id:
38
- # String, required
39
- # API token
40
- # api_secret:
41
- # String, required
42
- # currency:
43
- # One of: [USDPHP, USDUSD, USDKRW, USDAUD, USDCAD, USDJPY, USDNZD, USDSGD, USDHKD,
44
- # USDCNY, USDEUR, USDVND, USDSAR, USDTWD, USDQAR, USDKWD, USDAED, USDGBP,
45
- # USDMYR, USDINR, USDIDR, USDBTC],
46
- # optional
47
- def rates(params = {})
48
- request_params = params.merge(access_params)
49
- request = Requests::Rate::Show.new(request_params)
50
- request.call!
51
- end
52
-
53
- def billers(params={})
54
- request_params = params.merge(access_params)
55
- request = Requests::Billers::List.new(request_params)
56
- raw_response = request.call!
57
- Responses::Billers::List.new(raw_response: raw_response)
58
- end
59
-
60
- def create_sender(sender_params={})
61
- params = {sender: sender_params}
62
- request_params = params.merge(default_params).merge(access_params)
63
- request = Requests::Senders::Create.new(request_params)
64
- raw_response = request.call!
65
- Responses::Senders::Create.new(raw_response: raw_response)
66
- end
67
-
68
- def create_payment(payment_params={})
69
- params = {payment: payment_params}.
70
- merge(sender_id: payment_params[:sender_id])
71
- request_params = params.merge(default_params).merge(access_params)
72
- request = Requests::Payments::Create.new(request_params)
73
- raw_response = request.call!
74
- Responses::Payments::Create.new(raw_response: raw_response)
75
- end
76
-
77
- def create_recipient(recipient_params={})
78
- params = {recipient: recipient_params}.
79
- merge(sender_id: recipient_params[:sender_id])
80
- request_params = params.merge(default_params).merge(access_params)
81
- request = Requests::Recipients::Create.new(request_params)
82
- raw_response = request.call!
83
- Responses::Recipients::Create.new(raw_response: raw_response)
84
- end
85
-
86
- def recipient_list(recipient_params={})
87
- request_params = recipient_params.merge(access_params)
88
- request = Requests::Recipients::List.new(request_params)
89
- raw_response = request.call!
90
- Responses::Recipients::List.new(raw_response: raw_response)
91
- end
92
-
93
- def create_remittance(remittance_params={})
94
- params = {remittance: remittance_params}.
95
- merge(sender_id: remittance_params[:sender_id]).
96
- merge(recipient_id: remittance_params[:recipient_id])
97
- request_params = params.merge(default_params).merge(access_params)
98
- request = Requests::Remittances::Create.new(request_params)
99
- raw_response = request.call!
100
- Responses::Remittances::Create.new(raw_response: raw_response)
101
- end
102
-
103
- def calculate_remittance(calculate_params={})
104
- params = access_params.merge(calculate_params)
105
- request = Requests::Remittances::Calculate.new(params)
106
- raw_response = request.call!
107
- Responses::Remittances::Calculate.new(raw_response: raw_response)
108
- end
109
-
110
- def deposit_strategies_list
111
- request_params = access_params
112
- request = Requests::DepositStrategies::List.new(request_params)
113
- raw_response = request.call!
114
- Responses::DepositStrategies::List.new(raw_response: raw_response)
115
- end
116
-
117
- def create_txn(txn_params={})
118
- params = {txn: txn_params}.merge(
119
- sender_id: txn_params[:sender_id],
120
- recipient_id: txn_params[:recipient_id],
121
- )
122
- request_params = params.merge(default_params).merge(access_params)
123
- request = Requests::Txns::Create.new(request_params)
124
- raw_response = request.call!
125
- Responses::Txns::Create.new(raw_response: raw_response)
126
- end
127
-
128
- private
129
-
130
- # Should overwrite any other `:api_token`, `:api_secret`
131
- def access_params
132
- @access_params ||= attributes.slice(:host, :api_token, :api_secret)
133
- end
134
-
135
- def default_params
136
- @default_params ||= attributes.slice(:agent_id)
137
- end
138
-
139
- def default_host
140
- return BloomRemitClient::STAGING if self.sandbox.nil? || self.sandbox
141
- BloomRemitClient::PRODUCTION
14
+ def default_opts
15
+ { host: host, partner_id: partner_id, api_secret: api_secret }
142
16
  end
143
17
 
144
18
  end
@@ -0,0 +1,23 @@
1
+ module BloomRemitClient
2
+ class DepositTarget
3
+
4
+ include Virtus.model
5
+
6
+ attribute :slug, String
7
+ attribute :name, String
8
+ attribute :active, Boolean
9
+ attribute :wait_time, String
10
+ attribute :support_line, String
11
+ attribute :sameday_cutoff, Integer
12
+ attribute :maximum, BigDecimal
13
+ attribute :availability, Array
14
+ attribute :availability_daynames, String
15
+ attribute :currencies, Array
16
+ attribute :required_fields, Array
17
+ attribute :type, String
18
+ attribute :iso_code, String
19
+ attribute :data, Hash
20
+ attribute :country, String
21
+
22
+ end
23
+ end