@mojaloop/central-ledger 9.2.2 → 15.1.3-snapshot.2

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 (256) hide show
  1. package/.circleci/config.yml +625 -204
  2. package/.env +3 -2
  3. package/.ncurc.yaml +9 -0
  4. package/.nvmrc +1 -1
  5. package/.versionrc +15 -0
  6. package/CHANGELOG.md +353 -0
  7. package/CODEOWNERS +31 -0
  8. package/Dockerfile +20 -14
  9. package/LICENSE.md +4 -4
  10. package/Onboarding.md +0 -7
  11. package/README.md +99 -22
  12. package/audit-resolve.json +136 -1
  13. package/config/default.json +82 -27
  14. package/docker/central-ledger/default.json +68 -21
  15. package/docker/ml-api-adapter/default.json +10 -1
  16. package/docker/wait-for/wait-for-objstore.sh +1 -6
  17. package/docker/wait-for/wait-for.env +1 -1
  18. package/docker-compose.integration.yml +8 -5
  19. package/docker-compose.yml +73 -16
  20. package/migrations/310203_transferParticipant-indexes.js +38 -0
  21. package/migrations/310503_participantLimit-indexes-composite.js +38 -0
  22. package/migrations/{400401_settlementWindowStateChange-indexes.js → 400401_settlmentWindowStateChange-indexes.js} +0 -0
  23. package/migrations/401301_settlementModel-indexes.js +2 -0
  24. package/migrations/500401_quote-hotfix-2719.js +58 -0
  25. package/migrations/500501_feature-fixSubIdRef.js +53 -0
  26. package/migrations/500601_party-2480.js +63 -0
  27. package/migrations/501001_quoteExtension-quote-service-174.js +46 -0
  28. package/migrations/501002_quoteExtension-2522.js +61 -0
  29. package/migrations/800101_feature-fixSubIdRef.js +90 -0
  30. package/migrations/910102_hotfix954.js +4 -1
  31. package/migrations/940100_quotePartyIdInfoExtension.js +52 -0
  32. package/migrations/940101_quotePartyIdInfoExtension-2522.js +64 -0
  33. package/migrations/950100_settlementContentAggregation-decimal184.js +40 -0
  34. package/migrations/950101_transferParticipantStateChange.js +46 -0
  35. package/migrations/950102_settlementModel-adjustPosition.js +42 -0
  36. package/migrations/950103_dropTransferParticipantStateChange.js +47 -0
  37. package/migrations/950104_settlementModel-settlementAccountTypeId.js +79 -0
  38. package/migrations/950106_unique_settlement_model_ledger_account_currency.js +38 -0
  39. package/migrations/950107_settlementWindowContent_foreign_settlementModel.js +60 -0
  40. package/package.json +99 -81
  41. package/scripts/_wait4_all.js +146 -0
  42. package/seeds/amountType.js +4 -6
  43. package/seeds/balanceOfPayments.js +4 -6
  44. package/seeds/bulkProcessingState.js +4 -6
  45. package/seeds/bulkTransferState.js +4 -6
  46. package/seeds/currency.js +4 -6
  47. package/seeds/endpointType.js +128 -7
  48. package/seeds/ledgerAccountType.js +11 -10
  49. package/seeds/ledgerEntryType.js +5 -7
  50. package/seeds/participant.js +4 -6
  51. package/seeds/participantLimitType.js +4 -6
  52. package/seeds/partyIdentifierType.js +4 -6
  53. package/seeds/partyType.js +4 -6
  54. package/seeds/settlementDelay.js +4 -6
  55. package/seeds/settlementGranularity.js +4 -6
  56. package/seeds/settlementInterchange.js +4 -6
  57. package/seeds/settlementState.js +4 -6
  58. package/seeds/settlementWindow1State.js +4 -6
  59. package/seeds/transactionInitiator.js +4 -6
  60. package/seeds/transactionInitiatorType.js +4 -6
  61. package/seeds/transactionScenario.js +4 -6
  62. package/seeds/transferParticipantRoleType.js +4 -6
  63. package/seeds/transferState.js +9 -6
  64. package/src/api/interface/swagger.json +728 -948
  65. package/src/api/ledgerAccountTypes/handler.js +55 -0
  66. package/src/api/ledgerAccountTypes/routes.js +63 -0
  67. package/src/api/metrics/handler.js +2 -2
  68. package/src/api/metrics/routes.js +1 -1
  69. package/src/api/participants/handler.js +43 -35
  70. package/src/api/participants/routes.js +13 -13
  71. package/src/api/root/routes.js +2 -2
  72. package/src/api/settlementModels/handler.js +9 -26
  73. package/src/api/settlementModels/routes.js +4 -4
  74. package/src/api/transactions/handler.js +46 -0
  75. package/src/api/transactions/routes.js +45 -0
  76. package/src/domain/bulkTransfer/index.js +6 -5
  77. package/src/domain/ledgerAccountTypes/index.js +58 -0
  78. package/src/domain/participant/index.js +55 -4
  79. package/src/domain/position/index.js +18 -2
  80. package/src/domain/settlement/index.js +39 -6
  81. package/src/domain/transactions/index.js +61 -0
  82. package/src/domain/transfer/index.js +22 -2
  83. package/src/domain/transfer/transform.js +3 -3
  84. package/src/handlers/admin/handler.js +24 -32
  85. package/src/handlers/bulk/fulfil/handler.js +89 -56
  86. package/src/handlers/bulk/get/handler.js +203 -0
  87. package/src/handlers/bulk/index.js +4 -1
  88. package/src/handlers/bulk/prepare/handler.js +30 -29
  89. package/src/handlers/bulk/processing/handler.js +61 -32
  90. package/src/handlers/bulk/shared/validator.js +13 -1
  91. package/src/handlers/index.js +18 -9
  92. package/src/handlers/positions/handler.js +67 -46
  93. package/src/handlers/register.js +7 -7
  94. package/src/handlers/timeouts/handler.js +9 -4
  95. package/src/handlers/transfers/handler.js +408 -182
  96. package/src/handlers/transfers/validator.js +41 -11
  97. package/src/lib/cache.js +8 -34
  98. package/src/lib/config.js +5 -7
  99. package/src/lib/enum.js +22 -22
  100. package/src/lib/enumCached.js +76 -0
  101. package/src/lib/healthCheck/subServiceHealth.js +2 -2
  102. package/src/lib/requestLogger.js +9 -9
  103. package/src/lib/urlParser.js +1 -1
  104. package/src/models/bulkTransfer/bulkTransfer.js +6 -6
  105. package/src/models/bulkTransfer/bulkTransferAssociation.js +3 -3
  106. package/src/models/bulkTransfer/bulkTransferDuplicateCheck.js +4 -4
  107. package/src/models/bulkTransfer/bulkTransferExtension.js +2 -2
  108. package/src/models/bulkTransfer/bulkTransferFulfilmentDuplicateCheck.js +4 -4
  109. package/src/models/bulkTransfer/bulkTransferStateChange.js +7 -7
  110. package/src/models/bulkTransfer/facade.js +54 -3
  111. package/src/models/bulkTransfer/individualTransfer.js +2 -2
  112. package/src/models/ilpPackets/ilpPacket.js +36 -0
  113. package/src/models/ledgerAccountType/ledgerAccountType.js +139 -3
  114. package/src/models/misc/migrationLock.js +1 -1
  115. package/src/models/misc/segment.js +1 -1
  116. package/src/models/participant/facade.js +226 -76
  117. package/src/models/participant/participant.js +6 -5
  118. package/src/models/participant/participantCached.js +8 -0
  119. package/src/models/participant/participantCurrency.js +7 -7
  120. package/src/models/participant/participantCurrencyCached.js +11 -1
  121. package/src/models/participant/participantLimit.js +13 -13
  122. package/src/models/participant/participantLimitCached.js +124 -0
  123. package/src/models/participant/participantPosition.js +34 -5
  124. package/src/models/participant/participantPositionChange.js +10 -2
  125. package/src/models/position/facade.js +112 -18
  126. package/src/models/position/participantPosition.js +6 -6
  127. package/src/models/settlement/settlementModel.js +92 -17
  128. package/src/models/settlement/settlementModelCached.js +139 -0
  129. package/src/models/transfer/facade.js +97 -32
  130. package/src/models/transfer/ilpPacket.js +4 -4
  131. package/src/models/transfer/transfer.js +7 -7
  132. package/src/models/transfer/transferDuplicateCheck.js +21 -5
  133. package/src/models/transfer/transferError.js +5 -5
  134. package/src/models/transfer/transferErrorDuplicateCheck.js +4 -4
  135. package/src/models/transfer/transferExtension.js +4 -4
  136. package/src/models/transfer/transferFulfilment.js +5 -5
  137. package/src/models/transfer/transferFulfilmentDuplicateCheck.js +4 -4
  138. package/src/models/transfer/transferParticipant.js +3 -3
  139. package/src/models/transfer/transferStateChange.js +11 -11
  140. package/src/models/transfer/transferTimeout.js +5 -5
  141. package/src/schema/bulkTransfer.js +4 -4
  142. package/src/shared/plugins.js +10 -9
  143. package/src/shared/setup.js +69 -46
  144. package/test/integration/domain/participant/index.test.js +2 -0
  145. package/test/integration/handlers/handlers.test.js +605 -166
  146. package/test/integration/handlers/root.test.js +1 -1
  147. package/test/integration/helpers/hubAccounts.js +62 -0
  148. package/test/integration/helpers/ilpPacket.js +1 -1
  149. package/test/integration/helpers/participantFundsInOut.js +80 -0
  150. package/test/integration/helpers/participantLimit.js +6 -1
  151. package/test/integration/helpers/settlementModels.js +88 -0
  152. package/test/integration/helpers/testConsumer.js +163 -0
  153. package/test/integration/helpers/testProducer.js +0 -1
  154. package/test/integration/helpers/transferDuplicateCheck.js +1 -1
  155. package/test/integration/helpers/transferStateChange.js +1 -1
  156. package/test/integration/helpers/transferTestHelper.js +3 -5
  157. package/test/integration/models/transfer/transferStateChange.test.js +6 -0
  158. package/test/unit/api/ledgerAccountTypes/handler.test.js +126 -0
  159. package/test/unit/api/ledgerAccountTypes/routes.test.js +52 -0
  160. package/test/unit/api/participants/handler.test.js +75 -33
  161. package/test/unit/api/root/handler.test.js +1 -1
  162. package/test/unit/api/root/routes.test.js +2 -2
  163. package/test/unit/api/settlementModels/handler.test.js +21 -57
  164. package/test/unit/api/transactions/handler.test.js +108 -0
  165. package/test/unit/api/transactions/routes.test.js +38 -0
  166. package/test/unit/domain/ledgerAccountTypes/index.test.js +197 -0
  167. package/test/unit/domain/participant/index.test.js +115 -2
  168. package/test/unit/domain/settlement/index.test.js +199 -29
  169. package/test/unit/domain/transactions/index.test.js +128 -0
  170. package/test/unit/domain/transfer/index.test.js +1 -0
  171. package/test/unit/domain/transfer/transform.test.js +2 -0
  172. package/test/unit/handlers/admin/handler.test.js +5 -5
  173. package/test/unit/handlers/bulk/get/handler.test.js +401 -0
  174. package/test/unit/handlers/index.test.js +6 -0
  175. package/test/unit/handlers/positions/handler.test.js +26 -0
  176. package/test/unit/handlers/register.test.js +2 -0
  177. package/test/unit/handlers/transfers/handler.test.js +491 -36
  178. package/test/unit/handlers/transfers/validator.test.js +31 -31
  179. package/test/unit/lib/cache.test.js +0 -64
  180. package/test/unit/lib/cachingOfEnums.test.js +121 -0
  181. package/test/unit/lib/config.test.js +34 -0
  182. package/test/unit/lib/enum.test.js +6 -1
  183. package/test/unit/lib/enumCached.test.js +82 -0
  184. package/test/unit/lib/healthCheck/subServiceHealth.test.js +2 -0
  185. package/test/unit/lib/requestLogger.test.js +14 -12
  186. package/test/unit/models/ilpPackets/ilpPacket.test.js +89 -0
  187. package/test/unit/models/ledgerAccountType/ledgerAccountType.test.js +255 -6
  188. package/test/unit/models/misc/migrationLock.test.js +4 -0
  189. package/test/unit/models/misc/segment.test.js +5 -0
  190. package/test/unit/models/participant/facade.test.js +493 -54
  191. package/test/unit/models/participant/participant.test.js +4 -0
  192. package/test/unit/models/participant/participantCurrency.test.js +22 -9
  193. package/test/unit/models/participant/participantCurrencyCached.test.js +1 -1
  194. package/test/unit/models/participant/participantLimit.test.js +97 -0
  195. package/test/unit/models/participant/participantLimitCached.test.js +232 -0
  196. package/test/unit/models/participant/participantPosition.test.js +217 -0
  197. package/test/unit/models/participant/participantPositionChange.test.js +3 -0
  198. package/test/unit/models/position/facade.test.js +318 -29
  199. package/test/unit/models/position/participantPosition.test.js +22 -7
  200. package/test/unit/models/settlement/settlementModel.test.js +18 -37
  201. package/test/unit/models/settlement/settlementModelCached.test.js +171 -0
  202. package/test/unit/models/transfer/facade.test.js +115 -0
  203. package/test/unit/models/transfer/ilpPacket.test.js +28 -11
  204. package/test/unit/models/transfer/transfer.test.js +13 -4
  205. package/test/unit/models/transfer/transferDuplicateCheck.test.js +4 -0
  206. package/test/unit/models/transfer/transferError.test.js +5 -1
  207. package/test/unit/models/transfer/transferErrorDuplicateCheck.test.js +4 -0
  208. package/test/unit/models/transfer/transferExtension.test.js +26 -9
  209. package/test/unit/models/transfer/transferFulfilment.test.js +14 -5
  210. package/test/unit/models/transfer/transferFulfilmentDuplicateCheck.test.js +4 -0
  211. package/test/unit/models/transfer/transferParticipant.test.js +14 -5
  212. package/test/unit/models/transfer/transferStateChange.test.js +3 -0
  213. package/test/unit/models/transfer/transferTimeout.test.js +6 -0
  214. package/test/unit/seeds/amountType.test.js +6 -22
  215. package/test/unit/seeds/balanceOfPayments.test.js +6 -22
  216. package/test/unit/seeds/bulkProcessingState.test.js +84 -0
  217. package/test/unit/{lib/sidecar/nullClient.test.js → seeds/bulkTransferState.test.js} +36 -39
  218. package/test/unit/seeds/currency.test.js +6 -22
  219. package/test/unit/seeds/endpointType.test.js +6 -22
  220. package/test/unit/seeds/ledgerAccountType.test.js +5 -22
  221. package/test/unit/seeds/ledgerEntryType.test.js +6 -22
  222. package/test/unit/seeds/participant.test.js +5 -22
  223. package/test/unit/seeds/participantLimitType.test.js +6 -22
  224. package/test/unit/seeds/partyIdentifierType.test.js +6 -22
  225. package/test/unit/seeds/partyType.test.js +6 -22
  226. package/test/unit/seeds/settlementState.test.js +5 -22
  227. package/test/unit/seeds/settlementWindow1State.test.js +5 -22
  228. package/test/unit/seeds/transactionInitiator.test.js +6 -22
  229. package/test/unit/seeds/transactionInitiatorType.test.js +6 -22
  230. package/test/unit/seeds/transactionScenario.test.js +6 -22
  231. package/test/unit/seeds/transferParticipantRoleType.test.js +6 -22
  232. package/test/unit/seeds/transferState.test.js +6 -22
  233. package/test/unit/shared/plugins.test.js +31 -1
  234. package/test/unit/shared/setup.test.js +25 -36
  235. package/test/util/helpers.js +37 -2
  236. package/test/util/randomTransfers.js +1 -1
  237. package/test/util/scripts/env.sh +6 -5
  238. package/test/util/scripts/populateTestData.sh +204 -181
  239. package/test/util/scripts/populateTestDataForLegacySimulator.sh +261 -0
  240. package/test/util/scripts/restartObjStore.sh +1 -1
  241. package/test-integration.Dockerfile +15 -15
  242. package/test.Dockerfile +12 -12
  243. package/.circleci/_set_up_deploy_envs.sh +0 -47
  244. package/.dockerignore +0 -17
  245. package/.ncurc.json +0 -3
  246. package/server.sh +0 -4
  247. package/sonar-project.properties +0 -17
  248. package/src/lib/sidecar/index.js +0 -47
  249. package/src/lib/sidecar/nullClient.js +0 -18
  250. package/test/.env +0 -8
  251. package/test/integration-config.json +0 -367
  252. package/test/integration-runner.env +0 -31
  253. package/test/integration-runner.sh +0 -264
  254. package/test/spec-runner.sh +0 -132
  255. package/test/unit/lib/sidecar/index.test.js +0 -148
  256. package/test/unit/models/position/participantLimit.test.js +0 -135
@@ -30,25 +30,25 @@ const ErrorHandler = require('@mojaloop/central-services-error-handling')
30
30
 
31
31
  const getById = async (transferId) => {
32
32
  try {
33
- return await Db.transfer.findOne({ transferId: transferId })
33
+ return await Db.from('transfer').findOne({ transferId })
34
34
  } catch (err) {
35
35
  throw ErrorHandler.Factory.reformatFSPIOPError(err)
36
36
  }
37
37
  }
38
38
 
39
39
  const saveTransfer = async (record) => {
40
- Logger.debug('save transfer' + record.toString())
40
+ Logger.isDebugEnabled && Logger.debug('save transfer' + record.toString())
41
41
  try {
42
- return Db.transfer.insert(record)
42
+ return Db.from('transfer').insert(record)
43
43
  } catch (err) {
44
- Logger.error(err)
44
+ Logger.isErrorEnabled && Logger.error(err)
45
45
  throw err
46
46
  }
47
47
  }
48
48
 
49
49
  const destroyById = async (id) => {
50
50
  try {
51
- await Db.transfer.destroy({ transferId: id })
51
+ await Db.from('transfer').destroy({ transferId: id })
52
52
  } catch (err) {
53
53
  throw ErrorHandler.Factory.reformatFSPIOPError(err)
54
54
  }
@@ -56,9 +56,9 @@ const destroyById = async (id) => {
56
56
 
57
57
  const truncateTransfer = async () => {
58
58
  try {
59
- return await Db.transfer.truncate()
59
+ return await Db.from('transfer').truncate()
60
60
  } catch (err) {
61
- Logger.error(err)
61
+ Logger.isErrorEnabled && Logger.error(err)
62
62
  throw err
63
63
  }
64
64
  }
@@ -31,7 +31,7 @@
31
31
  const Db = require('../../lib/db')
32
32
  const Logger = require('@mojaloop/central-services-logger')
33
33
  const ErrorHandler = require('@mojaloop/central-services-error-handling')
34
-
34
+ const Metrics = require('@mojaloop/central-services-metrics')
35
35
  /**
36
36
  * @function GetTransferDuplicateCheck
37
37
  *
@@ -44,10 +44,18 @@ const ErrorHandler = require('@mojaloop/central-services-error-handling')
44
44
  */
45
45
 
46
46
  const getTransferDuplicateCheck = async (transferId) => {
47
- Logger.debug(`get transferDuplicateCheck (transferId=${transferId})`)
47
+ const histTimerGetTransferDuplicateCheckEnd = Metrics.getHistogram(
48
+ 'model_transfer',
49
+ 'transferDuplicateCheck_getTransferDuplicateCheck - Metrics for transfer duplicate check model',
50
+ ['success', 'queryName']
51
+ ).startTimer()
52
+ Logger.isDebugEnabled && Logger.debug(`get transferDuplicateCheck (transferId=${transferId})`)
48
53
  try {
49
- return Db.transferDuplicateCheck.findOne({ transferId })
54
+ const result = Db.from('transferDuplicateCheck').findOne({ transferId })
55
+ histTimerGetTransferDuplicateCheckEnd({ success: true, queryName: 'transferDuplicateCheck_getTransferDuplicateCheck' })
56
+ return result
50
57
  } catch (err) {
58
+ histTimerGetTransferDuplicateCheckEnd({ success: false, queryName: 'transferDuplicateCheck_getTransferDuplicateCheck' })
51
59
  throw new Error(err.message)
52
60
  }
53
61
  }
@@ -65,10 +73,18 @@ const getTransferDuplicateCheck = async (transferId) => {
65
73
  */
66
74
 
67
75
  const saveTransferDuplicateCheck = async (transferId, hash) => {
68
- Logger.debug(`save transferDuplicateCheck (transferId=${transferId}, hash=${hash})`)
76
+ const histTimerSaveTransferDuplicateCheckEnd = Metrics.getHistogram(
77
+ 'model_transfer',
78
+ 'transferDuplicateCheck_saveTransferDuplicateCheck - Metrics for transfer duplicate check model',
79
+ ['success', 'queryName']
80
+ ).startTimer()
81
+ Logger.isDebugEnabled && Logger.debug(`save transferDuplicateCheck (transferId=${transferId}, hash=${hash})`)
69
82
  try {
70
- return Db.transferDuplicateCheck.insert({ transferId, hash })
83
+ const result = Db.from('transferDuplicateCheck').insert({ transferId, hash })
84
+ histTimerSaveTransferDuplicateCheckEnd({ success: true, queryName: 'transferDuplicateCheck_saveTransferDuplicateCheck' })
85
+ return result
71
86
  } catch (err) {
87
+ histTimerSaveTransferDuplicateCheckEnd({ success: false, queryName: 'transferDuplicateCheck_saveTransferDuplicateCheck' })
72
88
  throw ErrorHandler.Factory.reformatFSPIOPError(err)
73
89
  }
74
90
  }
@@ -47,9 +47,9 @@ const ErrorHandler = require('@mojaloop/central-services-error-handling')
47
47
  */
48
48
 
49
49
  const insert = async (transferId, transferStateChangeId, errorCode, errorDescription) => {
50
- Logger.debug(`insert transferError - errorCode: ${errorCode}, errorDesc: ${errorDescription}`)
50
+ Logger.isDebugEnabled && Logger.debug(`insert transferError - errorCode: ${errorCode}, errorDesc: ${errorDescription}`)
51
51
  try {
52
- return Db.transferError.insert({ transferId, transferStateChangeId, errorCode, errorDescription })
52
+ return Db.from('transferError').insert({ transferId, transferStateChangeId, errorCode, errorDescription })
53
53
  } catch (err) {
54
54
  throw ErrorHandler.Factory.reformatFSPIOPError(err)
55
55
  }
@@ -78,7 +78,7 @@ const insert = async (transferId, transferStateChangeId, errorCode, errorDescrip
78
78
 
79
79
  const getByTransferStateChangeId = async (transferStateChangeId) => {
80
80
  try {
81
- return Db.transferError.find({ transferStateChangeId: transferStateChangeId })
81
+ return Db.from('transferError').find({ transferStateChangeId })
82
82
  } catch (err) {
83
83
  throw ErrorHandler.Factory.reformatFSPIOPError(err)
84
84
  }
@@ -107,7 +107,7 @@ const getByTransferStateChangeId = async (transferStateChangeId) => {
107
107
 
108
108
  const getByTransferId = async (id) => {
109
109
  try {
110
- const transferError = await Db.transferError.query(async (builder) => {
110
+ const transferError = await Db.from('transferError').query(async (builder) => {
111
111
  const result = builder
112
112
  .where({ transferId: id })
113
113
  .select('*')
@@ -117,7 +117,7 @@ const getByTransferId = async (id) => {
117
117
  transferError.errorCode = transferError.errorCode.toString()
118
118
  return transferError
119
119
  } catch (err) {
120
- Logger.error(err)
120
+ Logger.isErrorEnabled && Logger.error(err)
121
121
  throw err
122
122
  }
123
123
  }
@@ -44,9 +44,9 @@ const ErrorHandler = require('@mojaloop/central-services-error-handling')
44
44
  */
45
45
 
46
46
  const getTransferErrorDuplicateCheck = async (transferId) => {
47
- Logger.debug(`get transferErrorDuplicateCheck (transferId=${transferId})`)
47
+ Logger.isDebugEnabled && Logger.debug(`get transferErrorDuplicateCheck (transferId=${transferId})`)
48
48
  try {
49
- return Db.transferErrorDuplicateCheck.findOne({ transferId })
49
+ return Db.from('transferErrorDuplicateCheck').findOne({ transferId })
50
50
  } catch (err) {
51
51
  throw new Error(err.message)
52
52
  }
@@ -65,9 +65,9 @@ const getTransferErrorDuplicateCheck = async (transferId) => {
65
65
  */
66
66
 
67
67
  const saveTransferErrorDuplicateCheck = async (transferId, hash) => {
68
- Logger.debug(`save transferErrorDuplicateCheck (transferId=${transferId}, hash=${hash})`)
68
+ Logger.isDebugEnabled && Logger.debug(`save transferErrorDuplicateCheck (transferId=${transferId}, hash=${hash})`)
69
69
  try {
70
- return Db.transferErrorDuplicateCheck.insert({ transferId, hash })
70
+ return Db.from('transferErrorDuplicateCheck').insert({ transferId, hash })
71
71
  } catch (err) {
72
72
  throw ErrorHandler.Factory.reformatFSPIOPError(err)
73
73
  }
@@ -32,7 +32,7 @@ const ErrorHandler = require('@mojaloop/central-services-error-handling')
32
32
 
33
33
  const saveTransferExtension = async (extension) => {
34
34
  try {
35
- return await Db.transferExtension.insert(extension)
35
+ return await Db.from('transferExtension').insert(extension)
36
36
  } catch (err) {
37
37
  throw ErrorHandler.Factory.reformatFSPIOPError(err)
38
38
  }
@@ -40,7 +40,7 @@ const saveTransferExtension = async (extension) => {
40
40
 
41
41
  const getByTransferId = async (transferId, isFulfilment = false, isError = false) => {
42
42
  try {
43
- return await Db.transferExtension.find({ transferId, isFulfilment, isError })
43
+ return await Db.from('transferExtension').find({ transferId, isFulfilment, isError })
44
44
  } catch (err) {
45
45
  throw ErrorHandler.Factory.reformatFSPIOPError(err)
46
46
  }
@@ -48,7 +48,7 @@ const getByTransferId = async (transferId, isFulfilment = false, isError = false
48
48
 
49
49
  const getByTransferExtensionId = async (transferExtensionId) => {
50
50
  try {
51
- return await Db.transferExtension.findOne({ transferExtensionId })
51
+ return await Db.from('transferExtension').findOne({ transferExtensionId })
52
52
  } catch (err) {
53
53
  throw ErrorHandler.Factory.reformatFSPIOPError(err)
54
54
  }
@@ -56,7 +56,7 @@ const getByTransferExtensionId = async (transferExtensionId) => {
56
56
 
57
57
  const destroyByTransferId = async (transferId) => {
58
58
  try {
59
- return await Db.transferExtension.destroy({ transferId })
59
+ return await Db.from('transferExtension').destroy({ transferId })
60
60
  } catch (err) {
61
61
  throw ErrorHandler.Factory.reformatFSPIOPError(err)
62
62
  }
@@ -29,20 +29,20 @@ const Logger = require('@mojaloop/central-services-logger')
29
29
  const ErrorHandler = require('@mojaloop/central-services-error-handling')
30
30
 
31
31
  const getByTransferId = async (transferId) => {
32
- Logger.debug('getByTransferId ' + transferId.toString())
32
+ Logger.isDebugEnabled && Logger.debug('getByTransferId ' + transferId.toString())
33
33
  try {
34
- return await Db.transferFulfilment.find({ transferId: transferId })
34
+ return await Db.from('transferFulfilment').find({ transferId })
35
35
  } catch (err) {
36
36
  throw ErrorHandler.Factory.reformatFSPIOPError(err)
37
37
  }
38
38
  }
39
39
 
40
40
  const saveTransferFulfilment = async (record) => {
41
- Logger.debug('save transferFulfilment ' + record.toString())
41
+ Logger.isDebugEnabled && Logger.debug('save transferFulfilment ' + record.toString())
42
42
  try {
43
- return await Db.transferFulfilment.insert(record)
43
+ return await Db.from('transferFulfilment').insert(record)
44
44
  } catch (err) {
45
- Logger.error(err)
45
+ Logger.isErrorEnabled && Logger.error(err)
46
46
  throw ErrorHandler.Factory.reformatFSPIOPError(err)
47
47
  }
48
48
  }
@@ -44,9 +44,9 @@ const ErrorHandler = require('@mojaloop/central-services-error-handling')
44
44
  */
45
45
 
46
46
  const getTransferFulfilmentDuplicateCheck = async (transferId) => {
47
- Logger.debug(`get transferFulfilmentDuplicateCheck (transferId=${transferId})`)
47
+ Logger.isDebugEnabled && Logger.debug(`get transferFulfilmentDuplicateCheck (transferId=${transferId})`)
48
48
  try {
49
- return Db.transferFulfilmentDuplicateCheck.findOne({ transferId })
49
+ return Db.from('transferFulfilmentDuplicateCheck').findOne({ transferId })
50
50
  } catch (err) {
51
51
  throw new Error(err.message)
52
52
  }
@@ -65,9 +65,9 @@ const getTransferFulfilmentDuplicateCheck = async (transferId) => {
65
65
  */
66
66
 
67
67
  const saveTransferFulfilmentDuplicateCheck = async (transferId, hash) => {
68
- Logger.debug(`save transferFulfilmentDuplicateCheck (transferId=${transferId}, hash=${hash})`)
68
+ Logger.isDebugEnabled && Logger.debug(`save transferFulfilmentDuplicateCheck (transferId=${transferId}, hash=${hash})`)
69
69
  try {
70
- return Db.transferFulfilmentDuplicateCheck.insert({ transferId, hash })
70
+ return Db.from('transferFulfilmentDuplicateCheck').insert({ transferId, hash })
71
71
  } catch (err) {
72
72
  throw ErrorHandler.Factory.reformatFSPIOPError(err)
73
73
  }
@@ -28,11 +28,11 @@ const Db = require('../../lib/db')
28
28
  const Logger = require('@mojaloop/central-services-logger')
29
29
 
30
30
  const saveTransferParticipant = async (record) => {
31
- Logger.debug('save transferParticipant' + record.toString())
31
+ Logger.isDebugEnabled && Logger.debug('save transferParticipant' + record.toString())
32
32
  try {
33
- return await Db.transferParticipant.insert(record)
33
+ return await Db.from('transferParticipant').insert(record)
34
34
  } catch (err) {
35
- Logger.error(err)
35
+ Logger.isErrorEnabled && Logger.error(err)
36
36
  throw err
37
37
  }
38
38
  }
@@ -30,18 +30,18 @@ const Db = require('../../lib/db')
30
30
  const Logger = require('@mojaloop/central-services-logger')
31
31
 
32
32
  const saveTransferStateChange = async (stateChange) => {
33
- Logger.debug('save transferStateChange' + stateChange.toString())
33
+ Logger.isDebugEnabled && Logger.debug('save transferStateChange' + stateChange.toString())
34
34
  try {
35
- return Db.transferStateChange.insert(stateChange)
35
+ return Db.from('transferStateChange').insert(stateChange)
36
36
  } catch (err) {
37
- Logger.error(err)
37
+ Logger.isErrorEnabled && Logger.error(err)
38
38
  throw err
39
39
  }
40
40
  }
41
41
 
42
42
  const getByTransferId = async (id) => {
43
43
  try {
44
- return await Db.transferStateChange.query(async (builder) => {
44
+ return await Db.from('transferStateChange').query(async (builder) => {
45
45
  const result = builder
46
46
  .where({ 'transferStateChange.transferId': id })
47
47
  .select('transferStateChange.*')
@@ -50,43 +50,43 @@ const getByTransferId = async (id) => {
50
50
  return result
51
51
  })
52
52
  } catch (err) {
53
- Logger.error(err)
53
+ Logger.isErrorEnabled && Logger.error(err)
54
54
  throw err
55
55
  }
56
56
  }
57
57
 
58
58
  const getByTransferIdList = async (transfersIdList) => {
59
59
  try {
60
- return await Db.transferStateChange.query(async (builder) => {
60
+ return await Db.from('transferStateChange').query(async (builder) => {
61
61
  const result = builder
62
62
  .whereIn('transferStateChange.transferId', transfersIdList)
63
63
  return result
64
64
  })
65
65
  } catch (err) {
66
- Logger.error(err)
66
+ Logger.isErrorEnabled && Logger.error(err)
67
67
  throw err
68
68
  }
69
69
  }
70
70
 
71
71
  const getLatest = async () => {
72
72
  try {
73
- return await Db.transferStateChange.query(async (builder) => {
73
+ return await Db.from('transferStateChange').query(async (builder) => {
74
74
  return builder
75
75
  .select('transferStateChangeId')
76
76
  .orderBy('transferStateChangeId', 'desc')
77
77
  .first()
78
78
  })
79
79
  } catch (err) {
80
- Logger.error(err)
80
+ Logger.isErrorEnabled && Logger.error(err)
81
81
  throw err
82
82
  }
83
83
  }
84
84
 
85
85
  const truncate = async () => {
86
86
  try {
87
- return await Db.transferStateChange.truncate()
87
+ return await Db.from('transferStateChange').truncate()
88
88
  } catch (err) {
89
- Logger.error(err)
89
+ Logger.isErrorEnabled && Logger.error(err)
90
90
  throw err
91
91
  }
92
92
  }
@@ -30,14 +30,14 @@ const Enum = require('@mojaloop/central-services-shared').Enum
30
30
  const TS = Enum.Transfers.TransferInternalState
31
31
 
32
32
  const cleanup = async () => {
33
- Logger.debug('cleanup transferTimeout')
33
+ Logger.isDebugEnabled && Logger.debug('cleanup transferTimeout')
34
34
  try {
35
35
  const knex = await Db.getKnex()
36
36
 
37
- const ttIdList = await Db.transferTimeout.query(async (builder) => {
37
+ const ttIdList = await Db.from('transferTimeout').query(async (builder) => {
38
38
  const b = await builder
39
39
  .whereIn('tsc.transferStateId', [`${TS.RECEIVED_FULFIL}`, `${TS.COMMITTED}`, `${TS.FAILED}`, `${TS.RESERVED_TIMEOUT}`,
40
- `${TS.RECEIVED_REJECT}`, `${TS.EXPIRED_PREPARED}`, `${TS.EXPIRED_RESERVED}`, `${TS.ABORTED_REJECTED}`])
40
+ `${TS.RECEIVED_REJECT}`, `${TS.EXPIRED_PREPARED}`, `${TS.EXPIRED_RESERVED}`, `${TS.ABORTED_REJECTED}`, `${TS.ABORTED_ERROR}`])
41
41
  .innerJoin(
42
42
  knex('transferTimeout AS tt1')
43
43
  .select('tsc1.transferId')
@@ -50,7 +50,7 @@ const cleanup = async () => {
50
50
  return b
51
51
  })
52
52
 
53
- await Db.transferTimeout.query(async (builder) => {
53
+ await Db.from('transferTimeout').query(async (builder) => {
54
54
  const b = await builder
55
55
  .whereIn('transferTimeout.transferTimeoutId', ttIdList.map(elem => elem.transferTimeoutId))
56
56
  .del()
@@ -58,7 +58,7 @@ const cleanup = async () => {
58
58
  })
59
59
  return ttIdList
60
60
  } catch (err) {
61
- Logger.error(err)
61
+ Logger.isErrorEnabled && Logger.error(err)
62
62
  throw err
63
63
  }
64
64
  }
@@ -116,12 +116,12 @@ bulkTransferSchema.pre('save', function () {
116
116
  })
117
117
  await individualTransfer.save()
118
118
  } catch (err) {
119
- Logger.error(err)
119
+ Logger.isErrorEnabled && Logger.error(err)
120
120
  throw err
121
121
  }
122
122
  })
123
123
  } catch (err) {
124
- Logger.error(err)
124
+ Logger.isErrorEnabled && Logger.error(err)
125
125
  throw err
126
126
  }
127
127
  })
@@ -202,12 +202,12 @@ bulkTransferResponseSchema.pre('save', function () {
202
202
  })
203
203
  await individualTransferResult.save()
204
204
  } catch (err) {
205
- Logger.error(err)
205
+ Logger.isErrorEnabled && Logger.error(err)
206
206
  throw err
207
207
  }
208
208
  })
209
209
  } catch (err) {
210
- Logger.error(err)
210
+ Logger.isErrorEnabled && Logger.error(err)
211
211
  throw err
212
212
  }
213
213
  })
@@ -1,21 +1,22 @@
1
1
  'use strict'
2
2
 
3
- const Package = require('../../package')
3
+ const Path = require('path')
4
4
  const Inert = require('@hapi/inert')
5
5
  const Vision = require('@hapi/vision')
6
6
  const Blipp = require('blipp')
7
7
  const ErrorHandling = require('@mojaloop/central-services-error-handling')
8
+ const APIDocumentation = require('@mojaloop/central-services-shared').Util.Hapi.APIDocumentation
9
+ const Config = require('../lib/config')
8
10
 
9
11
  const registerPlugins = async (server) => {
10
- await server.register({
11
- plugin: require('hapi-swagger'),
12
- options: {
13
- info: {
14
- title: 'Central Ledger API Documentation',
15
- version: Package.version
12
+ if (Config.API_DOC_ENDPOINTS_ENABLED) {
13
+ await server.register({
14
+ plugin: APIDocumentation,
15
+ options: {
16
+ documentPath: Path.resolve(__dirname, '../api/interface/swagger.json')
16
17
  }
17
- }
18
- })
18
+ })
19
+ }
19
20
 
20
21
  await server.register({
21
22
  plugin: require('@hapi/good'),
@@ -36,10 +36,9 @@
36
36
  const Hapi = require('@hapi/hapi')
37
37
  const Migrator = require('../lib/migrator')
38
38
  const Db = require('../lib/db')
39
- const ObjStoreDb = require('@mojaloop/central-object-store').Db
39
+ const ObjStoreDb = require('@mojaloop/object-store-lib').Db
40
40
  const Plugins = require('./plugins')
41
41
  const Config = require('../lib/config')
42
- const Sidecar = require('../lib/sidecar')
43
42
  const RequestLogger = require('../lib/requestLogger')
44
43
  const Uuid = require('uuid4')
45
44
  const UrlParser = require('../lib/urlParser')
@@ -48,23 +47,34 @@ const RegisterHandlers = require('../handlers/register')
48
47
  const Metrics = require('@mojaloop/central-services-metrics')
49
48
  const ErrorHandler = require('@mojaloop/central-services-error-handling')
50
49
  const Cache = require('../lib/cache')
50
+ const EnumCached = require('../lib/enumCached')
51
51
  const ParticipantCached = require('../models/participant/participantCached')
52
52
  const ParticipantCurrencyCached = require('../models/participant/participantCurrencyCached')
53
+ const ParticipantLimitCached = require('../models/participant/participantLimitCached')
53
54
 
54
55
  const migrate = (runMigrations) => {
55
56
  return runMigrations ? Migrator.migrate() : true
56
57
  }
58
+
57
59
  const connectDatabase = async () => {
58
- return Db.connect(Config.DATABASE)
60
+ Logger.isDebugEnabled && Logger.debug(`Connecting to DB ${JSON.stringify(Config.DATABASE)}`)
61
+ await Db.connect(Config.DATABASE)
62
+ const dbLoadedTables = Db._tables ? Db._tables.length : -1
63
+ Logger.isDebugEnabled && Logger.debug(`DB.connect loaded '${dbLoadedTables}' tables!`)
59
64
  }
65
+
60
66
  const connectMongoose = async () => {
61
67
  if (!Config.MONGODB_DISABLED) {
62
68
  try {
69
+ if (Config.MONGODB_DEBUG) {
70
+ Logger.isWarnEnabled && Logger.warn('Enabling debug for Mongoose...')
71
+ ObjStoreDb.Mongoose.set('debug', Config.MONGODB_DEBUG) // enable debug
72
+ }
63
73
  return ObjStoreDb.connect(Config.MONGODB_URI)
64
74
  } catch (err) {
65
75
  throw ErrorHandler.Factory.reformatFSPIOPError(err)
66
76
  // TODO: review as code is being changed from returning null to returning a FSPIOPError
67
- // Logger.error(`error - ${err}`)
77
+ // Logger.isErrorEnabled && Logger.error(`error - ${err}`)
68
78
  // return null
69
79
  }
70
80
  } else {
@@ -94,8 +104,8 @@ const createServer = (port, modules) => {
94
104
  }
95
105
  }
96
106
  })
97
- server.ext('onRequest', function (request, h) {
98
- const transferId = UrlParser.idFromTransferUri(`${Config.HOSTNAME}${request.url.path}`)
107
+ server.ext('onPostAuth', function (request, h) {
108
+ const transferId = UrlParser.idFromTransferUri(`${Config.HOSTNAME}${request.path}`)
99
109
  request.headers.traceid = request.headers.traceid || transferId || Uuid()
100
110
  RequestLogger.logRequest(request)
101
111
  return h.continue
@@ -107,7 +117,7 @@ const createServer = (port, modules) => {
107
117
  await Plugins.registerPlugins(server)
108
118
  await server.register(modules)
109
119
  await server.start()
110
- Logger.info('Server running at: ', server.info.uri)
120
+ Logger.isInfoEnabled && Logger.info(`Server running at: ${server.info.uri}`)
111
121
  return server
112
122
  })()
113
123
  }
@@ -133,17 +143,17 @@ const createHandlers = async (handlers) => {
133
143
  ext: {},
134
144
  start: new Date(),
135
145
  info: {},
136
- handlers: handlers
146
+ handlers
137
147
  }
138
148
 
139
149
  for (const handler of handlers) {
140
150
  if (handler.enabled) {
141
- Logger.info(`Handler Setup - Registering ${JSON.stringify(handler)}!`)
151
+ Logger.isInfoEnabled && Logger.info(`Handler Setup - Registering ${JSON.stringify(handler)}!`)
142
152
  switch (handler.type) {
143
153
  case 'prepare': {
144
154
  await RegisterHandlers.transfers.registerPrepareHandler()
145
155
  // if (!Config.HANDLERS_CRON_DISABLED) {
146
- // Logger.info('Starting Kafka Cron Jobs...')
156
+ // Logger.isInfoEnabled && Logger.info('Starting Kafka Cron Jobs...')
147
157
  // await KafkaCron.start('prepare')
148
158
  // }
149
159
  break
@@ -151,7 +161,7 @@ const createHandlers = async (handlers) => {
151
161
  case 'position': {
152
162
  await RegisterHandlers.positions.registerPositionHandler()
153
163
  // if (!Config.HANDLERS_CRON_DISABLED) {
154
- // Logger.info('Starting Kafka Cron Jobs...')
164
+ // Logger.isInfoEnabled && Logger.info('Starting Kafka Cron Jobs...')
155
165
  // await KafkaCron.start('position')
156
166
  // }
157
167
  break
@@ -184,9 +194,13 @@ const createHandlers = async (handlers) => {
184
194
  await RegisterHandlers.bulk.registerBulkProcessingHandler()
185
195
  break
186
196
  }
197
+ case 'bulkget': {
198
+ await RegisterHandlers.bulk.registerBulkGetHandler()
199
+ break
200
+ }
187
201
  default: {
188
202
  const error = `Handler Setup - ${JSON.stringify(handler)} is not a valid handler to register!`
189
- Logger.error(error)
203
+ Logger.isErrorEnabled && Logger.error(error)
190
204
  throw new Error(error)
191
205
  }
192
206
  }
@@ -203,9 +217,11 @@ const initializeInstrumentation = () => {
203
217
  }
204
218
 
205
219
  const initializeCache = async () => {
206
- await Cache.initCache()
220
+ await EnumCached.initialize()
207
221
  await ParticipantCached.initialize()
208
222
  await ParticipantCurrencyCached.initialize()
223
+ await ParticipantLimitCached.initialize()
224
+ await Cache.initCache()
209
225
  }
210
226
 
211
227
  /**
@@ -228,45 +244,52 @@ const initializeCache = async () => {
228
244
  * @returns {object} Returns HTTP Server object
229
245
  */
230
246
  const initialize = async function ({ service, port, modules = [], runMigrations = false, runHandlers = false, handlers = [] }) {
231
- await migrate(runMigrations)
232
- await connectDatabase()
233
- await connectMongoose()
234
- await initializeCache()
235
- await Sidecar.connect(service)
236
- initializeInstrumentation()
237
- let server
238
- switch (service) {
239
- case 'api':
240
- case 'admin': {
241
- server = await createServer(port, modules)
242
- break
243
- }
244
- case 'handler': {
245
- if (!Config.HANDLERS_API_DISABLED) {
247
+ try {
248
+ initializeInstrumentation()
249
+ await migrate(runMigrations)
250
+ await connectDatabase()
251
+ await connectMongoose()
252
+ await initializeCache()
253
+
254
+ let server
255
+ switch (service) {
256
+ case 'api':
257
+ case 'admin': {
246
258
  server = await createServer(port, modules)
259
+ break
260
+ }
261
+ case 'handler': {
262
+ if (!Config.HANDLERS_API_DISABLED) {
263
+ server = await createServer(port, modules)
264
+ }
265
+ break
266
+ }
267
+ default: {
268
+ Logger.isErrorEnabled && Logger.error(`No valid service type ${service} found!`)
269
+ throw ErrorHandler.Factory.createInternalServerFSPIOPError(`No valid service type ${service} found!`)
247
270
  }
248
- break
249
- }
250
- default: {
251
- Logger.error(`No valid service type ${service} found!`)
252
- throw ErrorHandler.Factory.createInternalServerFSPIOPError(`No valid service type ${service} found!`)
253
271
  }
254
- }
255
272
 
256
- if (runHandlers) {
257
- if (Array.isArray(handlers) && handlers.length > 0) {
258
- await createHandlers(handlers)
259
- } else {
260
- await RegisterHandlers.registerAllHandlers()
261
- // if (!Config.HANDLERS_CRON_DISABLED) {
262
- // Logger.info('Starting Kafka Cron Jobs...')
263
- // // await KafkaCron.start('prepare')
264
- // await KafkaCron.start('position')
265
- // }
273
+ if (runHandlers) {
274
+ if (Array.isArray(handlers) && handlers.length > 0) {
275
+ await createHandlers(handlers)
276
+ } else {
277
+ await RegisterHandlers.registerAllHandlers()
278
+ // if (!Config.HANDLERS_CRON_DISABLED) {
279
+ // Logger.isInfoEnabled && Logger.info('Starting Kafka Cron Jobs...')
280
+ // // await KafkaCron.start('prepare')
281
+ // await KafkaCron.start('position')
282
+ // }
283
+ }
266
284
  }
267
- }
268
285
 
269
- return server
286
+ return server
287
+ } catch (err) {
288
+ Logger.isErrorEnabled && Logger.error(`Error while initializing ${err}`)
289
+
290
+ await Db.disconnect()
291
+ process.exit(1)
292
+ }
270
293
  }
271
294
 
272
295
  module.exports = {
@@ -37,6 +37,7 @@ const Config = require('../../../../src/lib/config')
37
37
  const ParticipantService = require('../../../../src/domain/participant')
38
38
  const ParticipantCached = require('../../../../src/models/participant/participantCached')
39
39
  const ParticipantCurrencyCached = require('../../../../src/models/participant/participantCurrencyCached')
40
+ const ParticipantLimitCached = require('../../../../src/models/participant/participantLimitCached')
40
41
  const ParticipantHelper = require('../../helpers/participant')
41
42
  const ParticipantEndpointHelper = require('../../helpers/participantEndpoint')
42
43
  const ParticipantLimitHelper = require('../../helpers/participantLimit')
@@ -67,6 +68,7 @@ Test('Participant service', async (participantTest) => {
67
68
  await Db.connect(Config.DATABASE)
68
69
  await ParticipantCached.initialize()
69
70
  await ParticipantCurrencyCached.initialize()
71
+ await ParticipantLimitCached.initialize()
70
72
  await Cache.initCache()
71
73
  test.pass()
72
74
  test.end()