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.
Files changed (214) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +30 -0
  3. data/.rspec +4 -0
  4. data/.rubocop.yml +2 -0
  5. data/.travis.yml +13 -0
  6. data/Gemfile +2 -0
  7. data/LICENSE +20 -0
  8. data/README.md +380 -0
  9. data/bin/mangopay +9 -0
  10. data/lib/mangopay.rb +133 -0
  11. data/lib/mangopay/api/api.rb +9 -0
  12. data/lib/mangopay/api/api_methods.rb +137 -0
  13. data/lib/mangopay/api/auth_token_manager.rb +173 -0
  14. data/lib/mangopay/api/http_client.rb +325 -0
  15. data/lib/mangopay/api/service/bank_accounts.rb +146 -0
  16. data/lib/mangopay/api/service/cards.rb +152 -0
  17. data/lib/mangopay/api/service/client_wallets.rb +89 -0
  18. data/lib/mangopay/api/service/clients.rb +68 -0
  19. data/lib/mangopay/api/service/dispute_documents.rb +158 -0
  20. data/lib/mangopay/api/service/disputes.rb +187 -0
  21. data/lib/mangopay/api/service/e_money.rb +42 -0
  22. data/lib/mangopay/api/service/events.rb +47 -0
  23. data/lib/mangopay/api/service/hooks.rb +93 -0
  24. data/lib/mangopay/api/service/kyc_documents.rb +153 -0
  25. data/lib/mangopay/api/service/mandates.rb +142 -0
  26. data/lib/mangopay/api/service/oauth_tokens.rb +25 -0
  27. data/lib/mangopay/api/service/pay_ins.rb +260 -0
  28. data/lib/mangopay/api/service/pay_outs.rb +54 -0
  29. data/lib/mangopay/api/service/pre_authorizations.rb +69 -0
  30. data/lib/mangopay/api/service/refunds.rb +62 -0
  31. data/lib/mangopay/api/service/reports.rb +151 -0
  32. data/lib/mangopay/api/service/repudiations.rb +32 -0
  33. data/lib/mangopay/api/service/responses.rb +102 -0
  34. data/lib/mangopay/api/service/settlement_transfers.rb +55 -0
  35. data/lib/mangopay/api/service/transactions.rb +183 -0
  36. data/lib/mangopay/api/service/transfers.rb +54 -0
  37. data/lib/mangopay/api/service/ubo_declarations.rb +70 -0
  38. data/lib/mangopay/api/service/users.rb +163 -0
  39. data/lib/mangopay/api/service/wallets.rb +99 -0
  40. data/lib/mangopay/api/uri_provider.rb +35 -0
  41. data/lib/mangopay/common/json_tag_converter.rb +68 -0
  42. data/lib/mangopay/common/jsonifier.rb +249 -0
  43. data/lib/mangopay/common/log_provider.rb +34 -0
  44. data/lib/mangopay/common/rate_limit_interval.rb +17 -0
  45. data/lib/mangopay/common/read_only_fields.rb +27 -0
  46. data/lib/mangopay/common/response_error.rb +61 -0
  47. data/lib/mangopay/common/sort_direction.rb +15 -0
  48. data/lib/mangopay/common/sort_field.rb +13 -0
  49. data/lib/mangopay/common/template_url_options.rb +9 -0
  50. data/lib/mangopay/configuration.rb +39 -0
  51. data/lib/mangopay/environment.rb +66 -0
  52. data/lib/mangopay/model/address.rb +27 -0
  53. data/lib/mangopay/model/declared_ubo.rb +21 -0
  54. data/lib/mangopay/model/dispute_reason.rb +15 -0
  55. data/lib/mangopay/model/document_page_consult.rb +15 -0
  56. data/lib/mangopay/model/e_money.rb +18 -0
  57. data/lib/mangopay/model/entity/account/bank_account.rb +26 -0
  58. data/lib/mangopay/model/entity/account/ca_bank_account.rb +27 -0
  59. data/lib/mangopay/model/entity/account/gb_bank_account.rb +21 -0
  60. data/lib/mangopay/model/entity/account/iban_bank_account.rb +21 -0
  61. data/lib/mangopay/model/entity/account/other_bank_account.rb +24 -0
  62. data/lib/mangopay/model/entity/account/us_bank_account.rb +24 -0
  63. data/lib/mangopay/model/entity/card.rb +45 -0
  64. data/lib/mangopay/model/entity/card_registration.rb +43 -0
  65. data/lib/mangopay/model/entity/client.rb +63 -0
  66. data/lib/mangopay/model/entity/client_wallet.rb +23 -0
  67. data/lib/mangopay/model/entity/dispute.rb +50 -0
  68. data/lib/mangopay/model/entity/dispute_document.rb +29 -0
  69. data/lib/mangopay/model/entity/entity_base.rb +18 -0
  70. data/lib/mangopay/model/entity/hook.rb +26 -0
  71. data/lib/mangopay/model/entity/kyc_document.rb +28 -0
  72. data/lib/mangopay/model/entity/mandate.rb +51 -0
  73. data/lib/mangopay/model/entity/pay_in/bank_wire_direct_pay_in.rb +22 -0
  74. data/lib/mangopay/model/entity/pay_in/card_direct_pay_in.rb +33 -0
  75. data/lib/mangopay/model/entity/pay_in/card_pre_authorized_pay_in.rb +13 -0
  76. data/lib/mangopay/model/entity/pay_in/card_web_pay_in.rb +40 -0
  77. data/lib/mangopay/model/entity/pay_in/direct_debit_direct_pay_in.rb +23 -0
  78. data/lib/mangopay/model/entity/pay_in/direct_debit_web_pay_in.rb +38 -0
  79. data/lib/mangopay/model/entity/pay_in/pay_in.rb +16 -0
  80. data/lib/mangopay/model/entity/pay_out.rb +22 -0
  81. data/lib/mangopay/model/entity/pre_authorization.rb +68 -0
  82. data/lib/mangopay/model/entity/refund.rb +18 -0
  83. data/lib/mangopay/model/entity/report.rb +51 -0
  84. data/lib/mangopay/model/entity/repudiation.rb +18 -0
  85. data/lib/mangopay/model/entity/settlement_transfer.rb +17 -0
  86. data/lib/mangopay/model/entity/transaction.rb +52 -0
  87. data/lib/mangopay/model/entity/transfer.rb +13 -0
  88. data/lib/mangopay/model/entity/ubo_declaration.rb +32 -0
  89. data/lib/mangopay/model/entity/user/legal_user.rb +53 -0
  90. data/lib/mangopay/model/entity/user/natural_user.rb +50 -0
  91. data/lib/mangopay/model/entity/user/user.rb +18 -0
  92. data/lib/mangopay/model/entity/wallet.rb +28 -0
  93. data/lib/mangopay/model/enum/account_type.rb +24 -0
  94. data/lib/mangopay/model/enum/card_status.rb +15 -0
  95. data/lib/mangopay/model/enum/card_type.rb +33 -0
  96. data/lib/mangopay/model/enum/card_validity.rb +19 -0
  97. data/lib/mangopay/model/enum/country_iso.rb +759 -0
  98. data/lib/mangopay/model/enum/culture_code.rb +44 -0
  99. data/lib/mangopay/model/enum/currency_iso.rb +552 -0
  100. data/lib/mangopay/model/enum/declared_ubo_refused_reason_type.rb +16 -0
  101. data/lib/mangopay/model/enum/declared_ubo_status.rb +18 -0
  102. data/lib/mangopay/model/enum/deposit_type.rb +15 -0
  103. data/lib/mangopay/model/enum/direct_debit_type.rb +13 -0
  104. data/lib/mangopay/model/enum/dispute_doc_refused_reason_type.rb +25 -0
  105. data/lib/mangopay/model/enum/dispute_document_type.rb +23 -0
  106. data/lib/mangopay/model/enum/dispute_reason_type.rb +33 -0
  107. data/lib/mangopay/model/enum/dispute_status.rb +21 -0
  108. data/lib/mangopay/model/enum/dispute_type.rb +15 -0
  109. data/lib/mangopay/model/enum/document_status.rb +21 -0
  110. data/lib/mangopay/model/enum/download_format.rb +11 -0
  111. data/lib/mangopay/model/enum/event_type.rb +74 -0
  112. data/lib/mangopay/model/enum/funds_type.rb +15 -0
  113. data/lib/mangopay/model/enum/hook_status.rb +13 -0
  114. data/lib/mangopay/model/enum/hook_validity.rb +15 -0
  115. data/lib/mangopay/model/enum/income_range.rb +21 -0
  116. data/lib/mangopay/model/enum/kyc_doc_refused_reason_type.rb +37 -0
  117. data/lib/mangopay/model/enum/kyc_document_type.rb +19 -0
  118. data/lib/mangopay/model/enum/kyc_level.rb +13 -0
  119. data/lib/mangopay/model/enum/legal_person_type.rb +15 -0
  120. data/lib/mangopay/model/enum/mandate_culture_code.rb +23 -0
  121. data/lib/mangopay/model/enum/mandate_execution_type.rb +11 -0
  122. data/lib/mangopay/model/enum/mandate_scheme.rb +13 -0
  123. data/lib/mangopay/model/enum/mandate_status.rb +24 -0
  124. data/lib/mangopay/model/enum/mandate_type.rb +11 -0
  125. data/lib/mangopay/model/enum/natural_user_capacity.rb +15 -0
  126. data/lib/mangopay/model/enum/pay_in_execution_type.rb +18 -0
  127. data/lib/mangopay/model/enum/pay_in_payment_type.rb +21 -0
  128. data/lib/mangopay/model/enum/pay_out_payment_type.rb +11 -0
  129. data/lib/mangopay/model/enum/payment_status.rb +21 -0
  130. data/lib/mangopay/model/enum/person_type.rb +15 -0
  131. data/lib/mangopay/model/enum/platform_type.rb +23 -0
  132. data/lib/mangopay/model/enum/pre_authorization_execution_type.rb +11 -0
  133. data/lib/mangopay/model/enum/pre_authorization_status.rb +18 -0
  134. data/lib/mangopay/model/enum/refund_reason_type.rb +21 -0
  135. data/lib/mangopay/model/enum/report_status.rb +17 -0
  136. data/lib/mangopay/model/enum/report_type.rb +13 -0
  137. data/lib/mangopay/model/enum/secure_mode.rb +16 -0
  138. data/lib/mangopay/model/enum/transaction_nature.rb +17 -0
  139. data/lib/mangopay/model/enum/transaction_status.rb +15 -0
  140. data/lib/mangopay/model/enum/transaction_type.rb +15 -0
  141. data/lib/mangopay/model/enum/ubo_declaration_refused_reason_type.rb +19 -0
  142. data/lib/mangopay/model/enum/ubo_declaration_status.rb +21 -0
  143. data/lib/mangopay/model/event.rb +18 -0
  144. data/lib/mangopay/model/model.rb +194 -0
  145. data/lib/mangopay/model/money.rb +17 -0
  146. data/lib/mangopay/model/pay_in_web_extended_view.rb +31 -0
  147. data/lib/mangopay/model/refund_reason.rb +15 -0
  148. data/lib/mangopay/model/report_filter.rb +83 -0
  149. data/lib/mangopay/model/request/cancel_request.rb +16 -0
  150. data/lib/mangopay/model/request/complete_registration_request.rb +13 -0
  151. data/lib/mangopay/model/request/currency_request.rb +13 -0
  152. data/lib/mangopay/model/request/deactivation_request.rb +10 -0
  153. data/lib/mangopay/model/request/filter_request.rb +38 -0
  154. data/lib/mangopay/model/request/submit_document_request.rb +14 -0
  155. data/lib/mangopay/model/request/submit_ubo_declaration_request.rb +14 -0
  156. data/lib/mangopay/model/request/upload_file_request.rb +9 -0
  157. data/lib/mangopay/model/response_replica.rb +27 -0
  158. data/lib/mangopay/util/custom_formatter.rb +12 -0
  159. data/lib/mangopay/util/custom_logger.rb +34 -0
  160. data/lib/mangopay/util/enum.rb +52 -0
  161. data/lib/mangopay/util/file_encoder.rb +16 -0
  162. data/lib/mangopay/util/non_instantiable.rb +6 -0
  163. data/lib/mangopay/util/storage_strategy.rb +10 -0
  164. data/lib/mangopay/util/void_logger.rb +6 -0
  165. data/mangopay.gemspec +32 -0
  166. data/spec/context/address_context.rb +25 -0
  167. data/spec/context/bank_account_context.rb +138 -0
  168. data/spec/context/card_context.rb +46 -0
  169. data/spec/context/client_context.rb +45 -0
  170. data/spec/context/dispute_context.rb +37 -0
  171. data/spec/context/dispute_document_context.rb +20 -0
  172. data/spec/context/hook_context.rb +16 -0
  173. data/spec/context/kyc_document_context.rb +23 -0
  174. data/spec/context/mandate_context.rb +27 -0
  175. data/spec/context/pay_in_context.rb +225 -0
  176. data/spec/context/pay_out_context.rb +39 -0
  177. data/spec/context/pre_authorization_context.rb +41 -0
  178. data/spec/context/refund_context.rb +33 -0
  179. data/spec/context/report_context.rb +22 -0
  180. data/spec/context/repudiation_context.rb +19 -0
  181. data/spec/context/settlement_transfer_context.rb +28 -0
  182. data/spec/context/transfer_context.rb +51 -0
  183. data/spec/context/ubo_declaration_context.rb +25 -0
  184. data/spec/context/user_context.rb +83 -0
  185. data/spec/context/wallet_context.rb +53 -0
  186. data/spec/mangopay/bank_accounts_spec.rb +229 -0
  187. data/spec/mangopay/cards_spec.rb +135 -0
  188. data/spec/mangopay/client_wallets_spec.rb +148 -0
  189. data/spec/mangopay/clients_spec.rb +55 -0
  190. data/spec/mangopay/configuration_spec.rb +126 -0
  191. data/spec/mangopay/dispute_documents_spec.rb +174 -0
  192. data/spec/mangopay/disputes_spec.rb +265 -0
  193. data/spec/mangopay/e_money_spec.rb +38 -0
  194. data/spec/mangopay/events_spec.rb +50 -0
  195. data/spec/mangopay/hooks_spec.rb +71 -0
  196. data/spec/mangopay/kyc_documents_spec.rb +180 -0
  197. data/spec/mangopay/mandates_spec.rb +219 -0
  198. data/spec/mangopay/oauth_tokens_spec.rb +41 -0
  199. data/spec/mangopay/pay_ins_spec.rb +181 -0
  200. data/spec/mangopay/pay_outs_spec.rb +39 -0
  201. data/spec/mangopay/pre_authorizations_spec.rb +58 -0
  202. data/spec/mangopay/refunds_spec.rb +40 -0
  203. data/spec/mangopay/reports_spec.rb +121 -0
  204. data/spec/mangopay/responses_spec.rb +295 -0
  205. data/spec/mangopay/settlement_transfers_spec.rb +37 -0
  206. data/spec/mangopay/transactions_spec.rb +233 -0
  207. data/spec/mangopay/transfers_spec.rb +38 -0
  208. data/spec/mangopay/ubo_declarations_spec.rb +65 -0
  209. data/spec/mangopay/users_spec.rb +146 -0
  210. data/spec/mangopay/wallets_spec.rb +104 -0
  211. data/spec/resources/logo.png +0 -0
  212. data/spec/resources/test_pdf.pdf +0 -0
  213. data/spec/spec_helper.rb +72 -0
  214. 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