mangopay4-nodejs-sdk 1.64.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 (353) hide show
  1. package/.github/workflows/node.js.yml +32 -0
  2. package/.github/workflows/npm-publish.yml +26 -0
  3. package/.jshintrc +16 -0
  4. package/CHANGELOG.md +946 -0
  5. package/LICENSE +21 -0
  6. package/README.md +179 -0
  7. package/docs/BankAccounts.md +35 -0
  8. package/docs/BankingAliases.md +108 -0
  9. package/docs/CardPreAuthorizations.md +55 -0
  10. package/docs/CardRegistrations.md +55 -0
  11. package/docs/Cards.md +82 -0
  12. package/docs/Clients.md +142 -0
  13. package/docs/DisputeDocuments.md +53 -0
  14. package/docs/Disputes.md +292 -0
  15. package/docs/Events.md +23 -0
  16. package/docs/Hooks.md +68 -0
  17. package/docs/Idempotency.md +11 -0
  18. package/docs/KycDocuments.md +52 -0
  19. package/docs/Mandates.md +125 -0
  20. package/docs/OptionsHelper.md +32 -0
  21. package/docs/PayIns.md +72 -0
  22. package/docs/PayOuts.md +55 -0
  23. package/docs/README.md +131 -0
  24. package/docs/Refunds.md +25 -0
  25. package/docs/Reports.md +63 -0
  26. package/docs/Repudiations.md +25 -0
  27. package/docs/Responses.md +33 -0
  28. package/docs/Transfers.md +72 -0
  29. package/docs/UboDeclarations.md +70 -0
  30. package/docs/Users.md +322 -0
  31. package/docs/Wallets.md +70 -0
  32. package/docs/templates/class.mustache +11 -0
  33. package/docs/templates/file.mustache +53 -0
  34. package/docs/templates/function.mustache +33 -0
  35. package/docs/templates/index.mustache +26 -0
  36. package/docs/templates/overview.mustache +1 -0
  37. package/examples/createUsers.js +112 -0
  38. package/examples/createWallet.js +28 -0
  39. package/examples/failedRequest.js +20 -0
  40. package/examples/getBankAccounts.js +29 -0
  41. package/examples/getUserEmoney.js +16 -0
  42. package/examples/getUsers.js +32 -0
  43. package/examples/readResponseHeaders.js +42 -0
  44. package/index.js +1 -0
  45. package/lib/Model.js +58 -0
  46. package/lib/api.js +467 -0
  47. package/lib/apiMethods.js +270 -0
  48. package/lib/config.js +57 -0
  49. package/lib/log.js +9 -0
  50. package/lib/mangopay.js +8 -0
  51. package/lib/models/Address.js +32 -0
  52. package/lib/models/BankAccount.js +45 -0
  53. package/lib/models/BankAccountDetails.js +7 -0
  54. package/lib/models/BankAccountDetailsCA.js +12 -0
  55. package/lib/models/BankAccountDetailsGB.js +10 -0
  56. package/lib/models/BankAccountDetailsIBAN.js +10 -0
  57. package/lib/models/BankAccountDetailsOTHER.js +16 -0
  58. package/lib/models/BankAccountDetailsUS.js +14 -0
  59. package/lib/models/BankAccountType.js +8 -0
  60. package/lib/models/BankingAlias.js +37 -0
  61. package/lib/models/BankingAliasIBAN.js +27 -0
  62. package/lib/models/Billing.js +14 -0
  63. package/lib/models/BinData.js +16 -0
  64. package/lib/models/Birthplace.js +10 -0
  65. package/lib/models/BrowserInfo.js +15 -0
  66. package/lib/models/Card.js +19 -0
  67. package/lib/models/CardInfo.js +32 -0
  68. package/lib/models/CardPreAuthorization.js +144 -0
  69. package/lib/models/CardRegistration.js +29 -0
  70. package/lib/models/CardValidation.js +19 -0
  71. package/lib/models/CategorizeUserLegal.js +15 -0
  72. package/lib/models/CategorizeUserNatural.js +18 -0
  73. package/lib/models/Check.js +13 -0
  74. package/lib/models/CheckData.js +8 -0
  75. package/lib/models/Client.js +62 -0
  76. package/lib/models/ClientWallet.js +28 -0
  77. package/lib/models/Conversion.js +19 -0
  78. package/lib/models/ConversionRate.js +10 -0
  79. package/lib/models/CountryAuthorization.js +12 -0
  80. package/lib/models/DebitedBankAccount.js +15 -0
  81. package/lib/models/DeclaredUbo.js +29 -0
  82. package/lib/models/DeclaredUboStatus.js +17 -0
  83. package/lib/models/Deposit.js +29 -0
  84. package/lib/models/Dispute.js +46 -0
  85. package/lib/models/DisputeDocument.js +10 -0
  86. package/lib/models/DisputeDocumentPage.js +12 -0
  87. package/lib/models/DisputeReason.js +11 -0
  88. package/lib/models/Document.js +12 -0
  89. package/lib/models/DocumentPageConsult.js +17 -0
  90. package/lib/models/EMoney.js +30 -0
  91. package/lib/models/EntityBase.js +70 -0
  92. package/lib/models/Hook.js +19 -0
  93. package/lib/models/IdempotencyResponse.js +11 -0
  94. package/lib/models/IdentityVerification.js +12 -0
  95. package/lib/models/KycDocument.js +11 -0
  96. package/lib/models/KycDocumentStatus.js +7 -0
  97. package/lib/models/KycDocumentType.js +7 -0
  98. package/lib/models/KycPage.js +12 -0
  99. package/lib/models/LegalPersonType.js +7 -0
  100. package/lib/models/LegalRepresentative.js +16 -0
  101. package/lib/models/Mandate.js +69 -0
  102. package/lib/models/MandateStatus.js +7 -0
  103. package/lib/models/Money.js +16 -0
  104. package/lib/models/PayByBankSupportedBank.js +7 -0
  105. package/lib/models/PayIn.js +36 -0
  106. package/lib/models/PayInExecutionDetails.js +7 -0
  107. package/lib/models/PayInExecutionDetailsBankingAlias.js +19 -0
  108. package/lib/models/PayInExecutionDetailsDirect.js +29 -0
  109. package/lib/models/PayInExecutionDetailsWeb.js +40 -0
  110. package/lib/models/PayInExecutionType.js +5 -0
  111. package/lib/models/PayInIntent.js +20 -0
  112. package/lib/models/PayInIntentSplit.js +14 -0
  113. package/lib/models/PayInIntentSplits.js +7 -0
  114. package/lib/models/PayInPaymentDetails.js +7 -0
  115. package/lib/models/PayInPaymentDetailsApplePay.js +19 -0
  116. package/lib/models/PayInPaymentDetailsBancontact.js +13 -0
  117. package/lib/models/PayInPaymentDetailsBankWire.js +23 -0
  118. package/lib/models/PayInPaymentDetailsBankingAlias.js +18 -0
  119. package/lib/models/PayInPaymentDetailsBizum.js +23 -0
  120. package/lib/models/PayInPaymentDetailsBlik.js +17 -0
  121. package/lib/models/PayInPaymentDetailsCard.js +10 -0
  122. package/lib/models/PayInPaymentDetailsCardDirect.js +14 -0
  123. package/lib/models/PayInPaymentDetailsCardWeb.js +28 -0
  124. package/lib/models/PayInPaymentDetailsDirectDebitDirect.js +22 -0
  125. package/lib/models/PayInPaymentDetailsDirectDebitWeb.js +13 -0
  126. package/lib/models/PayInPaymentDetailsGiropay.js +15 -0
  127. package/lib/models/PayInPaymentDetailsGooglePay.js +35 -0
  128. package/lib/models/PayInPaymentDetailsIdeal.js +25 -0
  129. package/lib/models/PayInPaymentDetailsKlarna.js +36 -0
  130. package/lib/models/PayInPaymentDetailsMbway.js +20 -0
  131. package/lib/models/PayInPaymentDetailsMultibanco.js +14 -0
  132. package/lib/models/PayInPaymentDetailsPayByBank.js +71 -0
  133. package/lib/models/PayInPaymentDetailsPayPal.js +63 -0
  134. package/lib/models/PayInPaymentDetailsPayconiq.js +23 -0
  135. package/lib/models/PayInPaymentDetailsPreAuthorized.js +10 -0
  136. package/lib/models/PayInPaymentDetailsSatispay.js +19 -0
  137. package/lib/models/PayInPaymentDetailsSwish.js +35 -0
  138. package/lib/models/PayInPaymentDetailsTwint.js +15 -0
  139. package/lib/models/PayInPaymentType.js +21 -0
  140. package/lib/models/PayInRecurringRegistration.js +64 -0
  141. package/lib/models/PayInTemplateURLOptions.js +10 -0
  142. package/lib/models/PayOut.js +24 -0
  143. package/lib/models/PayOutPaymentDetails.js +7 -0
  144. package/lib/models/PayOutPaymentDetailsBankWire.js +32 -0
  145. package/lib/models/PayOutPaymentType.js +3 -0
  146. package/lib/models/PaymentData.js +20 -0
  147. package/lib/models/PaymentMethodMetadata.js +38 -0
  148. package/lib/models/PayoutMethods.js +7 -0
  149. package/lib/models/PendingUserAction.js +16 -0
  150. package/lib/models/PersonType.js +5 -0
  151. package/lib/models/PlatformCategorization.js +16 -0
  152. package/lib/models/PlatformType.js +10 -0
  153. package/lib/models/Quote.js +11 -0
  154. package/lib/models/Recipient.js +20 -0
  155. package/lib/models/RecipientSchema.js +17 -0
  156. package/lib/models/RecurringPayIn.js +10 -0
  157. package/lib/models/RecurringPayInCIT.js +32 -0
  158. package/lib/models/RecurringPayInCurrentState.js +24 -0
  159. package/lib/models/RecurringPayInMIT.js +27 -0
  160. package/lib/models/RecurringPayInPut.js +24 -0
  161. package/lib/models/Refund.js +26 -0
  162. package/lib/models/RefundReasonDetails.js +10 -0
  163. package/lib/models/Report.js +54 -0
  164. package/lib/models/ReportFilter.js +52 -0
  165. package/lib/models/ReportFilterV2.js +11 -0
  166. package/lib/models/ReportV2.js +28 -0
  167. package/lib/models/Repudiation.js +51 -0
  168. package/lib/models/SecurityInfo.js +12 -0
  169. package/lib/models/Settlement.js +16 -0
  170. package/lib/models/SettlementTransfer.js +37 -0
  171. package/lib/models/Shipping.js +14 -0
  172. package/lib/models/ShippingAddress.js +25 -0
  173. package/lib/models/ShippingPreference.js +5 -0
  174. package/lib/models/Transaction.js +50 -0
  175. package/lib/models/Transfer.js +13 -0
  176. package/lib/models/Ubo.js +19 -0
  177. package/lib/models/UboDeclaration.js +42 -0
  178. package/lib/models/UboDeclarationRefusedReasonType.js +23 -0
  179. package/lib/models/UboDeclarationStatus.js +26 -0
  180. package/lib/models/UboRefusedReasonType.js +14 -0
  181. package/lib/models/User.js +66 -0
  182. package/lib/models/UserCategory.js +5 -0
  183. package/lib/models/UserConsent.js +7 -0
  184. package/lib/models/UserDataFormatValidation.js +7 -0
  185. package/lib/models/UserEnrollmentResult.js +7 -0
  186. package/lib/models/UserLegal.js +65 -0
  187. package/lib/models/UserLegalOwner.js +66 -0
  188. package/lib/models/UserLegalPayer.js +66 -0
  189. package/lib/models/UserLegalSca.js +57 -0
  190. package/lib/models/UserNatural.js +51 -0
  191. package/lib/models/UserNaturalCapacity.js +13 -0
  192. package/lib/models/UserNaturalOwner.js +55 -0
  193. package/lib/models/UserNaturalPayer.js +55 -0
  194. package/lib/models/UserNaturalPut.js +49 -0
  195. package/lib/models/UserNaturalSca.js +56 -0
  196. package/lib/models/VirtualAccount.js +22 -0
  197. package/lib/models/Wallet.js +32 -0
  198. package/lib/models/index.js +102 -0
  199. package/lib/service.js +14 -0
  200. package/lib/services/BankAccounts.js +31 -0
  201. package/lib/services/BankingAliases.js +137 -0
  202. package/lib/services/CardPreAuthorizations.js +75 -0
  203. package/lib/services/CardRegistrations.js +64 -0
  204. package/lib/services/Cards.js +168 -0
  205. package/lib/services/Clients.js +196 -0
  206. package/lib/services/Conversions.js +155 -0
  207. package/lib/services/Deposits.js +109 -0
  208. package/lib/services/DisputeDocuments.js +65 -0
  209. package/lib/services/Disputes.js +409 -0
  210. package/lib/services/Events.js +24 -0
  211. package/lib/services/Hooks.js +81 -0
  212. package/lib/services/Idempotency.js +17 -0
  213. package/lib/services/IdentityVerifications.js +48 -0
  214. package/lib/services/KycDocuments.js +66 -0
  215. package/lib/services/Mandates.js +161 -0
  216. package/lib/services/OptionsHelper.js +20 -0
  217. package/lib/services/PayIns.js +690 -0
  218. package/lib/services/PayOuts.js +110 -0
  219. package/lib/services/Recipients.js +117 -0
  220. package/lib/services/Refunds.js +29 -0
  221. package/lib/services/Regulatory.js +29 -0
  222. package/lib/services/Reports.js +61 -0
  223. package/lib/services/ReportsV2.js +55 -0
  224. package/lib/services/Repudiations.js +33 -0
  225. package/lib/services/Responses.js +23 -0
  226. package/lib/services/Settlements.js +74 -0
  227. package/lib/services/Transfers.js +87 -0
  228. package/lib/services/UboDeclarations.js +135 -0
  229. package/lib/services/Users.js +831 -0
  230. package/lib/services/VirtualAccounts.js +99 -0
  231. package/lib/services/Wallets.js +85 -0
  232. package/lib/services/index.js +34 -0
  233. package/lib/utils.js +36 -0
  234. package/package.json +40 -0
  235. package/test/TestKycPageFile.png +0 -0
  236. package/test/helpers.js +1431 -0
  237. package/test/main.js +10 -0
  238. package/test/mocha.opts +3 -0
  239. package/test/services/BankAccounts.js +46 -0
  240. package/test/services/BankingAliases.js +89 -0
  241. package/test/services/CardPreAuthorizations.js +70 -0
  242. package/test/services/CardRegistrations.js +239 -0
  243. package/test/services/Cards.js +54 -0
  244. package/test/services/Clients.js +235 -0
  245. package/test/services/Conversions.js +308 -0
  246. package/test/services/Deposits.js +148 -0
  247. package/test/services/Disputes.js +542 -0
  248. package/test/services/EMoney.js +54 -0
  249. package/test/services/Events.js +143 -0
  250. package/test/services/Hooks.js +109 -0
  251. package/test/services/Idempotency.js +46 -0
  252. package/test/services/IdentityVerifications.js +68 -0
  253. package/test/services/KycDocuments.js +73 -0
  254. package/test/services/Mandates.js +256 -0
  255. package/test/services/PayIns.js +2553 -0
  256. package/test/services/PayOuts.js +106 -0
  257. package/test/services/RateLimit.js +48 -0
  258. package/test/services/Recipients.js +234 -0
  259. package/test/services/Refunds.js +123 -0
  260. package/test/services/Regulatory.js +45 -0
  261. package/test/services/Reports.js +114 -0
  262. package/test/services/ReportsV2.js +306 -0
  263. package/test/services/Repudiations.js +22 -0
  264. package/test/services/Settlements.js +58 -0
  265. package/test/services/Tokens.js +55 -0
  266. package/test/services/Transfers.js +137 -0
  267. package/test/services/UboDeclarations.js +135 -0
  268. package/test/services/Users.js +1303 -0
  269. package/test/services/VirtualAccounts.js +105 -0
  270. package/test/services/Wallets.js +132 -0
  271. package/test/settlement_sample.csv +8 -0
  272. package/typings/base.d.ts +308 -0
  273. package/typings/enums.d.ts +204 -0
  274. package/typings/index.d.ts +885 -0
  275. package/typings/index.test-d.ts +1535 -0
  276. package/typings/models/address.d.ts +70 -0
  277. package/typings/models/bankAccount.d.ts +235 -0
  278. package/typings/models/bankingAlias.d.ts +97 -0
  279. package/typings/models/billing.d.ts +42 -0
  280. package/typings/models/birthplace.d.ts +9 -0
  281. package/typings/models/card.d.ts +119 -0
  282. package/typings/models/cardPreauthorization.d.ts +157 -0
  283. package/typings/models/cardRegistration.d.ts +83 -0
  284. package/typings/models/cardValidation.d.ts +125 -0
  285. package/typings/models/client.d.ts +208 -0
  286. package/typings/models/conversion.d.ts +225 -0
  287. package/typings/models/conversionRate.d.ts +29 -0
  288. package/typings/models/countryAuthorization.d.ts +16 -0
  289. package/typings/models/deposit.d.ts +104 -0
  290. package/typings/models/dispute.d.ts +116 -0
  291. package/typings/models/disputeDocument.d.ts +119 -0
  292. package/typings/models/entityBase.d.ts +9 -0
  293. package/typings/models/event.d.ts +142 -0
  294. package/typings/models/hook.d.ts +39 -0
  295. package/typings/models/idempotency.d.ts +36 -0
  296. package/typings/models/identityVerification.d.ts +98 -0
  297. package/typings/models/kycDocument.d.ts +114 -0
  298. package/typings/models/mandate.d.ts +93 -0
  299. package/typings/models/money.d.ts +45 -0
  300. package/typings/models/payIn.d.ts +3742 -0
  301. package/typings/models/payOut.d.ts +144 -0
  302. package/typings/models/recipient.d.ts +242 -0
  303. package/typings/models/refund.d.ts +92 -0
  304. package/typings/models/report.d.ts +234 -0
  305. package/typings/models/reportV2.d.ts +145 -0
  306. package/typings/models/repudiation.d.ts +26 -0
  307. package/typings/models/securityInfo.d.ts +12 -0
  308. package/typings/models/settlement.d.ts +50 -0
  309. package/typings/models/settlementTransfer.d.ts +37 -0
  310. package/typings/models/shipping.d.ts +37 -0
  311. package/typings/models/shippingAddress.d.ts +15 -0
  312. package/typings/models/transaction.d.ts +85 -0
  313. package/typings/models/transfer.d.ts +119 -0
  314. package/typings/models/uboDeclaration.d.ts +100 -0
  315. package/typings/models/user.d.ts +1001 -0
  316. package/typings/models/virtualAccount.d.ts +182 -0
  317. package/typings/models/wallet.d.ts +46 -0
  318. package/typings/models.d.ts +74 -0
  319. package/typings/services/BankAccounts.d.ts +12 -0
  320. package/typings/services/BankingAliases.d.ts +51 -0
  321. package/typings/services/CardPreauthorizations.d.ts +44 -0
  322. package/typings/services/CardRegistrations.d.ts +43 -0
  323. package/typings/services/Cards.d.ts +80 -0
  324. package/typings/services/Clients.d.ts +77 -0
  325. package/typings/services/Conversions.d.ts +23 -0
  326. package/typings/services/Deposits.d.ts +20 -0
  327. package/typings/services/DisputeDocuments.d.ts +27 -0
  328. package/typings/services/Disputes.d.ts +169 -0
  329. package/typings/services/Events.d.ts +11 -0
  330. package/typings/services/Hooks.d.ts +33 -0
  331. package/typings/services/Idempotency.d.ts +7 -0
  332. package/typings/services/IdentityVerifications.d.ts +29 -0
  333. package/typings/services/KycDocuments.d.ts +38 -0
  334. package/typings/services/Mandates.d.ts +59 -0
  335. package/typings/services/OptionsHelper.d.ts +11 -0
  336. package/typings/services/PayIns.d.ts +319 -0
  337. package/typings/services/PayOuts.d.ts +34 -0
  338. package/typings/services/Recipients.d.ts +55 -0
  339. package/typings/services/Refunds.d.ts +12 -0
  340. package/typings/services/Regulatory.d.ts +17 -0
  341. package/typings/services/Reports.d.ts +26 -0
  342. package/typings/services/ReportsV2.d.ts +26 -0
  343. package/typings/services/Repudiations.d.ts +12 -0
  344. package/typings/services/Responses.d.ts +10 -0
  345. package/typings/services/Settlements.d.ts +28 -0
  346. package/typings/services/Transfers.d.ts +38 -0
  347. package/typings/services/UboDeclarations.d.ts +81 -0
  348. package/typings/services/Users.d.ts +308 -0
  349. package/typings/services/VirtualAccounts.d.ts +42 -0
  350. package/typings/services/Wallets.d.ts +36 -0
  351. package/typings/tsconfig.json +20 -0
  352. package/typings/tslint.json +11 -0
  353. package/typings/types.d.ts +652 -0
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Examples of getting a user's emoney
3
+ */
4
+ var mangopay = require('../index');
5
+
6
+ var api = new mangopay({
7
+ clientId: 'sdk-unit-tests',
8
+ clientApiKey: 'cqFfFrWfCcb7UadHNxx2C9Lo6Djw8ZduLi7J9USTmu8bhxxpju'
9
+ });
10
+
11
+ var USER_ID = '1151091';
12
+ var year = 2019;
13
+
14
+ api.Users.getEMoney(USER_ID, year).then(function (data) {
15
+ console.log(data);
16
+ });
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Examples of reading users data
3
+ */
4
+ var mangopay = require('../index');
5
+
6
+ var api = new mangopay({
7
+ clientId: 'sdk-unit-tests',
8
+ clientApiKey: 'cqFfFrWfCcb7UadHNxx2C9Lo6Djw8ZduLi7J9USTmu8bhxxpju'
9
+ });
10
+
11
+ /**
12
+ * Using both callback and promise. Usually you should be using only one of them
13
+ */
14
+ api.Users.getNatural('1151091', function(data, response) {
15
+ console.log(data.FirstName);
16
+ console.log(data.LastName);
17
+ }).then(function(data){
18
+ console.log(data.FirstName);
19
+ console.log(data.LastName);
20
+ });
21
+
22
+ /**
23
+ * Example of pagination with promise on getAll users API
24
+ */
25
+ api.Users.getAll({
26
+ parameters: {
27
+ per_page: 2,
28
+ page: 2
29
+ }
30
+ }).then(function(data){
31
+ console.log(data);
32
+ });
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Examples of reading users data
3
+ */
4
+ var mangopay = require('../index');
5
+
6
+ var api = new mangopay({
7
+ clientId: 'sdk-unit-tests',
8
+ clientApiKey: 'cqFfFrWfCcb7UadHNxx2C9Lo6Djw8ZduLi7J9USTmu8bhxxpju',
9
+ debug: true
10
+ });
11
+
12
+ /**
13
+ * Read full server response object using a callback
14
+ */
15
+ api.Users.getAll(function (response) {
16
+ // Read pages count
17
+ console.log(response.headers['x-number-of-pages']);
18
+
19
+ // Read response body
20
+ console.log(response.body);
21
+ }, {
22
+ parameters: {
23
+ per_page: 1
24
+ },
25
+ resolveWithFullResponse: true
26
+ });
27
+
28
+ /**
29
+ * Read full server response object using promise
30
+ */
31
+ api.Users.getAll({
32
+ parameters: {
33
+ per_page: 1
34
+ },
35
+ resolveWithFullResponse: true
36
+ }).then(function(response){
37
+ // Read pages count
38
+ console.log(response.headers['x-number-of-pages']);
39
+
40
+ // Read response body
41
+ console.log(response.body);
42
+ });
package/index.js ADDED
@@ -0,0 +1 @@
1
+ module.exports = require('./lib/mangopay');
package/lib/Model.js ADDED
@@ -0,0 +1,58 @@
1
+ var _ = require('underscore');
2
+
3
+ function Model(data) {
4
+ var nonNullDefaults = _.omit(this.defaults, _.isEmpty);
5
+ _.extend(this, nonNullDefaults, data);
6
+ this.initialize(data);
7
+ }
8
+
9
+ Model.prototype = {
10
+ /**
11
+ * Construct
12
+ */
13
+ initialize: function() {
14
+ this.parse();
15
+ return;
16
+ },
17
+
18
+ /**
19
+ * Returns object property value
20
+ * @param {string} attribute - Property value to return
21
+ * @returns {*}
22
+ */
23
+ getData: function(attribute) {
24
+ return this[attribute];
25
+ },
26
+
27
+ /**
28
+ *
29
+ * @param {string|Object} attribute - attribute's value to be set or hash of properties with values
30
+ * @param {string=} value - value to be set
31
+ * @returns {object}
32
+ */
33
+ setData: function(attribute, value) {
34
+ if (typeof attribute === 'object') {
35
+ _.extend(this, attribute);
36
+ } else {
37
+ this[attribute] = value;
38
+ }
39
+
40
+ return this;
41
+ },
42
+
43
+ getReadOnlyProperties: function() {
44
+ return [];
45
+ },
46
+
47
+ getDependsObjects: function() {
48
+ return [];
49
+ },
50
+
51
+ parse: function() {
52
+ return;
53
+ }
54
+ };
55
+
56
+ Model.extend = require('./utils').extend;
57
+
58
+ module.exports = Model;
package/lib/api.js ADDED
@@ -0,0 +1,467 @@
1
+ var _ = require('underscore');
2
+ var Promise = require('promise');
3
+ var querystring = require('querystring');
4
+
5
+ var apiMethods = require('./apiMethods');
6
+ var apiModels = require('./models');
7
+ var apiServices = require('./services');
8
+
9
+ var axios = require('axios');
10
+ var FormData = require('form-data');
11
+
12
+ /**
13
+ *
14
+ * @param {string} username Mangopay username
15
+ * @param {string} apiKey Mangopay api key
16
+ * @returns {string} The header value base64 encoded for requesting the authentication key
17
+ * @private
18
+ */
19
+ function _getBasicAuthHash(username, apiKey) {
20
+ return 'Basic ' + Buffer.from(username + ':' + apiKey).toString('base64');
21
+ }
22
+
23
+ var Api = function (config) {
24
+ var defaultConfig = require('./config');
25
+ config = this.config = _.extend({}, defaultConfig, config);
26
+
27
+ axios.defaults.baseURL = config.baseUrl;
28
+ // response timeout
29
+ axios.defaults.timeout = config.responseTimeout;
30
+
31
+ this.errorHandler = config.errorHandler;
32
+
33
+ this.rateLimits = [];
34
+
35
+ // Add default request configuration options
36
+ _.extend(this.requestOptions, {
37
+ // Path options are replacing the ${placeholders} from apiMethods
38
+ path: {
39
+ clientId: config.clientId,
40
+ apiVersion: config.apiVersion
41
+ },
42
+ headers: {
43
+ 'Content-Type': 'application/json',
44
+ 'User-Agent': 'Mangopay-SDK/' + require('../package.json').version + ` (Nodejs/${process.version})`
45
+ }
46
+ });
47
+
48
+ // Adds the services to API object
49
+ this._servicesLoader();
50
+
51
+ return this;
52
+ };
53
+
54
+ Api.prototype = {
55
+ config: require('./config'),
56
+
57
+ requestOptions: {
58
+ headers: {}
59
+ },
60
+
61
+ /**
62
+ * Checks if callback is a function or not, and passes the options
63
+ * @param {Object, Function} callback
64
+ * @param {Object} options
65
+ * @param {Object} params Additional params that extend options
66
+ */
67
+ _getOptions: function (callback, options, params) {
68
+ var finalOptions = options || ((_.isObject(callback) && !_.isFunction(callback)) ? callback : {});
69
+ if (params) {
70
+ finalOptions = _.extend({}, finalOptions, params);
71
+ }
72
+
73
+ return finalOptions;
74
+ },
75
+
76
+ /**
77
+ * Main API resource request method
78
+ * @param {string} method Mangopay API method to be called
79
+ * @param {function} callback Callback function
80
+ * @param {object} options Hash of configuration to be passed to request
81
+ * @returns {object} request promise
82
+ */
83
+ method: function (method, callback, options) {
84
+ options = this._getOptions(callback, options);
85
+
86
+ if (this.config.debugMode) {
87
+ this.config.logClass(method, options);
88
+ }
89
+
90
+ // If data has parse method, call it before passing data
91
+ if (options.data && options.data instanceof this.models.EntityBase) {
92
+ options.data = this.buildRequestData(options.data);
93
+ } else if (options.data && options.data.toJSON) {
94
+ options.data = options.data.toJSON();
95
+ }
96
+ var self = this;
97
+
98
+ // If there's no OAuthKey, request one
99
+ if (!this.requestOptions.headers.Authorization || this.isExpired()) {
100
+ return new Promise(function (resolve, reject) {
101
+ self.authorize()
102
+ .then(function () {
103
+ self.method.call(self, method, function (data, response) {
104
+ // Check if we have to wrap data into a model
105
+ if (_.isFunction(callback)) {
106
+ callback(data, response);
107
+ }
108
+ }, options)
109
+ .then(resolve)
110
+ .catch(reject);
111
+ })
112
+ .catch(reject);
113
+ });
114
+ }
115
+
116
+ // Extend default request options with custom ones, if present
117
+ var requestOptions = _.extend({}, this.requestOptions, options);
118
+
119
+ // If we have custom headers and they don't contain Content-Type, we have to prevent them to override Authentication header
120
+ if (options && options.headers && options.headers['Content-Type'] === undefined) {
121
+ _.extend(requestOptions.headers, this.requestOptions.headers, options.headers);
122
+ }
123
+
124
+ // Append the path placeholders in order to build the proper url for the request
125
+ if (options && options.path) {
126
+ _.extend(requestOptions.path, this.requestOptions.path, options.path);
127
+ }
128
+
129
+ if (this.config.ukHeaderFlag) {
130
+ requestOptions.headers['x-tentant-id'] = 'uk';
131
+ }
132
+
133
+ return this._requestApi(requestOptions, method, callback);
134
+ },
135
+
136
+ /**
137
+ * Request method for POST or PUT with multipart file. The file is expected to be in options.data.File, as a Buffer
138
+ * @param {string} method Mangopay API method to be called
139
+ * @param {function} callback Callback function
140
+ * @param {object} options Hash of configuration to be passed to request
141
+ * @returns {object} request promise
142
+ */
143
+ multipartFormMethod: function (method, callback, options) {
144
+ options = this._getOptions(callback, options);
145
+ if (options.data === undefined || options.data.file === undefined || !Buffer.isBuffer(options.data.file)) {
146
+ throw new Error('options.data.file needs to be a Buffer');
147
+ }
148
+ if (options.data === undefined || options.data.fileName === undefined) {
149
+ throw new Error('options.data.fileName needs to be present');
150
+ }
151
+
152
+ if (this.config.debugMode) {
153
+ this.config.logClass(method, options);
154
+ }
155
+
156
+ var self = this;
157
+
158
+ // If there's no OAuthKey, request one
159
+ if (!this.requestOptions.headers.Authorization || this.isExpired()) {
160
+ return new Promise(function (resolve, reject) {
161
+ self.authorize()
162
+ .then(function () {
163
+ self.multipartFormMethod.call(self, method, function (data, response) {
164
+ // Check if we have to wrap data into a model
165
+ if (_.isFunction(callback)) {
166
+ callback(data, response);
167
+ }
168
+ }, options)
169
+ .then(resolve)
170
+ .catch(reject);
171
+ })
172
+ .catch(reject);
173
+ });
174
+ }
175
+
176
+ const form = new FormData();
177
+ form.append('file', options.data.file, {
178
+ filename: options.data.fileName
179
+ });
180
+
181
+ // Extend default request options with custom ones, if present
182
+ var requestOptions = _.extend({}, this.requestOptions, options);
183
+ requestOptions.data = form;
184
+
185
+ // Append the path placeholders in order to build the proper url for the request
186
+ if (options && options.path) {
187
+ _.extend(requestOptions.path, this.requestOptions.path, options.path);
188
+ }
189
+
190
+ if (this.config.ukHeaderFlag) {
191
+ requestOptions.headers['x-tentant-id'] = 'uk';
192
+ }
193
+
194
+ // keep only the multipart content-type header
195
+ if (requestOptions.headers['Content-Type'] === 'application/json') {
196
+ delete requestOptions.headers['Content-Type'];
197
+ }
198
+
199
+ requestOptions.headers = Object.assign(
200
+ {},
201
+ requestOptions.headers,
202
+ form.getHeaders()
203
+ );
204
+
205
+ return this._requestApi(requestOptions, method, callback);
206
+ },
207
+
208
+ _requestApi: function (requestOptions, method, callback) {
209
+ var self = this;
210
+
211
+ return new Promise(function (resolve, reject) {
212
+ if (!method) {
213
+ throw new Error('Method is required in order to perform a API server request');
214
+ }
215
+
216
+ var url;
217
+ var methodType;
218
+
219
+ // Allow direct requests: api.method('post', function(){ ... });
220
+ if (['post', 'get', 'put', 'delete'].indexOf(method) === -1) {
221
+ // predefined requests
222
+ url = apiMethods[method][0];
223
+ url = self.replaceUrl(url, requestOptions.path);
224
+ methodType = apiMethods[method][1];
225
+ } else {
226
+ // manual requests
227
+ if (!requestOptions.url) {
228
+ throw new Error('Url must be specified when doing a manual request');
229
+ }
230
+ url = requestOptions.url;
231
+ methodType = method;
232
+ }
233
+
234
+ if (!url) {
235
+ throw new Error('Url must be specified when doing a manual request');
236
+ }
237
+
238
+ var resolveWithFullResponse = requestOptions.resolveWithFullResponse || false;
239
+ var abortSignal = AbortSignal.timeout(self.config.connectionTimeout)
240
+
241
+ axios({
242
+ method: methodType,
243
+ url: url,
244
+ data: requestOptions.data,
245
+ headers: requestOptions.headers,
246
+ params: requestOptions.parameters,
247
+ signal: abortSignal
248
+ })
249
+ .then(function (response) {
250
+ var resolveArgument = (resolveWithFullResponse) ?
251
+ _.extend(response, {body: response.data}) : response.data;
252
+
253
+ setRateLimits(self, response.headers);
254
+
255
+ // For predefined requests:
256
+ // Add raw response data under 'data' property of the object and at the root of the object
257
+ if (['post', 'get', 'put'].indexOf(method) === -1) {
258
+ _.extend(requestOptions.data, response.data, {data: response.data});
259
+
260
+ // Check if we have to instantiate returned data
261
+ if (requestOptions.dataClass && !resolveWithFullResponse) {
262
+ if (_.isArray(response.data)) {
263
+ resolveArgument = _.map(response.data, function (dataItem) {
264
+ return new requestOptions.dataClass(dataItem);
265
+ });
266
+ } else {
267
+ resolveArgument = new requestOptions.dataClass(response.data);
268
+ }
269
+ }
270
+ }
271
+
272
+ if (_.isFunction(callback)) {
273
+ callback(resolveArgument, response);
274
+ }
275
+
276
+ resolve(resolveArgument);
277
+ })
278
+ // The request was made and the server responded with a status code
279
+ // that falls out of the range of 2xx
280
+ .catch(function (error) {
281
+ if (error.code === "ERR_CANCELED" && abortSignal.aborted) {
282
+ var err = {
283
+ Message: "Request timed out",
284
+ Code: 408
285
+ };
286
+ self.errorHandler(err.Message, err);
287
+ reject(err);
288
+ } else {
289
+ var resolveArgument = (resolveWithFullResponse) ?
290
+ _.extend(error.response, {body: error.response.data}) : error.response.data;
291
+
292
+ if (_.isFunction(callback)) {
293
+ callback(resolveArgument, error.response);
294
+ }
295
+
296
+ self.errorHandler(error.message, error.response.data);
297
+ reject(resolveArgument);
298
+ }
299
+ });
300
+ });
301
+ },
302
+
303
+ buildRequestData: function (entity) {
304
+ var self = this;
305
+
306
+ var blackList = entity.getReadOnlyProperties();
307
+ var requestDataKeys = _.difference(_.keys(entity), blackList);
308
+ var requestData = _.pick(entity, requestDataKeys);
309
+
310
+ _.each(_.keys(entity), function (key) {
311
+ if (self.canReadSubRequestData(entity, key)) {
312
+ _.extendOwn(requestData, entity[key].toJSON());
313
+ }
314
+ });
315
+
316
+ return requestData;
317
+ },
318
+
319
+ canReadSubRequestData: function (entity, propertyName) {
320
+ if (entity instanceof this.models.PayIn && (propertyName === 'PaymentDetails' || propertyName === 'ExecutionDetails')) {
321
+ return true;
322
+ }
323
+
324
+ if (entity instanceof this.models.PayOut && propertyName === 'MeanOfPaymentDetails') {
325
+ return true;
326
+ }
327
+
328
+ if (entity instanceof this.models.BankAccount && propertyName === 'Details') {
329
+ return true;
330
+ }
331
+
332
+ return false;
333
+ },
334
+
335
+ /**
336
+ * OAuth2 authorization mechanism. After authorization request, calls the callback with returned authorization data
337
+ * @param {function} callback
338
+ * @returns {object} request promise
339
+ */
340
+ authorize: function (callback) {
341
+ var self = this;
342
+
343
+ var auth_post_data = querystring.stringify({
344
+ 'grant_type': 'client_credentials'
345
+ });
346
+
347
+ //'Content-Length' doesn't need to be set, it gets set automatically (node-rest-client v3.1.0)
348
+ return new Promise(function (resolve, reject) {
349
+
350
+ var url = self.buildOauthUrl();
351
+ var methodType = apiMethods.authentication_oauth[1];
352
+
353
+ axios({
354
+ method: methodType,
355
+ url: url,
356
+ data: auth_post_data,
357
+ headers: _.extend({}, self.requestOptions.headers, {
358
+ 'Authorization': _getBasicAuthHash(self.config.clientId, self.config.clientApiKey),
359
+ 'Content-Type': 'application/x-www-form-urlencoded',
360
+ })
361
+ })
362
+ .then(function (response) {
363
+ // Authorization succeeded
364
+ if (response.data.token_type && response.data.access_token) {
365
+ _.extend(self.requestOptions.headers, {
366
+ 'Authorization': response.data.token_type + ' ' + response.data.access_token
367
+ });
368
+ // Multiplying expires_in (seconds) by 1000 since JS getTime() is expressed in ms
369
+ self.authorizationExpireTime = new Date().getTime() + (response.data.expires_in * 1000);
370
+ resolve(response.data);
371
+ if (_.isFunction(callback)) {
372
+ callback(response.data);
373
+ }
374
+ } else {
375
+ reject(response.data);
376
+ }
377
+ })
378
+ .catch(function (error) {
379
+ reject(error.response ? error.response.data : error.message);
380
+ });
381
+ });
382
+ },
383
+
384
+ isExpired: function () {
385
+ // Expressed in ms ( 10 seconds )
386
+ var THRESHOLD = 60000;
387
+ return new Date().getTime() > (this.authorizationExpireTime - THRESHOLD);
388
+ },
389
+
390
+ replaceUrl: function (url, data) {
391
+ // Create regex using the keys of the replacement object.
392
+ const regex = new RegExp('\\${(' + Object.keys(data).join('|') + ')}', 'g');
393
+
394
+ // Replace the string by the value in object
395
+ return url.replace(regex, (m, p1) => data[p1] || m);
396
+ },
397
+
398
+ buildOauthUrl: function() {
399
+ var url = apiMethods.authentication_oauth[0];
400
+ url = this.replaceUrl(url, this.requestOptions.path);
401
+ return url;
402
+ },
403
+
404
+ /**
405
+ * Populates the SDK object with the services
406
+ */
407
+ _servicesLoader: function () {
408
+ var self = this;
409
+ // Retrieve all services and add them to this object
410
+ // ex: services.User becomes mangopay.Users
411
+ Object.keys(apiServices).forEach(function (serviceName) {
412
+ var ServiceClass = apiServices[serviceName];
413
+ self[serviceName] = new ServiceClass();
414
+ self[serviceName]._api = self;
415
+ });
416
+
417
+ // Retrieve all models and add them to this object
418
+ // ex: models.User becomes mangopay.models.User
419
+ self.models = {};
420
+ Object.keys(apiModels).forEach(function (modelName) {
421
+ self.models[modelName] = apiModels[modelName];
422
+ });
423
+ }
424
+ };
425
+
426
+ function setRateLimits(self, headers) {
427
+ self.rateLimits = [];
428
+ if (headers !== undefined) {
429
+ let rateLimitReset = headers['x-ratelimit-reset'];
430
+ let rateLimitRemaining = headers['x-ratelimit-remaining'];
431
+ let rateLimitMade = headers['x-ratelimit'];
432
+
433
+ if (rateLimitReset !== undefined && rateLimitRemaining !== undefined && rateLimitMade !== undefined) {
434
+ rateLimitReset = rateLimitReset.split(",");
435
+ rateLimitRemaining = rateLimitRemaining.split(",");
436
+ rateLimitMade = rateLimitMade.split(",");
437
+
438
+ if (rateLimitReset.length === rateLimitRemaining.length && rateLimitReset.length === rateLimitMade.length) {
439
+ const currentTime = Math.floor(Date.now() / 1000);
440
+ for (let i = 0; i < rateLimitReset.length; i++) {
441
+ const numberOfMinutes = (parseInt(rateLimitReset[i]) - currentTime) / 60;
442
+ const rateLimit = {
443
+ resetTimeMillis: parseInt(rateLimitReset[i]),
444
+ callsRemaining: parseInt(rateLimitRemaining[i]),
445
+ callsMade: parseInt(rateLimitMade[i])
446
+ };
447
+
448
+ if (numberOfMinutes <= 15) {
449
+ rateLimit.minutesInterval = 15;
450
+ } else if (numberOfMinutes <= 30) {
451
+ rateLimit.minutesInterval = 30;
452
+ } else if (numberOfMinutes <= 60) {
453
+ rateLimit.minutesInterval = 60;
454
+ } else if (numberOfMinutes <= 60 * 24) {
455
+ rateLimit.minutesInterval = 60 * 24;
456
+ }
457
+
458
+ self.rateLimits.push(rateLimit);
459
+ }
460
+ } else {
461
+ console.log("Could not set rate limits: headers length should be the same");
462
+ }
463
+ }
464
+ }
465
+ }
466
+
467
+ module.exports = Api;