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
data/bin/mangopay ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
4
+
5
+ libs = ' -r irb/completion'
6
+ libs << " -r #{File.dirname(__FILE__) + '/../lib/mangopay'}"
7
+
8
+ puts 'Loading MangoPay gem'
9
+ exec "#{irb} #{libs}"
data/lib/mangopay.rb ADDED
@@ -0,0 +1,133 @@
1
+ require_relative '../lib/mangopay/common/log_provider'
2
+ require_relative 'mangopay/environment'
3
+ require_relative 'mangopay/configuration'
4
+ require_relative 'mangopay/model/model'
5
+ require_relative 'mangopay/api/api'
6
+
7
+ # Holds top-level configuration.
8
+ module MangoPay
9
+ LOG = LogProvider.provide(self)
10
+
11
+ VERSION = '4.0.0'.freeze
12
+
13
+ SANDBOX_API_URL = 'https://api.sandbox.mangopay.com'.freeze
14
+ MAIN_API_URL = 'https://api.mangopay.com'.freeze
15
+
16
+ # ID of the environment in which to run MangoPay operations
17
+ @global_env_id = :default
18
+ # Mapping of MangoPay environments by ID
19
+ @environments = {
20
+ default: MangoPay::Environment.new(:default)
21
+ }
22
+ # Mapping of thread object IDs to MangoPay environment IDs
23
+ @env_id = {}
24
+
25
+ class << self
26
+
27
+ # Allows to specify environment in which to run MangoPay operations.
28
+ # All subsequent threads will automatically run in that environment.
29
+ #
30
+ # @param +env_id+ ID of the required environment
31
+ #
32
+ # noinspection RubyResolve
33
+ def use_environment(env_id)
34
+ @global_env_id = env_id || :default
35
+ unless @environments[@global_env_id]
36
+ LOG.debug 'Creating new environment :{}', env_id
37
+ env = MangoPay::Environment.new(@global_env_id)
38
+ @environments[@global_env_id] = env
39
+ end
40
+ LOG.info 'Using environment :{}', env_id
41
+ put_thread_local_environment
42
+ end
43
+
44
+ # Sets MangoPay to run under the default environment.
45
+ def use_default
46
+ use_environment :default
47
+ end
48
+
49
+ # Returns the environment currently being used.
50
+ #
51
+ # noinspection RubyResolve
52
+ def environment
53
+ @environments[thread_local_env_id]
54
+ end
55
+
56
+ private
57
+
58
+ # Returns the ID of the environment to be used for current thread.
59
+ #
60
+ # noinspection RubyResolve
61
+ def thread_local_env_id
62
+ thread_id = Thread.current.object_id
63
+ @env_id[thread_id] || put_thread_local_environment
64
+ end
65
+
66
+ # Saves currently-set global environment as the one to be used
67
+ # for current thread.
68
+ #
69
+ # noinspection RubyResolve
70
+ def put_thread_local_environment
71
+ thread = Thread.current
72
+ thread_id = thread.object_id
73
+ LOG.debug 'Mapping thread {} to environment :{}',
74
+ thread_id, @global_env_id
75
+ initiate_mapping_removal(thread) unless @env_id[thread_id]
76
+ @env_id[thread_id] = @global_env_id
77
+ end
78
+
79
+ # Starts another thread which will delete current thread's
80
+ # environment hash entry as soon as current thread terminates.
81
+ #
82
+ # noinspection RubyResolve
83
+ def initiate_mapping_removal(thread)
84
+ thread_id = thread.object_id
85
+ LOG.debug 'Initiating removal task for thread-to-environment mapping '\
86
+ '{ {} => :{} }', thread_id, @global_env_id
87
+ Thread.new do
88
+ thread.join
89
+ deleted = @env_id.delete thread_id
90
+ LOG.debug 'Removed thread-to-environment mapping '\
91
+ '{ {} => :{} }', thread_id, deleted
92
+ end
93
+ end
94
+
95
+ public
96
+
97
+ # Provides MangoPay configuration object for current environment.
98
+ #
99
+ # noinspection RubyResolve
100
+ def configuration
101
+ env = environment
102
+ env.configuration ||
103
+ raise("MangoPay.configure() was not called for environment #{env.id}")
104
+ end
105
+
106
+ # Allows configuration of the current MangoPay environment.
107
+ # Yields configuration object to a provided block.
108
+ #
109
+ # noinspection RubyResolve
110
+ def configure
111
+ env = environment
112
+ LOG.info 'Configuring environment :{}', env.id
113
+ config = env.configuration || MangoPay::Configuration.new
114
+ yield config
115
+ validate config
116
+ LOG.info 'Successfully configured environment :{} for client {}',
117
+ env.id, config.client_id
118
+ env.configuration = config
119
+ end
120
+
121
+ private
122
+
123
+ # Validates a provided MangoPay configuration.
124
+ def validate(config)
125
+ cause_message = 'You must specify your client ID'
126
+ raise cause_message unless config.client_id
127
+ cause_message = 'You must specify your client passphrase'
128
+ raise cause_message unless config.client_passphrase
129
+ config.root_url = config.preproduction? ? SANDBOX_API_URL : MAIN_API_URL\
130
+ unless config.root_url
131
+ end
132
+ end
133
+ end
@@ -0,0 +1,9 @@
1
+ require_relative 'http_client'
2
+ require_relative 'service/oauth_tokens'
3
+ require_relative 'service/users'
4
+ require_relative 'auth_token_manager'
5
+ require_relative '../common/response_error'
6
+
7
+ # Module for service classes
8
+ module MangoApi
9
+ end
@@ -0,0 +1,137 @@
1
+ require 'forwardable'
2
+
3
+ module MangoApi
4
+
5
+ # Declares API method URLs.
6
+ class ApiMethods
7
+ class << self
8
+ extend Forwardable
9
+
10
+ @hash = {
11
+ create_token: %w[POST oauth/token],
12
+
13
+ create_user: %w[POST %(users/#{_param1.person_type.to_s.downcase})],
14
+ update_user: %w[PUT %(users/#{_param1}/#{_param2})],
15
+ get_user: %w[GET %(users/#{_param1})],
16
+ get_users: %w[GET users],
17
+
18
+ create_account: %w[POST %(users/#{_param1.user_id}/bankaccounts/#{_param1.type.to_s.downcase})],
19
+ deactivate_account: %w[PUT %(users/#{_param1}/bankaccounts/#{_param2})],
20
+ get_account: %w[GET %(users/#{_param1}/bankaccounts/#{_param2})],
21
+ get_accounts: %w[GET %(users/#{_param1}/bankaccounts)],
22
+
23
+ create_wallet: %w[POST wallets],
24
+ update_wallet: %w[PUT %(wallets/#{_param1.id})],
25
+ get_wallet: %w[GET %(wallets/#{_param1})],
26
+ get_users_wallets: %w[GET %(users/#{_param1}/wallets)],
27
+
28
+ update_client: %w[PUT clients],
29
+ get_client: %w[GET clients],
30
+ upload_client_logo: %w[PUT clients/logo],
31
+
32
+ get_client_wallet: %w[GET %(clients/wallets/#{_param1.to_s}/#{_param2.to_s})],
33
+ get_client_wallets: %w[GET clients/wallets],
34
+ get_client_wallets_funds_type: %w[GET %(clients/wallets/#{_param1.to_s})],
35
+
36
+ get_users_e_money: %w[GET %(users/#{_param1}/emoney)],
37
+
38
+ create_transfer: %w[POST transfers],
39
+ get_transfer: %w[POST %(transfers/#{_param1})],
40
+
41
+ create_card_web_pay_in: %w[POST payins/card/web],
42
+ create_card_direct_pay_in: %w[POST payins/card/direct],
43
+ create_card_pre_authorized_pay_in: %w[POST payins/preauthorized/direct],
44
+ create_bank_wire_direct_pay_in: %w[POST payins/bankwire/direct],
45
+ create_client_bank_wire_direct_pay_in: %w[POST clients/payins/bankwire/direct],
46
+ create_direct_debit_web_pay_in: %w[POST payins/directdebit/web],
47
+ create_direct_debit_direct_pay_in: %w[POST payins/directdebit/direct],
48
+ get_pay_in: %w[GET %(payins/#{_param1})],
49
+
50
+ get_extended_card_view: %w[GET %(payins/card/web/#{_param1}/extended)],
51
+
52
+ create_card_registration: %w[POST cardregistrations],
53
+ complete_card_registration: %w[PUT %(cardregistrations/#{_param1})],
54
+ get_card_registration: %w[GET %(cardregistrations/#{_param1})],
55
+
56
+ get_card: %w[GET %(cards/#{_param1})],
57
+ get_users_cards: %w[GET %(users/#{_param1}/cards)],
58
+ get_cards_by_fingerprint: %w[GET %(cards/fingerprints/#{_param1})],
59
+ deactivate_card: %w[PUT %(cards/#{_param1})],
60
+
61
+ get_users_transactions: %w[GET %(users/#{_param1}/transactions)],
62
+ get_wallets_transactions: %w[GET %(wallets/#{_param1}/transactions)],
63
+ get_disputes_transactions: %w[GET %(disputes/#{_param1}/transactions)],
64
+ get_clients_transactions: %w[GET %(clients/transactions)],
65
+ get_client_wallets_transactions: %w[GET %(clients/wallets/#{_param1.to_s}/#{_param2.to_s}/transactions)],
66
+ get_pre_authorizations_transactions: %w[GET %(preauthorizations/#{_param1}/transactions)],
67
+
68
+ create_pre_authorization: %w[POST preauthorizations/card/direct],
69
+ get_pre_authorization: %w[GET %(preauthorizations/#{_param1})],
70
+ cancel_pre_authorization: %w[PUT %(preauthorizations/#{_param1})],
71
+
72
+ create_mandate: %w[POST mandates/directdebit/web],
73
+ get_mandate: %w[GET %(mandates/#{_param1})],
74
+ cancel_mandate: %w[PUT %(mandates/#{_param1}/cancel)],
75
+ get_mandates: %w[GET mandates],
76
+ get_users_mandates: %w[GET %(users/#{_param1}/mandates)],
77
+ get_accounts_mandates: %w[GET %(users/#{_param1}/bankaccounts/#{_param2}/mandates)],
78
+
79
+ create_pay_out: %w[POST payouts/bankwire],
80
+ get_pay_out: %w[GET %(payouts/#{_param1})],
81
+
82
+ create_kyc_document: %w[POST %(users/#{_param1}/kyc/documents)],
83
+ upload_kyc_document_page: %w[POST %(users/#{_param1}/kyc/documents/#{_param2}/pages)],
84
+ submit_kyc_document: %w[PUT %(users/#{_param1}/kyc/documents/#{_param2})],
85
+ get_users_kyc_documents: %w[GET %(users/#{_param1}/kyc/documents)],
86
+ get_kyc_documents: %w[GET kyc/documents],
87
+ consult_kyc_document: %w[POST %(kyc/documents/#{_param1}/consult)],
88
+
89
+ create_ubo_declaration: %w[POST %(users/legal/#{_param1}/ubodeclarations)],
90
+ update_ubo_declaration: %w[PUT %(ubodeclarations/#{_param1})],
91
+ submit_ubo_declaration: %w[PUT %(ubodeclarations/#{_param1})],
92
+
93
+ create_hook: %w[POST hooks],
94
+ update_hook: %w[PUT %(hooks/#{_param1})],
95
+ get_hook: %w[GET %(hooks/#{_param1})],
96
+ get_hooks: %w[GET hooks],
97
+
98
+ get_events: %w[GET events],
99
+
100
+ create_pay_in_refund: %w[POST %(payins/#{_param1}/refunds)],
101
+ create_transfer_refund: %w[POST %(transfers/#{_param1}/refunds)],
102
+
103
+ update_dispute: %w[PUT %(disputes/#{_param1})],
104
+ close_dispute: %w[PUT %(disputes/#{_param1}/close)],
105
+ submit_dispute: %w[PUT %(disputes/#{_param1}/submit)],
106
+ resubmit_dispute: %w[PUT %(disputes/#{_param1}/submit)],
107
+ get_dispute: %w[GET %(disputes/#{_param1})],
108
+ get_users_disputes: %w[GET %(users/#{_param1}/disputes)],
109
+ get_wallets_disputes: %w[GET %(wallets/#{_param1}/disputes)],
110
+ get_disputes_pending_settlement: %w[GET disputes/pendingsettlement],
111
+ get_disputes: %w[GET disputes],
112
+
113
+ create_dispute_document: %w[POST %(disputes/#{_param1}/documents)],
114
+ upload_dispute_document_page: %w[POST %(disputes/#{_param1}/documents/#{_param2}/pages)],
115
+ submit_dispute_document: %w[PUT %(disputes/#{_param1}/documents/#{_param2})],
116
+ get_dispute_document: %w[GET %(dispute-documents/#{_param1})],
117
+ get_disputes_documents: %w[GET %(disputes/#{_param1}/documents)],
118
+ get_dispute_documents: %w[GET dispute-documents],
119
+ consult_dispute_document: %w[POST %(dispute-documents/#{_param1}/consult)],
120
+
121
+ get_repudiation: %w[GET %(repudiations/#{_param1})],
122
+
123
+ create_settlement_transfer: %w[POST %(repudiations/#{_param1}/settlementtransfer)],
124
+ get_settlement_transfer: %w[GET %(settlements/#{_param1})],
125
+
126
+ create_transaction_report: %w[POST reports/transactions],
127
+ create_wallet_report: %w[POST reports/wallets],
128
+ get_report: %w[GET %(reports/#{_param1})],
129
+ get_reports: %w[GET reports],
130
+
131
+ replicate_response: %w[GET %(responses/#{_param1})]
132
+ }
133
+
134
+ def_delegators @hash, :[]
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,173 @@
1
+ require 'fileutils'
2
+ require_relative '../common/log_provider'
3
+
4
+ module MangoApi
5
+
6
+ # Manages acquisition and storage of API authorization token.
7
+ module AuthTokenManager
8
+ LOG = MangoPay::LogProvider.provide(self)
9
+
10
+ class << self
11
+
12
+ # Provides a valid authorization token for API calls.
13
+ def token
14
+ client_id = MangoPay.configuration.client_id
15
+ token_valid? && storage.retrieve_for(client_id) || refresh_token
16
+ end
17
+
18
+ private
19
+
20
+ # Retrieves authorization token storage object.
21
+ def storage
22
+ return @storage if @storage
23
+ init_storage
24
+ end
25
+
26
+ # Initializes storage strategy for OAuth tokens.
27
+ # Returns the storage object.
28
+ def init_storage
29
+ client_id = MangoPay.configuration.client_id
30
+ dir = MangoPay.configuration.temp_dir
31
+ @storage = dir ? FileStorage.new : MemoryStorage.new
32
+ strategy = @storage.class.name.split('::').last
33
+ location_if_file = dir ? " at '/#{dir}'" : ''
34
+ LOG.info 'Using {}{} for {} client\'s OAuth tokens',
35
+ strategy, location_if_file, client_id
36
+ @storage
37
+ end
38
+
39
+ # Returns true if the current client's
40
+ # authorization token is valid
41
+ def token_valid?
42
+ !token_invalid?
43
+ end
44
+
45
+ # Returns true if the current client's
46
+ # stored token is no longer valid.
47
+ def token_invalid?
48
+ token = storage.retrieve_for MangoPay.configuration.client_id
49
+ token.nil? ||
50
+ token['expire_time'].nil? ||
51
+ token['expire_time'] <= Time.now ||
52
+ token['environment_key'] != environment_key
53
+ end
54
+
55
+ # Provides a configuration-specific hash key.
56
+ def environment_key
57
+ config = MangoPay.configuration
58
+ key = [config.root_url, config.client_id, config.client_passphrase]
59
+ .join('|')
60
+ Digest::MD5.hexdigest(key)
61
+ end
62
+
63
+ # Refreshes the stored authorization token.
64
+ def refresh_token
65
+ LOG.info 'Refreshing OAuth token'
66
+ config = MangoPay.configuration
67
+ unless config.client_id && config.client_passphrase
68
+ raise 'You must specify your client ID and passphrase'
69
+ end
70
+ token = MangoApi::OAuthTokens.create(config)
71
+ append_data token
72
+ store_token token
73
+ token
74
+ end
75
+
76
+ # Appends some useful data to the token object.
77
+ #
78
+ # @param +token+ the token object
79
+ def append_data(token)
80
+ token['expire_time'] = Time.now + token['expires_in'].to_i
81
+ token['environment_key'] = environment_key
82
+ end
83
+
84
+ # Stores the OAuth token.
85
+ #
86
+ # @param +token+ the OAuth token to be stored
87
+ def store_token(token)
88
+ client_id = MangoPay.configuration.client_id
89
+ storage.store_for client_id, token
90
+ LOG.info 'OAuth token stored in {} for client {}',
91
+ storage.class.name.split('::').last, client_id
92
+ end
93
+ end
94
+ end
95
+
96
+ # Stores client-specific OAuth tokens in-memory.
97
+ class MemoryStorage
98
+ def initialize
99
+ @token = {}
100
+ end
101
+
102
+ # Retrieves a client-specific OAuth token.
103
+ #
104
+ # @param +client_id+ ID of the client whose token to retrieve
105
+ def retrieve_for(client_id)
106
+ @token[client_id]
107
+ end
108
+
109
+ # Stores a client-specific OAuth token.
110
+ #
111
+ # @param +client_id+ ID of the client for which token is being stored
112
+ # @param +token+ OAuth token for this client
113
+ def store_for(client_id, token)
114
+ @token[client_id] = token
115
+ end
116
+ end
117
+
118
+ # Stores client-specific OAuth tokens in temporary files
119
+ # in the user-specified directory.
120
+ class FileStorage
121
+ require 'yaml'
122
+
123
+ def initialize
124
+ @temp_dir = MangoPay.configuration.temp_dir
125
+ raise 'Path to temporary folder is not defined' unless @temp_dir
126
+ end
127
+
128
+ # Retrieves a client's OAuth token from its storage file.
129
+ #
130
+ # @param +client_id+ ID of the client whose OAuth token to retrieve
131
+ #
132
+ # noinspection RubyResolve
133
+ def retrieve_for(client_id)
134
+ path = file_path(client_id)
135
+ return nil unless File.exist? path
136
+ File.open(path, 'r') do |file|
137
+ file.flock File::LOCK_SH
138
+ oauth_data = file.read
139
+ YAML.load oauth_data || nil
140
+ end
141
+ end
142
+
143
+ # Generates the file path to a certain client's OAuth token file.
144
+ #
145
+ # @param +client_id+ ID of the client whose file path to generate
146
+ def file_path(client_id)
147
+ File.join(@temp_dir, "mangopay_oauth_token_#{client_id}.tmp")
148
+ end
149
+
150
+ # Stores client-specific OAuth token in its own file.
151
+ #
152
+ # @param +client_id+ ID of the client whose token is being stored
153
+ # @param +token+ OAuth token for this client
154
+ #
155
+ # noinspection RubyResolve
156
+ def store_for(client_id, token)
157
+ ensure_folder_exists MangoPay.configuration.temp_dir
158
+ File.open(file_path(client_id), 'w') do |file|
159
+ file.flock File::LOCK_EX
160
+ file.truncate(0)
161
+ file.rewind
162
+ file.puts YAML.dump(token)
163
+ end
164
+ end
165
+
166
+ # Creates a folder at the given path if none exists.
167
+ #
168
+ # @param +folder+ path at which folder should exist
169
+ def ensure_folder_exists(folder)
170
+ FileUtils.mkdir_p folder unless File.directory?(folder)
171
+ end
172
+ end
173
+ end