mangopay-v4 4.0.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.
- checksums.yaml +7 -0
- data/.gitignore +30 -0
- data/.rspec +4 -0
- data/.rubocop.yml +2 -0
- data/.travis.yml +13 -0
- data/Gemfile +2 -0
- data/LICENSE +20 -0
- data/README.md +380 -0
- data/bin/mangopay +9 -0
- data/lib/mangopay.rb +133 -0
- data/lib/mangopay/api/api.rb +9 -0
- data/lib/mangopay/api/api_methods.rb +137 -0
- data/lib/mangopay/api/auth_token_manager.rb +173 -0
- data/lib/mangopay/api/http_client.rb +325 -0
- data/lib/mangopay/api/service/bank_accounts.rb +146 -0
- data/lib/mangopay/api/service/cards.rb +152 -0
- data/lib/mangopay/api/service/client_wallets.rb +89 -0
- data/lib/mangopay/api/service/clients.rb +68 -0
- data/lib/mangopay/api/service/dispute_documents.rb +158 -0
- data/lib/mangopay/api/service/disputes.rb +187 -0
- data/lib/mangopay/api/service/e_money.rb +42 -0
- data/lib/mangopay/api/service/events.rb +47 -0
- data/lib/mangopay/api/service/hooks.rb +93 -0
- data/lib/mangopay/api/service/kyc_documents.rb +153 -0
- data/lib/mangopay/api/service/mandates.rb +142 -0
- data/lib/mangopay/api/service/oauth_tokens.rb +25 -0
- data/lib/mangopay/api/service/pay_ins.rb +260 -0
- data/lib/mangopay/api/service/pay_outs.rb +54 -0
- data/lib/mangopay/api/service/pre_authorizations.rb +69 -0
- data/lib/mangopay/api/service/refunds.rb +62 -0
- data/lib/mangopay/api/service/reports.rb +151 -0
- data/lib/mangopay/api/service/repudiations.rb +32 -0
- data/lib/mangopay/api/service/responses.rb +102 -0
- data/lib/mangopay/api/service/settlement_transfers.rb +55 -0
- data/lib/mangopay/api/service/transactions.rb +183 -0
- data/lib/mangopay/api/service/transfers.rb +54 -0
- data/lib/mangopay/api/service/ubo_declarations.rb +70 -0
- data/lib/mangopay/api/service/users.rb +163 -0
- data/lib/mangopay/api/service/wallets.rb +99 -0
- data/lib/mangopay/api/uri_provider.rb +35 -0
- data/lib/mangopay/common/json_tag_converter.rb +68 -0
- data/lib/mangopay/common/jsonifier.rb +249 -0
- data/lib/mangopay/common/log_provider.rb +34 -0
- data/lib/mangopay/common/rate_limit_interval.rb +17 -0
- data/lib/mangopay/common/read_only_fields.rb +27 -0
- data/lib/mangopay/common/response_error.rb +61 -0
- data/lib/mangopay/common/sort_direction.rb +15 -0
- data/lib/mangopay/common/sort_field.rb +13 -0
- data/lib/mangopay/common/template_url_options.rb +9 -0
- data/lib/mangopay/configuration.rb +39 -0
- data/lib/mangopay/environment.rb +66 -0
- data/lib/mangopay/model/address.rb +27 -0
- data/lib/mangopay/model/declared_ubo.rb +21 -0
- data/lib/mangopay/model/dispute_reason.rb +15 -0
- data/lib/mangopay/model/document_page_consult.rb +15 -0
- data/lib/mangopay/model/e_money.rb +18 -0
- data/lib/mangopay/model/entity/account/bank_account.rb +26 -0
- data/lib/mangopay/model/entity/account/ca_bank_account.rb +27 -0
- data/lib/mangopay/model/entity/account/gb_bank_account.rb +21 -0
- data/lib/mangopay/model/entity/account/iban_bank_account.rb +21 -0
- data/lib/mangopay/model/entity/account/other_bank_account.rb +24 -0
- data/lib/mangopay/model/entity/account/us_bank_account.rb +24 -0
- data/lib/mangopay/model/entity/card.rb +45 -0
- data/lib/mangopay/model/entity/card_registration.rb +43 -0
- data/lib/mangopay/model/entity/client.rb +63 -0
- data/lib/mangopay/model/entity/client_wallet.rb +23 -0
- data/lib/mangopay/model/entity/dispute.rb +50 -0
- data/lib/mangopay/model/entity/dispute_document.rb +29 -0
- data/lib/mangopay/model/entity/entity_base.rb +18 -0
- data/lib/mangopay/model/entity/hook.rb +26 -0
- data/lib/mangopay/model/entity/kyc_document.rb +28 -0
- data/lib/mangopay/model/entity/mandate.rb +51 -0
- data/lib/mangopay/model/entity/pay_in/bank_wire_direct_pay_in.rb +22 -0
- data/lib/mangopay/model/entity/pay_in/card_direct_pay_in.rb +33 -0
- data/lib/mangopay/model/entity/pay_in/card_pre_authorized_pay_in.rb +13 -0
- data/lib/mangopay/model/entity/pay_in/card_web_pay_in.rb +40 -0
- data/lib/mangopay/model/entity/pay_in/direct_debit_direct_pay_in.rb +23 -0
- data/lib/mangopay/model/entity/pay_in/direct_debit_web_pay_in.rb +38 -0
- data/lib/mangopay/model/entity/pay_in/pay_in.rb +16 -0
- data/lib/mangopay/model/entity/pay_out.rb +22 -0
- data/lib/mangopay/model/entity/pre_authorization.rb +68 -0
- data/lib/mangopay/model/entity/refund.rb +18 -0
- data/lib/mangopay/model/entity/report.rb +51 -0
- data/lib/mangopay/model/entity/repudiation.rb +18 -0
- data/lib/mangopay/model/entity/settlement_transfer.rb +17 -0
- data/lib/mangopay/model/entity/transaction.rb +52 -0
- data/lib/mangopay/model/entity/transfer.rb +13 -0
- data/lib/mangopay/model/entity/ubo_declaration.rb +32 -0
- data/lib/mangopay/model/entity/user/legal_user.rb +53 -0
- data/lib/mangopay/model/entity/user/natural_user.rb +50 -0
- data/lib/mangopay/model/entity/user/user.rb +18 -0
- data/lib/mangopay/model/entity/wallet.rb +28 -0
- data/lib/mangopay/model/enum/account_type.rb +24 -0
- data/lib/mangopay/model/enum/card_status.rb +15 -0
- data/lib/mangopay/model/enum/card_type.rb +33 -0
- data/lib/mangopay/model/enum/card_validity.rb +19 -0
- data/lib/mangopay/model/enum/country_iso.rb +759 -0
- data/lib/mangopay/model/enum/culture_code.rb +44 -0
- data/lib/mangopay/model/enum/currency_iso.rb +552 -0
- data/lib/mangopay/model/enum/declared_ubo_refused_reason_type.rb +16 -0
- data/lib/mangopay/model/enum/declared_ubo_status.rb +18 -0
- data/lib/mangopay/model/enum/deposit_type.rb +15 -0
- data/lib/mangopay/model/enum/direct_debit_type.rb +13 -0
- data/lib/mangopay/model/enum/dispute_doc_refused_reason_type.rb +25 -0
- data/lib/mangopay/model/enum/dispute_document_type.rb +23 -0
- data/lib/mangopay/model/enum/dispute_reason_type.rb +33 -0
- data/lib/mangopay/model/enum/dispute_status.rb +21 -0
- data/lib/mangopay/model/enum/dispute_type.rb +15 -0
- data/lib/mangopay/model/enum/document_status.rb +21 -0
- data/lib/mangopay/model/enum/download_format.rb +11 -0
- data/lib/mangopay/model/enum/event_type.rb +74 -0
- data/lib/mangopay/model/enum/funds_type.rb +15 -0
- data/lib/mangopay/model/enum/hook_status.rb +13 -0
- data/lib/mangopay/model/enum/hook_validity.rb +15 -0
- data/lib/mangopay/model/enum/income_range.rb +21 -0
- data/lib/mangopay/model/enum/kyc_doc_refused_reason_type.rb +37 -0
- data/lib/mangopay/model/enum/kyc_document_type.rb +19 -0
- data/lib/mangopay/model/enum/kyc_level.rb +13 -0
- data/lib/mangopay/model/enum/legal_person_type.rb +15 -0
- data/lib/mangopay/model/enum/mandate_culture_code.rb +23 -0
- data/lib/mangopay/model/enum/mandate_execution_type.rb +11 -0
- data/lib/mangopay/model/enum/mandate_scheme.rb +13 -0
- data/lib/mangopay/model/enum/mandate_status.rb +24 -0
- data/lib/mangopay/model/enum/mandate_type.rb +11 -0
- data/lib/mangopay/model/enum/natural_user_capacity.rb +15 -0
- data/lib/mangopay/model/enum/pay_in_execution_type.rb +18 -0
- data/lib/mangopay/model/enum/pay_in_payment_type.rb +21 -0
- data/lib/mangopay/model/enum/pay_out_payment_type.rb +11 -0
- data/lib/mangopay/model/enum/payment_status.rb +21 -0
- data/lib/mangopay/model/enum/person_type.rb +15 -0
- data/lib/mangopay/model/enum/platform_type.rb +23 -0
- data/lib/mangopay/model/enum/pre_authorization_execution_type.rb +11 -0
- data/lib/mangopay/model/enum/pre_authorization_status.rb +18 -0
- data/lib/mangopay/model/enum/refund_reason_type.rb +21 -0
- data/lib/mangopay/model/enum/report_status.rb +17 -0
- data/lib/mangopay/model/enum/report_type.rb +13 -0
- data/lib/mangopay/model/enum/secure_mode.rb +16 -0
- data/lib/mangopay/model/enum/transaction_nature.rb +17 -0
- data/lib/mangopay/model/enum/transaction_status.rb +15 -0
- data/lib/mangopay/model/enum/transaction_type.rb +15 -0
- data/lib/mangopay/model/enum/ubo_declaration_refused_reason_type.rb +19 -0
- data/lib/mangopay/model/enum/ubo_declaration_status.rb +21 -0
- data/lib/mangopay/model/event.rb +18 -0
- data/lib/mangopay/model/model.rb +194 -0
- data/lib/mangopay/model/money.rb +17 -0
- data/lib/mangopay/model/pay_in_web_extended_view.rb +31 -0
- data/lib/mangopay/model/refund_reason.rb +15 -0
- data/lib/mangopay/model/report_filter.rb +83 -0
- data/lib/mangopay/model/request/cancel_request.rb +16 -0
- data/lib/mangopay/model/request/complete_registration_request.rb +13 -0
- data/lib/mangopay/model/request/currency_request.rb +13 -0
- data/lib/mangopay/model/request/deactivation_request.rb +10 -0
- data/lib/mangopay/model/request/filter_request.rb +38 -0
- data/lib/mangopay/model/request/submit_document_request.rb +14 -0
- data/lib/mangopay/model/request/submit_ubo_declaration_request.rb +14 -0
- data/lib/mangopay/model/request/upload_file_request.rb +9 -0
- data/lib/mangopay/model/response_replica.rb +27 -0
- data/lib/mangopay/util/custom_formatter.rb +12 -0
- data/lib/mangopay/util/custom_logger.rb +34 -0
- data/lib/mangopay/util/enum.rb +52 -0
- data/lib/mangopay/util/file_encoder.rb +16 -0
- data/lib/mangopay/util/non_instantiable.rb +6 -0
- data/lib/mangopay/util/storage_strategy.rb +10 -0
- data/lib/mangopay/util/void_logger.rb +6 -0
- data/mangopay.gemspec +32 -0
- data/spec/context/address_context.rb +25 -0
- data/spec/context/bank_account_context.rb +138 -0
- data/spec/context/card_context.rb +46 -0
- data/spec/context/client_context.rb +45 -0
- data/spec/context/dispute_context.rb +37 -0
- data/spec/context/dispute_document_context.rb +20 -0
- data/spec/context/hook_context.rb +16 -0
- data/spec/context/kyc_document_context.rb +23 -0
- data/spec/context/mandate_context.rb +27 -0
- data/spec/context/pay_in_context.rb +225 -0
- data/spec/context/pay_out_context.rb +39 -0
- data/spec/context/pre_authorization_context.rb +41 -0
- data/spec/context/refund_context.rb +33 -0
- data/spec/context/report_context.rb +22 -0
- data/spec/context/repudiation_context.rb +19 -0
- data/spec/context/settlement_transfer_context.rb +28 -0
- data/spec/context/transfer_context.rb +51 -0
- data/spec/context/ubo_declaration_context.rb +25 -0
- data/spec/context/user_context.rb +83 -0
- data/spec/context/wallet_context.rb +53 -0
- data/spec/mangopay/bank_accounts_spec.rb +229 -0
- data/spec/mangopay/cards_spec.rb +135 -0
- data/spec/mangopay/client_wallets_spec.rb +148 -0
- data/spec/mangopay/clients_spec.rb +55 -0
- data/spec/mangopay/configuration_spec.rb +126 -0
- data/spec/mangopay/dispute_documents_spec.rb +174 -0
- data/spec/mangopay/disputes_spec.rb +265 -0
- data/spec/mangopay/e_money_spec.rb +38 -0
- data/spec/mangopay/events_spec.rb +50 -0
- data/spec/mangopay/hooks_spec.rb +71 -0
- data/spec/mangopay/kyc_documents_spec.rb +180 -0
- data/spec/mangopay/mandates_spec.rb +219 -0
- data/spec/mangopay/oauth_tokens_spec.rb +41 -0
- data/spec/mangopay/pay_ins_spec.rb +181 -0
- data/spec/mangopay/pay_outs_spec.rb +39 -0
- data/spec/mangopay/pre_authorizations_spec.rb +58 -0
- data/spec/mangopay/refunds_spec.rb +40 -0
- data/spec/mangopay/reports_spec.rb +121 -0
- data/spec/mangopay/responses_spec.rb +295 -0
- data/spec/mangopay/settlement_transfers_spec.rb +37 -0
- data/spec/mangopay/transactions_spec.rb +233 -0
- data/spec/mangopay/transfers_spec.rb +38 -0
- data/spec/mangopay/ubo_declarations_spec.rb +65 -0
- data/spec/mangopay/users_spec.rb +146 -0
- data/spec/mangopay/wallets_spec.rb +104 -0
- data/spec/resources/logo.png +0 -0
- data/spec/resources/test_pdf.pdf +0 -0
- data/spec/spec_helper.rb +72 -0
- metadata +349 -0
@@ -0,0 +1,325 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'json'
|
3
|
+
require_relative '../../mangopay'
|
4
|
+
require_relative '../common/log_provider'
|
5
|
+
|
6
|
+
module MangoApi
|
7
|
+
|
8
|
+
# Handles HTTP communication.
|
9
|
+
module HttpClient
|
10
|
+
LOG = MangoPay::LogProvider.provide(self)
|
11
|
+
|
12
|
+
class << self
|
13
|
+
|
14
|
+
# Launches a self-configuring POST request,
|
15
|
+
# with headers required by the API.
|
16
|
+
#
|
17
|
+
# @param +uri+ [String] request URI
|
18
|
+
# @param +entity+ [Object] object to be JSON-serialized and sent as body
|
19
|
+
# Must include Jsonifier.
|
20
|
+
# @param +id_key+ [String] idempotency key for future response replication
|
21
|
+
# @return [Hash] hashed request response JSON body
|
22
|
+
def post(uri, entity, id_key = nil)
|
23
|
+
request proc { |ury, &block| post_raw(ury, &block) },
|
24
|
+
uri,
|
25
|
+
entity,
|
26
|
+
nil,
|
27
|
+
id_key
|
28
|
+
end
|
29
|
+
|
30
|
+
# Launches a fully customizable POST request.
|
31
|
+
# Expects to be given a block to which it yields the
|
32
|
+
# request object before execution to be configured.
|
33
|
+
#
|
34
|
+
# @param +uri+ [String] request URI
|
35
|
+
# @return [Hash] hashed request response JSON body
|
36
|
+
def post_raw(uri, &block)
|
37
|
+
request_raw Net::HTTP::Post,
|
38
|
+
uri,
|
39
|
+
&block
|
40
|
+
end
|
41
|
+
|
42
|
+
# Launches a self-configuring PUT request,
|
43
|
+
# with headers required by the API.
|
44
|
+
#
|
45
|
+
# @param +uri+ [URI] request URI
|
46
|
+
# @param +entity+ [Object] object to be JSON-serialized and sent as body
|
47
|
+
# Must include Jsonifier.
|
48
|
+
# @return [Hash] hashed request response JSON body
|
49
|
+
def put(uri, entity = nil)
|
50
|
+
request proc { |ury, &block| put_raw(ury, &block) },
|
51
|
+
uri,
|
52
|
+
entity
|
53
|
+
end
|
54
|
+
|
55
|
+
# Launches a fully customizable PUT request.
|
56
|
+
# Expects to be given a block to which it yields the
|
57
|
+
# request object before execution to be configured.
|
58
|
+
#
|
59
|
+
# @param +uri+ [String] request URI
|
60
|
+
# @return [Hash] hashed request response JSON body
|
61
|
+
def put_raw(uri, &block)
|
62
|
+
request_raw Net::HTTP::Put,
|
63
|
+
uri,
|
64
|
+
&block
|
65
|
+
end
|
66
|
+
|
67
|
+
# Launches a self-configuring GET request,
|
68
|
+
# with headers required by the API.
|
69
|
+
# Applies filters if provided.
|
70
|
+
#
|
71
|
+
# @param +uri+ [URI] request URI
|
72
|
+
# @param +filters+ [FilterRequest] response entity filtering object
|
73
|
+
# @return [Hash] hashed request response JSON body
|
74
|
+
def get(uri, filter_request = nil)
|
75
|
+
request proc { |ury, &block| get_raw(ury, &block) },
|
76
|
+
uri,
|
77
|
+
nil,
|
78
|
+
filter_request
|
79
|
+
end
|
80
|
+
|
81
|
+
# Launches a fully customizable GET request.
|
82
|
+
# Expects to be given a block to which it yields the
|
83
|
+
# request object before execution to be configured.
|
84
|
+
#
|
85
|
+
# @param +uri+ [URI] request URI
|
86
|
+
# @return [Hash] hashed request response JSON body
|
87
|
+
def get_raw(uri, &block)
|
88
|
+
request_raw Net::HTTP::Get,
|
89
|
+
uri,
|
90
|
+
&block
|
91
|
+
end
|
92
|
+
|
93
|
+
# Provides a hash containing necessary headers for API calls.
|
94
|
+
def api_headers
|
95
|
+
initialize_headers unless @default_headers
|
96
|
+
@default_headers
|
97
|
+
end
|
98
|
+
|
99
|
+
private
|
100
|
+
|
101
|
+
# Launches a self-configuring generic request,
|
102
|
+
# with headers required by the API.
|
103
|
+
# Applies filters and idempotency key header if provided.
|
104
|
+
# Sends JSON serialization of an object as body if provided.
|
105
|
+
#
|
106
|
+
# @param +http_client_method+ [Proc] proc representing the HttpClient
|
107
|
+
# method to be called for this particular request
|
108
|
+
# @param +uri+ [URI] request URI
|
109
|
+
# @param +entity+ [Object] object to be JSON-serialized and sent as body
|
110
|
+
# Must include Jsonifier.
|
111
|
+
# @param +filter+ [FilterRequest] response entity filtering object
|
112
|
+
# @param +id_key+ [String] idempotency key for future response replication
|
113
|
+
# @return [Hash] hashed request response JSON body
|
114
|
+
def request(http_client_method,
|
115
|
+
uri,
|
116
|
+
entity = nil,
|
117
|
+
filter = nil,
|
118
|
+
id_key = nil)
|
119
|
+
validate entity if entity
|
120
|
+
apply_filter(uri, filter) if filter
|
121
|
+
http_client_method.call(uri) do |request|
|
122
|
+
api_headers.each { |k, v| request.add_field(k, v) }
|
123
|
+
request.add_field('Idempotency-Key', id_key) if id_key
|
124
|
+
request.body = entity.jsonify! if entity
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
# Launches a fully customizable generic request.
|
129
|
+
# Expects to be given a block to which it yields the
|
130
|
+
# request object before execution to be configured.
|
131
|
+
#
|
132
|
+
# @param +http_method+ [HTTPRequest] method type class
|
133
|
+
# @param +uri+ [URI] request URI
|
134
|
+
# @return [Hash] hashed request response JSON body
|
135
|
+
def request_raw(http_method, uri)
|
136
|
+
http_timeout = MangoPay.configuration.http_timeout
|
137
|
+
response = Net::HTTP.start(uri.host,
|
138
|
+
uri.port,
|
139
|
+
use_ssl: true,
|
140
|
+
read_timeout: http_timeout) do |http|
|
141
|
+
request = http_method.new(uri.request_uri)
|
142
|
+
yield request if block_given?
|
143
|
+
log_request request
|
144
|
+
http.request request
|
145
|
+
end
|
146
|
+
handle response
|
147
|
+
end
|
148
|
+
|
149
|
+
# Validates a provided object as being serializable
|
150
|
+
# into an API-acceptable JSON format. Raises if validation fails.
|
151
|
+
#
|
152
|
+
# @param +entity+ [Object] object meant to be serialized and sent as body
|
153
|
+
def validate(entity)
|
154
|
+
included_modules = entity.singleton_class.included_modules
|
155
|
+
raise 'Request body entity must include Jsonifier module'\
|
156
|
+
unless included_modules.include? MangoPay::Jsonifier
|
157
|
+
end
|
158
|
+
|
159
|
+
# Applies provided filters as path params
|
160
|
+
# to the provided URI.
|
161
|
+
#
|
162
|
+
# @param +uri+ [URI] URI upon which to apply filters
|
163
|
+
# @param +filter+ [FilterRequest] the filtering object
|
164
|
+
def apply_filter(uri, filter)
|
165
|
+
query = []
|
166
|
+
paging = paging_filter(filter.page, filter.per_page)
|
167
|
+
sorting = sorting_filter(filter.sort_field, filter.sort_direction)
|
168
|
+
others = other_filters(filter)
|
169
|
+
query << paging if paging
|
170
|
+
query << sorting if sorting
|
171
|
+
query << others if others
|
172
|
+
uri.query = query.join('&')
|
173
|
+
end
|
174
|
+
|
175
|
+
# Builds query string corresponding to paging filter components.
|
176
|
+
#
|
177
|
+
# @param +page+ [Integer] number of page of results
|
178
|
+
# @param +per_page+ [Integer] number of results per page
|
179
|
+
# @return [String] query string corresponding to provided values
|
180
|
+
def paging_filter(page, per_page)
|
181
|
+
return nil unless page && per_page
|
182
|
+
paging_filter = {}
|
183
|
+
paging_filter['Page'] = page || 1
|
184
|
+
paging_filter['Per_Page'] = per_page
|
185
|
+
URI.encode_www_form paging_filter
|
186
|
+
end
|
187
|
+
|
188
|
+
# Builds query string corresponding to sorting filter components.
|
189
|
+
#
|
190
|
+
# @param +field+ [SortField] field by which to sort results
|
191
|
+
# @param +direction+ [SortDirection] direction to sort results in
|
192
|
+
# @return [String] query string corresponding to provided values
|
193
|
+
def sorting_filter(field, direction)
|
194
|
+
return nil unless field && direction
|
195
|
+
sort_param = field.to_s + ':' + direction.to_s
|
196
|
+
sorting_filter = { Sort: sort_param }
|
197
|
+
URI.encode_www_form sorting_filter
|
198
|
+
end
|
199
|
+
|
200
|
+
# Builds query string corresponding to all other filter parameters except
|
201
|
+
# the ones for paging and sorting
|
202
|
+
#
|
203
|
+
# @param +filter+ [FilterRequest] the filtering object
|
204
|
+
# @return [String] query string corresponding to provided values
|
205
|
+
def other_filters(filter)
|
206
|
+
filters = {}
|
207
|
+
filters['BeforeDate'] = filter.before_date if filter.before_date
|
208
|
+
filters['AfterDate'] = filter.after_date if filter.after_date
|
209
|
+
filters['Status'] = filter.status.to_s if filter.status
|
210
|
+
filters['Nature'] = filter.nature.to_s if filter.nature
|
211
|
+
filters['Type'] = filter.type.to_s if filter.type
|
212
|
+
filters['EventType'] = filter.event_type.to_s if filter.event_type
|
213
|
+
return nil if filters.empty?
|
214
|
+
URI.encode_www_form filters
|
215
|
+
end
|
216
|
+
|
217
|
+
# Handles responses from the API.
|
218
|
+
def handle(response)
|
219
|
+
update_rate_limits response
|
220
|
+
log_response response
|
221
|
+
code = response.code.to_i
|
222
|
+
body_object = code == 204 ? nil : objectify(response.body)
|
223
|
+
unless (200..299).cover? code
|
224
|
+
raise MangoPay::ResponseError.new response.uri,
|
225
|
+
response.code,
|
226
|
+
body_object
|
227
|
+
end
|
228
|
+
body_object
|
229
|
+
end
|
230
|
+
|
231
|
+
# Turns response body into a Hash object if it is JSON-standard.
|
232
|
+
def objectify(response_body)
|
233
|
+
JSON.parse(response_body)
|
234
|
+
rescue
|
235
|
+
response_body
|
236
|
+
end
|
237
|
+
|
238
|
+
# Handles external responses (from raw HTTP calls).
|
239
|
+
def handle_raw(response)
|
240
|
+
code = response.code.to_i
|
241
|
+
unless (200..299).cover? code
|
242
|
+
raise "#{code} #{response.message}: #{response.body}"
|
243
|
+
end
|
244
|
+
response.body
|
245
|
+
end
|
246
|
+
|
247
|
+
# Updates the current environment's rate limit
|
248
|
+
# data from response headers.
|
249
|
+
#
|
250
|
+
# @param +response+ response object from API
|
251
|
+
def update_rate_limits(response)
|
252
|
+
rate_limits = {}
|
253
|
+
response.each_header do |k, v|
|
254
|
+
next unless k.include? 'x-ratelimit'
|
255
|
+
rate_limits[k] = v.split(', ')
|
256
|
+
end
|
257
|
+
MangoPay.environment.update_rate_limits rate_limits if rate_limits.any?
|
258
|
+
end
|
259
|
+
|
260
|
+
# Logs request data.
|
261
|
+
#
|
262
|
+
# @param +request+ the request that should be logged
|
263
|
+
def log_request(request)
|
264
|
+
LOG.debug 'Launching request: {}', request.method
|
265
|
+
LOG.debug 'Full URL: {}{}',
|
266
|
+
MangoPay.configuration.root_url, request.path
|
267
|
+
request.each_header do |k, v|
|
268
|
+
LOG.debug 'Request header: {} -> {}', k, v
|
269
|
+
end
|
270
|
+
LOG.debug 'Request body: {}', request.body if request.body
|
271
|
+
end
|
272
|
+
|
273
|
+
# Logs response data.
|
274
|
+
#
|
275
|
+
# @param +response+ the response that should be logged
|
276
|
+
def log_response(response)
|
277
|
+
LOG.debug 'Received response: {} {}', response.code, response.message
|
278
|
+
response.header.each do |k, v|
|
279
|
+
LOG.debug 'Response header: {} -> {}', k, v
|
280
|
+
end
|
281
|
+
LOG.debug 'Response body: {}', response.body if response.body
|
282
|
+
end
|
283
|
+
|
284
|
+
# Initializes the default headers necessary for API calls.
|
285
|
+
#
|
286
|
+
# noinspection RubyStringKeysInHashInspection
|
287
|
+
def initialize_headers
|
288
|
+
auth_token = MangoApi::AuthTokenManager.token
|
289
|
+
@default_headers = {
|
290
|
+
'User-Agent' => "MANGOPAY V2 RubyBindings/#{MangoPay::VERSION}",
|
291
|
+
'Authorization' => "#{auth_token['token_type']} "\
|
292
|
+
"#{auth_token['access_token']}",
|
293
|
+
'Content-Type' => 'application/json'
|
294
|
+
}
|
295
|
+
append_user_agent
|
296
|
+
end
|
297
|
+
|
298
|
+
def append_user_agent
|
299
|
+
@default_headers.update('x_mangopay_client_user_agent' =>
|
300
|
+
JSON.dump(user_agent))
|
301
|
+
rescue => e
|
302
|
+
@default_headers.update('x_mangopay_client_raw_user_agent' =>
|
303
|
+
user_agent.inspect,
|
304
|
+
error: "#{e} (#{e.class})")
|
305
|
+
end
|
306
|
+
|
307
|
+
def user_agent
|
308
|
+
{
|
309
|
+
bindings_version: MangoPay::VERSION,
|
310
|
+
lang: 'ruby',
|
311
|
+
lang_version: "#{RUBY_VERSION} p#{RUBY_PATCHLEVEL} "\
|
312
|
+
"(#{RUBY_RELEASE_DATE})",
|
313
|
+
platform: RUBY_PLATFORM,
|
314
|
+
uname: uname
|
315
|
+
}
|
316
|
+
end
|
317
|
+
|
318
|
+
def uname
|
319
|
+
`uname -a 2>/dev/null`.strip if RUBY_PLATFORM =~ /linux|darwin/i
|
320
|
+
rescue Errno::ENOMEM
|
321
|
+
'uname lookup failed'
|
322
|
+
end
|
323
|
+
end
|
324
|
+
end
|
325
|
+
end
|
@@ -0,0 +1,146 @@
|
|
1
|
+
require_relative '../uri_provider'
|
2
|
+
require_relative '../../model/request/filter_request'
|
3
|
+
require_relative '../../model/request/deactivation_request'
|
4
|
+
|
5
|
+
module MangoApi
|
6
|
+
|
7
|
+
# Provides API method delegates concerning the +BankAccount+ entity
|
8
|
+
module BankAccounts
|
9
|
+
class << self
|
10
|
+
include UriProvider
|
11
|
+
|
12
|
+
# Creates a new bank account entity.
|
13
|
+
#
|
14
|
+
# +BankAccount+ properties:
|
15
|
+
# * +IbanBankAccount
|
16
|
+
# * +tag+ - optional
|
17
|
+
# * +owner_address+ - required
|
18
|
+
# * +owner_name+ - required
|
19
|
+
# * +iban+ - required
|
20
|
+
# * +bic+ - optional
|
21
|
+
# * +UsBankAccount+
|
22
|
+
# * +tag+ - optional
|
23
|
+
# * +owner_address+ - required
|
24
|
+
# * +owner_name+ - required
|
25
|
+
# * +account_number+ - required
|
26
|
+
# * +aba+ - required
|
27
|
+
# * +deposit_account_type+ - optional
|
28
|
+
# * +CaBankAccount+
|
29
|
+
# * +tag+ - optional
|
30
|
+
# * +owner_address+ - required
|
31
|
+
# * +owner_name+ - required
|
32
|
+
# * +branch_code+ - required
|
33
|
+
# * +institution_number+ - required
|
34
|
+
# * +account_number+ - required
|
35
|
+
# * +bank_name+ - required
|
36
|
+
# * +GbBankAccount+
|
37
|
+
# * +tag+ - optional
|
38
|
+
# * +owner_address+ - required
|
39
|
+
# * +owner_name+ - required
|
40
|
+
# * +sort_code+ - required
|
41
|
+
# * +account_number+ - required
|
42
|
+
# * +OtherBankAccount+
|
43
|
+
# * +tag+ optional
|
44
|
+
# * +owner_address+ - required
|
45
|
+
# * +owner_name+ - required
|
46
|
+
# * +country+ - required
|
47
|
+
# * +bic+ - required
|
48
|
+
# * +account_number+ - required
|
49
|
+
#
|
50
|
+
# @param +account+ [BankAccount] model object of account to be created
|
51
|
+
# @param +id_key+ [String] idempotency key for future response replication
|
52
|
+
# @return [BankAccount] the newly-created BankAccount entity object
|
53
|
+
def create(account, id_key = nil)
|
54
|
+
uri = provide_uri(:create_account, account)
|
55
|
+
response = HttpClient.post(uri, account, id_key)
|
56
|
+
parse response
|
57
|
+
end
|
58
|
+
|
59
|
+
# Deactivates a bank account entity.
|
60
|
+
#
|
61
|
+
# @param +user_id+ [String] ID of the owner of the account
|
62
|
+
# being deactivated
|
63
|
+
# @param +account_id+ [String] ID of the bank account being deactivated
|
64
|
+
# @return [BankAccount] deactivated BankAccount entity object
|
65
|
+
def deactivate(user_id, account_id)
|
66
|
+
uri = provide_uri(:deactivate_account, user_id, account_id)
|
67
|
+
response = HttpClient.put(uri, DeactivationRequest.new)
|
68
|
+
parse response
|
69
|
+
end
|
70
|
+
|
71
|
+
# Retrieves a bank account for a user.
|
72
|
+
#
|
73
|
+
# @param +user_id+ [String] ID of the bank account's owner
|
74
|
+
# @param +account+id+ [String] ID of the bank account
|
75
|
+
# @return [BankAccount] the corresponding BankAccount object
|
76
|
+
def get(user_id, account_id)
|
77
|
+
uri = provide_uri(:get_account, user_id, account_id)
|
78
|
+
response = HttpClient.get(uri)
|
79
|
+
parse response
|
80
|
+
end
|
81
|
+
|
82
|
+
# Retrieves pages of a user's bank accounts. Allows
|
83
|
+
# configuration of paging and sorting parameters by
|
84
|
+
# yielding a filtering object to a provided block.
|
85
|
+
# When no filters are specified, will retrieve the
|
86
|
+
# first page of 10 newest results.
|
87
|
+
#
|
88
|
+
# Allowed +FilterRequest+ params:
|
89
|
+
# * page
|
90
|
+
# * per_page
|
91
|
+
# * sort_field and sort_direction
|
92
|
+
#
|
93
|
+
# @param +user_id+ [String] ID of the user whose bank accounts to get
|
94
|
+
# @return [Array] parsed BankAccount entity objects
|
95
|
+
def all(user_id)
|
96
|
+
uri = provide_uri(:get_accounts, user_id)
|
97
|
+
filter_request = nil
|
98
|
+
yield filter_request = FilterRequest.new if block_given?
|
99
|
+
results = HttpClient.get(uri, filter_request)
|
100
|
+
parse_results results
|
101
|
+
end
|
102
|
+
|
103
|
+
private
|
104
|
+
|
105
|
+
# Parses an array of JSON-originating hashes into the corresponding
|
106
|
+
# BankAccount entity objects.
|
107
|
+
#
|
108
|
+
# @param +results+ [Array] JSON-originating data hashes
|
109
|
+
# @return [Array] parsed BankAccount entity objects
|
110
|
+
def parse_results(results)
|
111
|
+
results.collect do |entity|
|
112
|
+
parse entity
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
# Parses a JSON-originating hash into the corresponding
|
117
|
+
# BankAccount entity object.
|
118
|
+
#
|
119
|
+
# @param +response+ [Hash] JSON-originating data hash
|
120
|
+
# @return [BankAccount] corresponding BankAccount entity object
|
121
|
+
def parse(response)
|
122
|
+
type = bank_account_type(response)
|
123
|
+
type.new.dejsonify response
|
124
|
+
end
|
125
|
+
|
126
|
+
# Asserts the type of bank account represented by a hash.
|
127
|
+
#
|
128
|
+
# @param +hash+ [Hash] source hash
|
129
|
+
# @return [Class] type of bank account represented by the hash
|
130
|
+
def bank_account_type(hash)
|
131
|
+
case hash['Type']
|
132
|
+
when MangoModel::AccountType::IBAN.to_s
|
133
|
+
MangoModel::IbanBankAccount
|
134
|
+
when MangoModel::AccountType::US.to_s
|
135
|
+
MangoModel::UsBankAccount
|
136
|
+
when MangoModel::AccountType::CA.to_s
|
137
|
+
MangoModel::CaBankAccount
|
138
|
+
when MangoModel::AccountType::GB.to_s
|
139
|
+
MangoModel::GbBankAccount
|
140
|
+
else
|
141
|
+
MangoModel::OtherBankAccount
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|