bloom_remit_client 0.15.0 → 0.17.1

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