bloom_remit_client 0.11.0 → 0.16.0

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 (51) 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 +30 -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 -49
  9. data/lib/bloom_remit_client/client.rb +6 -115
  10. data/lib/bloom_remit_client/factories.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/responses/base_response.rb +18 -0
  17. data/lib/bloom_remit_client/responses/create_txn_preview_response.rb +16 -0
  18. data/lib/bloom_remit_client/responses/create_txn_response.rb +11 -0
  19. data/lib/bloom_remit_client/version.rb +1 -1
  20. metadata +23 -46
  21. data/.travis.yml +0 -9
  22. data/lib/bloom_remit_client/coercers/path.rb +0 -11
  23. data/lib/bloom_remit_client/concerns/has_base_authentification.rb +0 -16
  24. data/lib/bloom_remit_client/models/biller.rb +0 -16
  25. data/lib/bloom_remit_client/models/credit.rb +0 -12
  26. data/lib/bloom_remit_client/models/deposit_strategy.rb +0 -11
  27. data/lib/bloom_remit_client/models/payment.rb +0 -23
  28. data/lib/bloom_remit_client/models/recipient.rb +0 -17
  29. data/lib/bloom_remit_client/models/remittance.rb +0 -22
  30. data/lib/bloom_remit_client/models/user.rb +0 -21
  31. data/lib/bloom_remit_client/requests/base.rb +0 -55
  32. data/lib/bloom_remit_client/requests/billers/list.rb +0 -23
  33. data/lib/bloom_remit_client/requests/credit/history.rb +0 -20
  34. data/lib/bloom_remit_client/requests/credit/list.rb +0 -20
  35. data/lib/bloom_remit_client/requests/deposit_strategies/list.rb +0 -21
  36. data/lib/bloom_remit_client/requests/payments/create.rb +0 -31
  37. data/lib/bloom_remit_client/requests/rate/show.rb +0 -29
  38. data/lib/bloom_remit_client/requests/recipients/create.rb +0 -32
  39. data/lib/bloom_remit_client/requests/remittances/calculate.rb +0 -33
  40. data/lib/bloom_remit_client/requests/remittances/create.rb +0 -30
  41. data/lib/bloom_remit_client/requests/requests_sender.rb +0 -35
  42. data/lib/bloom_remit_client/requests/senders/create.rb +0 -29
  43. data/lib/bloom_remit_client/requests/url_builder.rb +0 -51
  44. data/lib/bloom_remit_client/responses/base.rb +0 -31
  45. data/lib/bloom_remit_client/responses/billers/list.rb +0 -17
  46. data/lib/bloom_remit_client/responses/deposit_strategies/list.rb +0 -20
  47. data/lib/bloom_remit_client/responses/payments/create.rb +0 -17
  48. data/lib/bloom_remit_client/responses/recipients/create.rb +0 -20
  49. data/lib/bloom_remit_client/responses/remittances/calculate.rb +0 -69
  50. data/lib/bloom_remit_client/responses/remittances/create.rb +0 -20
  51. data/lib/bloom_remit_client/responses/senders/create.rb +0 -21
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: cbac33b6e51679d2130cf9bd4a143066aedb8f1f
4
- data.tar.gz: 6085bfee06b7b23548d7fe6cc60a74a8fbe7dafb
2
+ SHA256:
3
+ metadata.gz: b61eba110a32fa17832fef1ca95d88379e2af7752207e2d706fd6f037e93a3d6
4
+ data.tar.gz: a83918d0ef84ca6cf531d5e6c4f2906d22bdadc44105cd5a272d31a11976eb3c
5
5
  SHA512:
6
- metadata.gz: 8244f31df11ab1a07224f14f1c5f82ac71213e7f40a9c92a65669aa167c13f6152a477c30bbfa851ef42912ab7823c61c244560711ed670602ee0334beee0880
7
- data.tar.gz: cfdbc9f841671769de0f2fbefc05461d684eb8dd51c1d2a8de85ccb773477a0fe8a7d643fa0144b2d37785941e7d69d95b01e0c4c29143ec5648bc188126be8e
6
+ metadata.gz: 96f507bb34b114baae330c80a4bf3ceab1b0ccab8dc1916eeda552641bc9462c1baea3ef8bae77671219ee630a0bb54337da0d393ce26a72c520317a401d7e02
7
+ data.tar.gz: 892dc312204c002d9c8fd26dd7b50975fb334e9fc3071fbd4d914f0362a6c3efcb7d4b53f68f10f022bbd1faf61a15f05b53c6b95252b6237ab067b17a58082a
@@ -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
@@ -1 +1 @@
1
- ruby-2.3.1
1
+ ruby-2.7.2
@@ -2,6 +2,36 @@
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.16.0] - 2020-01-18
6
+ ### Changed
7
+ - Removed all API methods (complete overhaul)
8
+
9
+ ### Added
10
+ - `#create_txn` to create transactions
11
+ - `#create_txn_preview` to determine fees, eta, and max amount of a transaction
12
+
13
+ ## [0.15.0] - 2017-04-26
14
+ ### Changed
15
+ - Production domain is now `www.bloomremit.net`
16
+ - Marked `pending` the failing specs:
17
+ - create payment
18
+ - fetch credits
19
+
20
+ ## [0.14.0] - 2016-10-05
21
+ ### Added
22
+ - Factories: `bloom_remit_client_responses_recipients_create`, `bloom_remit_client_responses_recipients_list`
23
+
24
+ ## [0.13.0] - 2016-10-05
25
+ ### Added
26
+ - Add `#recipient_list` to list the recipients of a sender
27
+
28
+ ## [0.12.0] - 2016-10-04
29
+ ### Added
30
+ - Add `#create_txn` that uses a single endpoint to create remittances and payments
31
+
32
+ ### Fixed
33
+ - Sender `agent_id` when creating a sender
34
+
5
35
  ## [0.11.0] - 2016-09-30
6
36
  ### Added
7
37
  - Expose `DepositStrategy#country`
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,62 +1,56 @@
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"
19
11
  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/remittances/calculate"
33
- require "bloom_remit_client/responses/base"
34
- require "bloom_remit_client/responses/billers/list"
35
- require "bloom_remit_client/responses/deposit_strategies/list"
36
- require "bloom_remit_client/responses/senders/create"
37
- require "bloom_remit_client/responses/payments/create"
38
- require "bloom_remit_client/responses/remittances/create"
39
- require "bloom_remit_client/responses/recipients/create"
40
- require "bloom_remit_client/responses/remittances/calculate"
12
+ require "bloom_remit_client/requests/base_request"
13
+ require "bloom_remit_client/requests/create_txn_request"
14
+ require "bloom_remit_client/requests/create_txn_preview_request"
15
+ require "bloom_remit_client/responses/base_response"
16
+ require "bloom_remit_client/responses/create_txn_response"
17
+ require "bloom_remit_client/responses/create_txn_preview_response"
41
18
 
42
19
  module BloomRemitClient
43
- PRODUCTION = 'api.bloom.solutions'
44
- STAGING = 'bloomremit-staging.herokuapp.com'
45
-
46
- class << self
47
- attr_accessor :host
48
- attr_accessor :sandbox
49
-
50
- def new(args={})
51
- client_args = {}
52
- client_args[:host] = self.host if self.host.present?
53
- client_args[:sandbox] = self.sandbox if self.sandbox.present?
54
- client_args.merge!(args)
55
-
56
- client = Client.new(client_args)
57
- raise ArgumentError, client.errors.full_messages if client.invalid?
58
- client
20
+
21
+ PRODUCTION = 'https://www.bloomremit.net'
22
+ STAGING = 'https://staging.bloomremit.net'
23
+
24
+ include APIClientBase::Base.module
25
+
26
+ TXN_UPDATES_CHANNEL = "/v2/txns".freeze
27
+
28
+ with_configuration do
29
+ has :host, classes: String, default: STAGING
30
+ has :partner_id, classes: String
31
+ has :api_secret, classes: String
32
+ has :on_txn_update, classes: [String, NilClass]
33
+ end
34
+
35
+ def self.configure_message_bus_client_worker!
36
+ if configuration.on_txn_update.blank?
37
+ fail "`on_txn_update` must be defined"
59
38
  end
60
39
 
40
+ token = [
41
+ configuration.partner_id,
42
+ configuration.api_secret,
43
+ ].join(":")
44
+ token = Base64.strict_encode64(token)
45
+
46
+ MessageBusClientWorker.subscribe(configuration.host, {
47
+ headers: {
48
+ "HTTP_AUTHORIZATION" => "Basic #{token}"
49
+ },
50
+ channels: {
51
+ TXN_UPDATES_CHANNEL => { processor: configuration.on_txn_update },
52
+ }
53
+ })
61
54
  end
55
+
62
56
  end
@@ -1,126 +1,17 @@
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
15
12
 
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 create_remittance(remittance_params={})
87
- params = {remittance: remittance_params}.
88
- merge(sender_id: remittance_params[:sender_id]).
89
- merge(recipient_id: remittance_params[:recipient_id])
90
- request_params = params.merge(default_params).merge(access_params)
91
- request = Requests::Remittances::Create.new(request_params)
92
- raw_response = request.call!
93
- Responses::Remittances::Create.new(raw_response: raw_response)
94
- end
95
-
96
- def calculate_remittance(calculate_params={})
97
- params = access_params.merge(calculate_params)
98
- request = Requests::Remittances::Calculate.new(params)
99
- raw_response = request.call!
100
- Responses::Remittances::Calculate.new(raw_response: raw_response)
101
- end
102
-
103
- def deposit_strategies_list
104
- request_params = access_params
105
- request = Requests::DepositStrategies::List.new(request_params)
106
- raw_response = request.call!
107
- Responses::DepositStrategies::List.new(raw_response: raw_response)
108
- end
109
-
110
- private
111
-
112
- # Should overwrite any other `:api_token`, `:api_secret`
113
- def access_params
114
- @access_params ||= attributes.slice(:host, :api_token, :api_secret)
115
- end
116
-
117
- def default_params
118
- @default_params ||= attributes.slice(:agent_id)
119
- end
120
-
121
- def default_host
122
- return BloomRemitClient::STAGING if self.sandbox.nil? || self.sandbox
123
- BloomRemitClient::PRODUCTION
13
+ def default_opts
14
+ { host: host, partner_id: partner_id, api_secret: api_secret }
124
15
  end
125
16
 
126
17
  end
@@ -25,4 +25,27 @@ FactoryGirl.define do
25
25
  body { {"json" => "value"} }
26
26
  end
27
27
 
28
+ factory(:bloom_remit_client_responses_recipients_create, {
29
+ class: "BloomRemitClient::Responses::Recipients::Create",
30
+ }) do
31
+ success true
32
+ body { {"json" => "value"} }
33
+ end
34
+
35
+ factory(:bloom_remit_client_responses_recipients_list, {
36
+ class: "BloomRemitClient::Responses::Recipients::List",
37
+ }) do
38
+ success true
39
+ recipients do
40
+ [
41
+ build(:bloom_remit_client_recipient),
42
+ build(:bloom_remit_client_recipient),
43
+ ]
44
+ end
45
+ end
46
+
47
+ factory :bloom_remit_client_recipient, class: "BloomRemitClient::Recipient" do
48
+ id { SecureRandom.uuid }
49
+ end
50
+
28
51
  end