bloom_remit_client 0.14.0 → 0.17.0

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 +27 -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 +11 -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: 3bb115b8b45fe5f9ab96fd1e252d17690e58a4bf
4
- data.tar.gz: 86cc02eb7fe6eca14439d1b72b028b0e11fe1839
2
+ SHA256:
3
+ metadata.gz: fe2d3c89254fb6d42b0b71b36a9257822156e278c5b6b6ee404df92de89adf88
4
+ data.tar.gz: e23d7e43db64bc42dbc1ea4b6e1ce1304fa0ebbdbb85f4964337185db5e038b6
5
5
  SHA512:
6
- metadata.gz: 3cc1d3ffce23d8998c4ebc57dc67e61932e8b5b724317ee56b2ca81950c4c0237d3ea42aad2ade24ff37f684e4b515639cf5540cf7794451bebc776576299747
7
- data.tar.gz: 893161507e4277eb2b91264a3d28d30cb546983c7cefd44360680061aa5c40f34ae82c3df869b509ad0dfa25008f908bc98599309238a28c9569dbf7a6e147da
6
+ metadata.gz: c3aca8a98842a779685825388f26f85fd882919ba5cdc8f28796df92ae592c0a20bb24439b9a4905f5fd469d1e185ecaca645e6378d59e8d3353b01ff1e479be
7
+ data.tar.gz: 8cff30a08e0663f88fa264bf7bce4edc92ddfca77b46e4a22a2a145ac46d8fc3abb9202a068665eede0e1d0f4a927f06e4d5dd2936bc2324e4129049208cecf6
@@ -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,33 @@
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.0] - 2021-02-01
6
+ ### Added
7
+ - `#get_deposit_targets` to list all deposit targets
8
+
9
+ ## [0.16.2] - 2021-01-26
10
+ ### Changed
11
+ - `CreateTxnPreviewResponse#errors` change from `Hash` to `Array`
12
+
13
+ ## [0.16.1] - 2021-01-19
14
+ ### Changed
15
+ - Allow nil for both `partner_id` and `api_secret
16
+
17
+ ## [0.16.0] - 2021-01-18
18
+ ### Changed
19
+ - Removed all API methods (complete overhaul)
20
+
21
+ ### Added
22
+ - `#create_txn` to create transactions
23
+ - `#create_txn_preview` to determine fees, eta, and max amount of a transaction
24
+
25
+ ## [0.15.0] - 2017-04-26
26
+ ### Changed
27
+ - Production domain is now `www.bloomremit.net`
28
+ - Marked `pending` the failing specs:
29
+ - create payment
30
+ - fetch credits
31
+
5
32
  ## [0.14.0] - 2016-10-05
6
33
  ### Added
7
34
  - Factories: `bloom_remit_client_responses_recipients_create`, `bloom_remit_client_responses_recipients_list`
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 = 'api.bloom.solutions'
48
- STAGING = 'bloomremit-staging.herokuapp.com'
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