account-lookup-service 15.5.0-iso.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (209) hide show
  1. package/.circleci/config.yml +11 -0
  2. package/.ncurc.yaml +6 -0
  3. package/.nvmrc +1 -0
  4. package/.nycrc.yml +20 -0
  5. package/.versionrc +15 -0
  6. package/CHANGELOG.md +330 -0
  7. package/CODEOWNERS +38 -0
  8. package/Dockerfile +45 -0
  9. package/LICENSE.md +10 -0
  10. package/README.md +252 -0
  11. package/audit-ci.jsonc +32 -0
  12. package/audit-resolve.json +161 -0
  13. package/config/default.json +109 -0
  14. package/config/knexfile.js +21 -0
  15. package/docker/account-lookup-service/default.json +106 -0
  16. package/docker/account-lookup-service/make-default-json.sh +5 -0
  17. package/docker/account-lookup-service/override.json +15 -0
  18. package/docker/central-ledger/default.json +458 -0
  19. package/docker/config-modifier/account-lookup-service.js +31 -0
  20. package/docker/kafka/consumer.properties +26 -0
  21. package/docker/kafka/producer.properties +45 -0
  22. package/docker/kafka/server.properties +143 -0
  23. package/docker/kafka/tools-log4j.properties +21 -0
  24. package/docker/mock-proxy/Dockerfile +15 -0
  25. package/docker/mock-proxy/package-lock.json +4986 -0
  26. package/docker/mock-proxy/package.json +24 -0
  27. package/docker/mock-proxy/src/config.ts +14 -0
  28. package/docker/mock-proxy/src/server.ts +94 -0
  29. package/docker/mock-proxy/src/utils.ts +29 -0
  30. package/docker/mock-proxy/tsconfig.json +24 -0
  31. package/docker/sql-init/01_permissions.sql +2 -0
  32. package/docker/sql-init-central-ledger/01_permissions.sql +2 -0
  33. package/docker/wait-for/wait-for-account-lookup-service.sh +10 -0
  34. package/docker/wait-for/wait-for-central-ledger.sh +11 -0
  35. package/docker/wait-for/wait-for-kafka.sh +7 -0
  36. package/docker/wait-for/wait-for-ml-api-adapter.sh +9 -0
  37. package/docker/wait-for/wait-for-mockserver.sh +20 -0
  38. package/docker/wait-for/wait-for-mysql-als.sh +14 -0
  39. package/docker/wait-for/wait-for-mysql-central-ledger.sh +11 -0
  40. package/docker/wait-for/wait-for-mysql.sh +11 -0
  41. package/docker/wait-for/wait-for-objstore.sh +12 -0
  42. package/docker/wait-for/wait-for.env +18 -0
  43. package/docker/wait-for/wait-for.sh +81 -0
  44. package/docker-compose.integration.yml +29 -0
  45. package/docker-compose.yml +243 -0
  46. package/jest-int.config.js +8 -0
  47. package/jest.config.js +16 -0
  48. package/jsdoc.json +38 -0
  49. package/migrations/01_currency.js +42 -0
  50. package/migrations/02_endpointType.js +43 -0
  51. package/migrations/03_endpointType-indexes.js +37 -0
  52. package/migrations/04_partyIdType.js +43 -0
  53. package/migrations/05_partyIdType-indexes.js +38 -0
  54. package/migrations/08_oracleEndpoint.js +51 -0
  55. package/migrations/09_oracleEndpoint-indexes.js +41 -0
  56. package/migrations/10_oracleEndpoint-remove-constraints.js +38 -0
  57. package/package.json +180 -0
  58. package/scripts/_wait4_all.js +143 -0
  59. package/scripts/test-functional.sh +76 -0
  60. package/secrets/jwsSigningKey.key +27 -0
  61. package/seeds/currency.js +765 -0
  62. package/seeds/endpointType.js +65 -0
  63. package/seeds/partyIdType.js +79 -0
  64. package/src/api/endpointcache.js +67 -0
  65. package/src/api/health.js +66 -0
  66. package/src/api/index.js +85 -0
  67. package/src/api/oracles/{ID}.js +100 -0
  68. package/src/api/oracles.js +96 -0
  69. package/src/api/participants/{ID}/error.js +44 -0
  70. package/src/api/participants/{ID}.js +44 -0
  71. package/src/api/participants/{Type}/{ID}/error.js +74 -0
  72. package/src/api/participants/{Type}/{ID}/{SubId}/error.js +68 -0
  73. package/src/api/participants/{Type}/{ID}/{SubId}.js +113 -0
  74. package/src/api/participants/{Type}/{ID}.js +133 -0
  75. package/src/api/participants.js +63 -0
  76. package/src/api/parties/{Type}/{ID}/error.js +66 -0
  77. package/src/api/parties/{Type}/{ID}/{SubId}/error.js +56 -0
  78. package/src/api/parties/{Type}/{ID}/{SubId}.js +77 -0
  79. package/src/api/parties/{Type}/{ID}.js +98 -0
  80. package/src/api/routes.js +294 -0
  81. package/src/constants.js +16 -0
  82. package/src/domain/oracle/index.js +33 -0
  83. package/src/domain/oracle/oracle.js +234 -0
  84. package/src/domain/participants/index.js +35 -0
  85. package/src/domain/participants/participants.js +560 -0
  86. package/src/domain/parties/getPartiesByTypeAndID.js +239 -0
  87. package/src/domain/parties/index.js +32 -0
  88. package/src/domain/parties/parties.js +215 -0
  89. package/src/domain/parties/utils.js +84 -0
  90. package/src/domain/timeout/dto.js +48 -0
  91. package/src/domain/timeout/index.js +104 -0
  92. package/src/handlers/TimeoutHandler.js +94 -0
  93. package/src/handlers/index.js +70 -0
  94. package/src/handlers/monitoring/index.js +51 -0
  95. package/src/handlers/monitoring/plugins/health.js +61 -0
  96. package/src/handlers/monitoring/plugins/metrics.js +48 -0
  97. package/src/handlers/register.js +102 -0
  98. package/src/index.js +66 -0
  99. package/src/interface/admin-swagger.yaml +804 -0
  100. package/src/interface/admin_swagger.json +959 -0
  101. package/src/interface/api-swagger-iso20022-parties.yaml +1734 -0
  102. package/src/interface/api-swagger.yaml +1733 -0
  103. package/src/interface/api_swagger.json +3046 -0
  104. package/src/interface/fspiop-rest-v2.0-ISO20022_parties.yaml +2256 -0
  105. package/src/interface/thirdparty/admin-swagger.yaml +808 -0
  106. package/src/interface/thirdparty/admin_swagger.json +961 -0
  107. package/src/interface/thirdparty/api-swagger.yaml +1739 -0
  108. package/src/interface/thirdparty/api_swagger.json +3142 -0
  109. package/src/lib/argv.js +39 -0
  110. package/src/lib/cache.js +126 -0
  111. package/src/lib/config.js +183 -0
  112. package/src/lib/db.js +26 -0
  113. package/src/lib/headers.js +53 -0
  114. package/src/lib/healthCheck/subServiceHealth.js +84 -0
  115. package/src/lib/index.js +11 -0
  116. package/src/lib/migrator.js +17 -0
  117. package/src/lib/requestLogger.js +54 -0
  118. package/src/lib/util.js +66 -0
  119. package/src/metrics/handler.js +33 -0
  120. package/src/metrics/plugin.js +52 -0
  121. package/src/metrics/routes.js +43 -0
  122. package/src/models/currency/currency.js +48 -0
  123. package/src/models/currency/index.js +32 -0
  124. package/src/models/endpointType/endpointType.js +48 -0
  125. package/src/models/endpointType/index.js +32 -0
  126. package/src/models/misc/migrationLock.js +49 -0
  127. package/src/models/oracle/facade.js +341 -0
  128. package/src/models/oracle/index.js +41 -0
  129. package/src/models/oracle/oracleEndpoint.js +192 -0
  130. package/src/models/oracle/oracleEndpointCached.js +108 -0
  131. package/src/models/participantEndpoint/facade.js +238 -0
  132. package/src/models/partyIdType/index.js +32 -0
  133. package/src/models/partyIdType/partyIdType.js +41 -0
  134. package/src/plugins.js +139 -0
  135. package/src/server.js +199 -0
  136. package/test/fixtures/index.js +131 -0
  137. package/test/fixtures/iso.js +110 -0
  138. package/test/integration/.env +8 -0
  139. package/test/integration/api/parties.test.js +137 -0
  140. package/test/integration/constants.js +20 -0
  141. package/test/integration/domain/oracle/index.test.js +324 -0
  142. package/test/integration/domain/timeout/index.test.js +75 -0
  143. package/test/integration/env.sh +15 -0
  144. package/test/integration/example.test.js +12 -0
  145. package/test/integration/models/currency/currency.test.js +68 -0
  146. package/test/integration/plugins.test.js +62 -0
  147. package/test/integration/prepareTestParticipants.js +30 -0
  148. package/test/integration/setup.js +5 -0
  149. package/test/integration-config.json +81 -0
  150. package/test/integration-runner.sh +108 -0
  151. package/test/unit/api/health.test.js +142 -0
  152. package/test/unit/api/oracles/{ID}.test.js +264 -0
  153. package/test/unit/api/oracles.test.js +173 -0
  154. package/test/unit/api/participants/participants.test.js +117 -0
  155. package/test/unit/api/participants/{Type}/{ID}/error.test.js +155 -0
  156. package/test/unit/api/participants/{Type}/{ID}/{SubId}/error.test.js +131 -0
  157. package/test/unit/api/participants/{Type}/{ID}/{SubId}.test.js +377 -0
  158. package/test/unit/api/participants/{Type}/{ID}.test.js +383 -0
  159. package/test/unit/api/participants.test.js +108 -0
  160. package/test/unit/api/parties/endpointcache.test.js +83 -0
  161. package/test/unit/api/parties/parties.test.js +102 -0
  162. package/test/unit/api/parties/{Type}/{ID}/error.test.js +145 -0
  163. package/test/unit/api/parties/{Type}/{ID}/{SubId}/error.test.js +141 -0
  164. package/test/unit/api/parties/{Type}/{ID}/{SubId}.test.js +241 -0
  165. package/test/unit/api/parties/{Type}/{ID}.test.js +240 -0
  166. package/test/unit/domain/oracle/oracle.test.js +505 -0
  167. package/test/unit/domain/participants/participants.test.js +1724 -0
  168. package/test/unit/domain/parties/parties.test.js +940 -0
  169. package/test/unit/domain/timeout/dto.test.js +28 -0
  170. package/test/unit/domain/timeout/index.test.js +81 -0
  171. package/test/unit/handlers/TimeoutHandler.test.js +125 -0
  172. package/test/unit/handlers/index.test.js +56 -0
  173. package/test/unit/handlers/register.test.js +90 -0
  174. package/test/unit/index.test.js +139 -0
  175. package/test/unit/iso20022/partiesValidation.test.js +129 -0
  176. package/test/unit/lib/TransformFacades.test.js +18 -0
  177. package/test/unit/lib/argv.test.js +40 -0
  178. package/test/unit/lib/cache.test.js +172 -0
  179. package/test/unit/lib/config.test.js +108 -0
  180. package/test/unit/lib/healthCheck/subServiceHealth.test.js +89 -0
  181. package/test/unit/lib/migrator.test.js +52 -0
  182. package/test/unit/lib/requestLogger.test.js +115 -0
  183. package/test/unit/lib/util.test.js +68 -0
  184. package/test/unit/mocks.js +66 -0
  185. package/test/unit/models/currency/currency.test.js +91 -0
  186. package/test/unit/models/endpointType/endpointType.test.js +69 -0
  187. package/test/unit/models/misc/migrationLock.test.js +96 -0
  188. package/test/unit/models/oracle/facade.test.js +546 -0
  189. package/test/unit/models/oracle/oracleEndpoint.test.js +409 -0
  190. package/test/unit/models/oracle/oracleEndpointCached.test.js +153 -0
  191. package/test/unit/models/participantEndpoint/facade.test.js +295 -0
  192. package/test/unit/models/partyIdType/partyIdType.test.js +88 -0
  193. package/test/unit/plugins.test.js +89 -0
  194. package/test/unit/setup.js +7 -0
  195. package/test/util/apiClients/AlsApiClient.js +44 -0
  196. package/test/util/apiClients/BasicApiClient.js +34 -0
  197. package/test/util/apiClients/ProxyApiClient.js +25 -0
  198. package/test/util/apiClients/index.js +7 -0
  199. package/test/util/helper.js +332 -0
  200. package/test/util/index.js +11 -0
  201. package/test/util/mockgen.js +43 -0
  202. package/test/util/onboarding.js +132 -0
  203. package/test/util/scripts/addAlsDb.sh +33 -0
  204. package/test/util/scripts/configureMockServer.sh +35 -0
  205. package/test/util/scripts/env.sh +19 -0
  206. package/test/util/scripts/populateTestData.sh +62 -0
  207. package/test/util/scripts/startMockCentralServer.sh +45 -0
  208. package/test/util/scripts/startMockOracleServer.sh +45 -0
  209. package/test/util/testConfig.js +44 -0
@@ -0,0 +1,65 @@
1
+ /*****
2
+ License
3
+ --------------
4
+ Copyright © 2017 Bill & Melinda Gates Foundation
5
+ The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at
6
+ http://www.apache.org/licenses/LICENSE-2.0
7
+ Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
8
+ Contributors
9
+ --------------
10
+ This is the official list of the Mojaloop project contributors for this file.
11
+ Names of the original copyright holders (individuals or organizations)
12
+ should be listed with a '*' in the first column. People who have
13
+ contributed from an organization can be listed under the organization
14
+ that actually holds the copyright for their contributions (see the
15
+ Gates Foundation organization for an example). Those individuals should have
16
+ their names indented and be marked with a '-'. Email address can be added
17
+ optionally within square brackets <email>.
18
+ * Gates Foundation
19
+
20
+ * Rajiv Mothilal <rajiv.mothilal@modusbox.com>
21
+
22
+ --------------
23
+ ******/
24
+ 'use strict'
25
+
26
+ const { FspEndpointTypes } = require('@mojaloop/central-services-shared').Enum.EndPoints
27
+
28
+ const endpointTypes = [
29
+ {
30
+ type: 'URL',
31
+ description: 'REST URLs'
32
+ },
33
+ {
34
+ type: FspEndpointTypes.FSPIOP_CALLBACK_URL_PARTICIPANT_PUT,
35
+ description: 'Participant callback URL to which put participant information can be sent'
36
+ },
37
+ {
38
+ type: FspEndpointTypes.FSPIOP_CALLBACK_URL_PARTICIPANT_PUT_ERROR,
39
+ description: 'Participant callback URL to which put participant error information can be sent'
40
+ },
41
+ {
42
+ type: FspEndpointTypes.FSPIOP_CALLBACK_URL_PARTIES_GET,
43
+ description: 'Parties callback URL to which get parties information can be requested'
44
+ },
45
+ {
46
+ type: FspEndpointTypes.FSPIOP_CALLBACK_URL_PARTIES_PUT,
47
+ description: 'Parties callback URL to which put parties information can be sent'
48
+ },
49
+ {
50
+ type: FspEndpointTypes.FSPIOP_CALLBACK_URL_PARTIES_PUT_ERROR,
51
+ description: 'Parties callback URL to which put participant error information can be sent'
52
+ }
53
+ ]
54
+
55
+ exports.seed = async function (knex) {
56
+ try {
57
+ return await knex('endpointType').insert(endpointTypes)
58
+ } catch (err) {
59
+ if (err.code === 'ER_DUP_ENTRY') return -1001
60
+ else {
61
+ console.log(`Uploading seeds for endpointType has failed with the following error: ${err}`)
62
+ return -1000
63
+ }
64
+ }
65
+ }
@@ -0,0 +1,79 @@
1
+ /*****
2
+ License
3
+ --------------
4
+ Copyright © 2017 Bill & Melinda Gates Foundation
5
+ The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at
6
+ http://www.apache.org/licenses/LICENSE-2.0
7
+ Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
8
+ Contributors
9
+ --------------
10
+ This is the official list of the Mojaloop project contributors for this file.
11
+ Names of the original copyright holders (individuals or organizations)
12
+ should be listed with a '*' in the first column. People who have
13
+ contributed from an organization can be listed under the organization
14
+ that actually holds the copyright for their contributions (see the
15
+ Gates Foundation organization for an example). Those individuals should have
16
+ their names indented and be marked with a '-'. Email address can be added
17
+ optionally within square brackets <email>.
18
+ * Gates Foundation
19
+
20
+ * Rajiv Mothilal <rajiv.mothilal@modusbox.com>
21
+
22
+ --------------
23
+ ******/
24
+ 'use strict'
25
+
26
+ const partyIdTypes = [
27
+ {
28
+ name: 'MSISDN',
29
+ description: 'A MSISDN (Mobile Station International Subscriber Directory Number, that is, the phone number) is used as reference to a participant. The MSISDN identifier should be in international format according to the ITU-T E.164 standard. Optionally, the MSISDN may be prefixed by a single plus sign, indicating the international prefix.'
30
+ },
31
+ {
32
+ name: 'EMAIL',
33
+ description: 'An email is used as reference to a participant. The format of the email should be according to the informational RFC 3696.'
34
+ },
35
+ {
36
+ name: 'PERSONAL_ID',
37
+ description: 'A personal identifier is used as reference to a participant. Examples of personal identification are passport number, birth certificate number, and national registration number. The identifier number is added in the PartyIdentifier element. The personal identifier type is added in the PartySubIdOrType element.'
38
+ },
39
+ {
40
+ name: 'BUSINESS',
41
+ description: 'A specific Business (for example, an organization or a company) is used as reference to a participant. The BUSINESS identifier can be in any format. To make a transaction connected to a specific username or bill number in a Business, the PartySubIdOrType element should be used.'
42
+ },
43
+ {
44
+ name: 'DEVICE',
45
+ description: 'A specific device (for example, a POS or ATM) ID connected to a specific business or organization is used as reference to a Party. For referencing a specific device under a specific business or organization, use the PartySubIdOrType element.'
46
+ },
47
+ {
48
+ name: 'ACCOUNT_ID',
49
+ description: 'A bank account number or FSP account ID should be used as reference to a participant. The ACCOUNT_ID identifier can be in any format, as formats can greatly differ depending on country and FSP.'
50
+ },
51
+ {
52
+ name: 'IBAN',
53
+ description: 'A bank account number or FSP account ID is used as reference to a participant. The IBAN identifier can consist of up to 34 alphanumeric characters and should be entered without whitespace.'
54
+ },
55
+ {
56
+ name: 'ALIAS',
57
+ description: 'An alias is used as reference to a participant. The alias should be created in the FSP as an alternative reference to an account owner. Another example of an alias is a username in the FSP system. The ALIAS identifier can be in any format. It is also possible to use the PartySubIdOrType element for identifying an account under an Alias defined by the PartyIdentifier.'
58
+ },
59
+ {
60
+ name: 'CONSENT',
61
+ description: 'TBD'
62
+ },
63
+ {
64
+ name: 'THIRD_PARTY_LINK',
65
+ description: 'TBD'
66
+ }
67
+ ]
68
+
69
+ exports.seed = async function (knex) {
70
+ try {
71
+ return await knex('partyIdType').insert(partyIdTypes)
72
+ } catch (err) {
73
+ if (err.code === 'ER_DUP_ENTRY') return -1001
74
+ else {
75
+ console.log(`Uploading seeds for partyIdType has failed with the following error: ${err}`)
76
+ return -1000
77
+ }
78
+ }
79
+ }
@@ -0,0 +1,67 @@
1
+ /*****
2
+ License
3
+ --------------
4
+ Copyright © 2017 Bill & Melinda Gates Foundation
5
+ The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at
6
+ http://www.apache.org/licenses/LICENSE-2.0
7
+ Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
8
+ Contributors
9
+ --------------
10
+ This is the official list of the Mojaloop project contributors for this file.
11
+ Names of the original copyright holders (individuals or organizations)
12
+ should be listed with a '*' in the first column. People who have
13
+ contributed from an organization can be listed under the organization
14
+ that actually holds the copyright for their contributions (see the
15
+ Gates Foundation organization for an example). Those individuals should have
16
+ their names indented and be marked with a '-'. Email address can be added
17
+ optionally within square brackets <email>.
18
+ * Gates Foundation
19
+
20
+ * Juan Correa <juan.correa@modusbox.com>
21
+
22
+ --------------
23
+ ******/
24
+
25
+ 'use strict'
26
+
27
+ const ParticipantEndpointCache = require('@mojaloop/central-services-shared').Util.Endpoints
28
+ const Enum = require('@mojaloop/central-services-shared').Enum
29
+ const EventSdk = require('@mojaloop/event-sdk')
30
+ const Metrics = require('@mojaloop/central-services-metrics')
31
+ const Config = require('../lib/config.js')
32
+ const LibUtil = require('../lib/util.js')
33
+
34
+ /**
35
+ * Operations on /endpointcache
36
+ */
37
+ module.exports = {
38
+ /**
39
+ * summary: DELETE Endpoint Cache
40
+ * description: The HTTP request DELETE /endpointcache is used to reset the endpoint cache by performing an stopCache and initializeCache the Admin API.
41
+ * parameters:
42
+ * produces: application/json
43
+ * responses: 202, 400, 401, 403, 404, 405, 406, 501, 503
44
+ */
45
+ delete: async (context, request, h) => {
46
+ const histTimerEnd = Metrics.getHistogram(
47
+ 'ing_ResetParticipantEndpointCache',
48
+ 'Ingress: Reset endpoint cache',
49
+ ['success']
50
+ ).startTimer()
51
+ const span = request.span
52
+ const spanTags = LibUtil.getSpanTags(request, Enum.Events.Event.Type.ENDPOINTCACHE, Enum.Events.Event.Action.DELETE)
53
+ span.setTags(spanTags)
54
+ await span.audit({
55
+ headers: request.headers
56
+ }, EventSdk.AuditEventAction.start)
57
+ try {
58
+ await ParticipantEndpointCache.stopCache()
59
+ await ParticipantEndpointCache.initializeCache(Config.CENTRAL_SHARED_ENDPOINT_CACHE_CONFIG, LibUtil.hubNameConfig)
60
+ histTimerEnd({ success: true })
61
+ } catch (err) {
62
+ histTimerEnd({ success: false })
63
+ throw err
64
+ }
65
+ return h.response().code(202)
66
+ }
67
+ }
@@ -0,0 +1,66 @@
1
+ /*****
2
+ License
3
+ --------------
4
+ Copyright © 2017 Bill & Melinda Gates Foundation
5
+ The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at
6
+ http://www.apache.org/licenses/LICENSE-2.0
7
+ Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
8
+ Contributors
9
+ --------------
10
+ This is the official list of the Mojaloop project contributors for this file.
11
+ Names of the original copyright holders (individuals or organizations)
12
+ should be listed with a '*' in the first column. People who have
13
+ contributed from an organization can be listed under the organization
14
+ that actually holds the copyright for their contributions (see the
15
+ Gates Foundation organization for an example). Those individuals should have
16
+ their names indented and be marked with a '-'. Email address can be added
17
+ optionally within square brackets <email>.
18
+ * Gates Foundation
19
+
20
+ * Rajiv Mothilal <rajiv.mothilal@modusbox.com>
21
+ * Steven Oderayi <steven.oderayi@mousbox.com>
22
+ * Shashikant Hirugade <shashikant.hirugade@mousbox.com>
23
+
24
+ --------------
25
+ ******/
26
+
27
+ 'use strict'
28
+
29
+ const HealthCheck = require('@mojaloop/central-services-shared').HealthCheck.HealthCheck
30
+ const { getSubServiceHealthDatastore, getProxyCacheHealth } = require('../lib/healthCheck/subServiceHealth')
31
+ const packageJson = require('../../package.json')
32
+ const Config = require('../lib/config')
33
+
34
+ const getSubServices = (appConfig, isAdmin) => {
35
+ if (isAdmin) {
36
+ return [getSubServiceHealthDatastore]
37
+ }
38
+
39
+ const subServices = [getSubServiceHealthDatastore]
40
+ if (appConfig.PROXY_CACHE_CONFIG.enabled) {
41
+ subServices.push(getProxyCacheHealth)
42
+ }
43
+ return subServices
44
+ }
45
+
46
+ const healthCheck = new HealthCheck(packageJson, [])
47
+
48
+ /**
49
+ * Operations on /health
50
+ */
51
+ module.exports = {
52
+ /**
53
+ * summary: Get Oracles
54
+ * description: The HTTP request GET /health is used to return the current status of the API .
55
+ * parameters:
56
+ * produces: application/json
57
+ * responses: 200, 400, 401, 403, 404, 405, 406, 501, 503
58
+ */
59
+ get: async (context, request, h) => {
60
+ const { isAdmin, proxyCache } = request.server.app
61
+ healthCheck.serviceChecks = getSubServices(Config, isAdmin)
62
+ const health = await healthCheck.getHealth(proxyCache)
63
+ const statusCode = health.status !== 'OK' ? 503 : 200
64
+ return h.response(health).code(statusCode)
65
+ }
66
+ }
@@ -0,0 +1,85 @@
1
+ /*****
2
+ License
3
+ --------------
4
+ Copyright © 2017 Bill & Melinda Gates Foundation
5
+ The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at
6
+ http://www.apache.org/licenses/LICENSE-2.0
7
+ Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
8
+ Contributors
9
+ --------------
10
+ This is the official list of the Mojaloop project contributors for this file.
11
+ Names of the original copyright holders (individuals or organizations)
12
+ should be listed with a '*' in the first column. People who have
13
+ contributed from an organization can be listed under the organization
14
+ that actually holds the copyright for their contributions (see the
15
+ Gates Foundation organization for an example). Those individuals should have
16
+ their names indented and be marked with a '-'. Email address can be added
17
+ optionally within square brackets <email>.
18
+ * Gates Foundation
19
+
20
+ * ModusBox
21
+ - Rajiv Mothilal <rajiv.mothilal@modusbox.com>
22
+
23
+ --------------
24
+ ******/
25
+
26
+ 'use strict'
27
+
28
+ const OpenapiBackend = require('@mojaloop/central-services-shared').Util.OpenapiBackend
29
+
30
+ const participants = require('./participants')
31
+ const participantsId = require('./participants/{ID}')
32
+ const participantsErrorById = require('./participants/{ID}/error')
33
+ const participantsTypeId = require('./participants/{Type}/{ID}')
34
+ const participantsErrorTypeId = require('./participants/{Type}/{ID}/error')
35
+ const participantsTypeIdSubId = require('./participants/{Type}/{ID}/{SubId}')
36
+ const participantsErrorTypeIdSubId = require('./participants/{Type}/{ID}/{SubId}/error')
37
+
38
+ const partiesTypeId = require('./parties/{Type}/{ID}')
39
+ const partiesTypeIdSubId = require('./parties/{Type}/{ID}/{SubId}')
40
+ const partiesErrorTypeId = require('./parties/{Type}/{ID}/error')
41
+ const partiesErrorTypeIdSubId = require('./parties/{Type}/{ID}/{SubId}/error')
42
+
43
+ const oracles = require('./oracles')
44
+ const oraclesId = require('./oracles/{ID}')
45
+
46
+ const endpointCache = require('./endpointcache')
47
+ const health = require('./health')
48
+
49
+ module.exports.ApiHandlers = {
50
+ HealthGet: health.get,
51
+ ParticipantsErrorByIDPut: participantsErrorById.put,
52
+ ParticipantsByIDPut: participantsId.put,
53
+ ParticipantsErrorByTypeAndIDPut: participantsErrorTypeId.put,
54
+ ParticipantsErrorBySubIdTypeAndIDPut: participantsErrorTypeIdSubId.put,
55
+ ParticipantsSubIdByTypeAndIDGet: participantsTypeIdSubId.get,
56
+ ParticipantsSubIdByTypeAndIDPut: participantsTypeIdSubId.put,
57
+ ParticipantsSubIdByTypeAndIDPost: participantsTypeIdSubId.post,
58
+ ParticipantsSubIdByTypeAndIDDelete: participantsTypeIdSubId.delete,
59
+ ParticipantsByTypeAndIDGet: participantsTypeId.get,
60
+ ParticipantsByTypeAndIDPut: participantsTypeId.put,
61
+ ParticipantsByIDAndTypePost: participantsTypeId.post,
62
+ ParticipantsByTypeAndIDDelete: participantsTypeId.delete,
63
+ ParticipantsPost: participants.post,
64
+ PartiesByTypeAndIDGet: partiesTypeId.get,
65
+ PartiesByTypeAndIDPut: partiesTypeId.put,
66
+ PartiesErrorByTypeAndIDPut: partiesErrorTypeId.put,
67
+ PartiesBySubIdTypeAndIDGet: partiesTypeIdSubId.get,
68
+ PartiesSubIdByTypeAndIDPut: partiesTypeIdSubId.put,
69
+ PartiesErrorBySubIdTypeAndIDPut: partiesErrorTypeIdSubId.put,
70
+ EndpointCacheDelete: endpointCache.delete,
71
+ validationFail: OpenapiBackend.validationFail,
72
+ notFound: OpenapiBackend.notFound,
73
+ methodNotAllowed: OpenapiBackend.methodNotAllowed
74
+ }
75
+
76
+ module.exports.AdminHandlers = {
77
+ HealthGet: health.get,
78
+ OraclesGet: oracles.get,
79
+ OraclesPost: oracles.post,
80
+ OraclesByIdPut: oraclesId.put,
81
+ OraclesByIdDelete: oraclesId.delete,
82
+ validationFail: OpenapiBackend.validationFail,
83
+ notFound: OpenapiBackend.notFound,
84
+ methodNotAllowed: OpenapiBackend.methodNotAllowed
85
+ }
@@ -0,0 +1,100 @@
1
+ /*****
2
+ License
3
+ --------------
4
+ Copyright © 2017 Bill & Melinda Gates Foundation
5
+ The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at
6
+ http://www.apache.org/licenses/LICENSE-2.0
7
+ Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
8
+ Contributors
9
+ --------------
10
+ This is the official list of the Mojaloop project contributors for this file.
11
+ Names of the original copyright holders (individuals or organizations)
12
+ should be listed with a '*' in the first column. People who have
13
+ contributed from an organization can be listed under the organization
14
+ that actually holds the copyright for their contributions (see the
15
+ Gates Foundation organization for an example). Those individuals should have
16
+ their names indented and be marked with a '-'. Email address can be added
17
+ optionally within square brackets <email>.
18
+ * Gates Foundation
19
+
20
+ * Rajiv Mothilal <rajiv.mothilal@modusbox.com>
21
+
22
+ --------------
23
+ ******/
24
+
25
+ 'use strict'
26
+
27
+ const ErrorHandler = require('@mojaloop/central-services-error-handling')
28
+ const Enum = require('@mojaloop/central-services-shared').Enum
29
+ const EventSdk = require('@mojaloop/event-sdk')
30
+ const Logger = require('@mojaloop/central-services-logger')
31
+ const Metrics = require('@mojaloop/central-services-metrics')
32
+ const LibUtil = require('../../lib/util')
33
+ const oracle = require('../../domain/oracle')
34
+
35
+ /**
36
+ * Operations on /oracles/{ID}
37
+ */
38
+ module.exports = {
39
+ /**
40
+ * summary: Update Oracle
41
+ * description: The HTTP request PUT /oracles/{ID} is used to update information in the server regarding the provided oracle. This request should be used for individual update of Oracle information.
42
+ * parameters: body, ID, content-length, content-type, date
43
+ * produces: application/json
44
+ * responses: 204, 400, 401, 403, 404, 405, 406, 501, 503
45
+ */
46
+ put: async (context, request, h) => {
47
+ const histTimerEnd = Metrics.getHistogram(
48
+ 'ing_updateOracle',
49
+ 'Ingress: Update oracle details by Id',
50
+ ['success']
51
+ ).startTimer()
52
+ const span = request.span
53
+ const spanTags = LibUtil.getSpanTags(request, Enum.Events.Event.Type.ORACLE, Enum.Events.Event.Action.PUT)
54
+ span.setTags(spanTags)
55
+ await span.audit({
56
+ headers: request.headers,
57
+ payload: request.payload
58
+ }, EventSdk.AuditEventAction.start)
59
+ const metadata = `${request.method} ${request.path}`
60
+ try {
61
+ await oracle.updateOracle(request.params, request.payload)
62
+ histTimerEnd({ success: true })
63
+ return h.response().code(204)
64
+ } catch (err) {
65
+ Logger.isErrorEnabled && Logger.error(`ERROR - ${metadata}: ${err.stack}`)
66
+ histTimerEnd({ success: false })
67
+ throw ErrorHandler.Factory.reformatFSPIOPError(err)
68
+ }
69
+ },
70
+ /**
71
+ * summary: Delete Oracle
72
+ * description: The HTTP request DELETE /oracles/{ID} is used to delete information in the server regarding the provided oracle.
73
+ * parameters: accept, ID, content-type, date
74
+ * produces: application/json
75
+ * responses: 204, 400, 401, 403, 404, 405, 406, 501, 503
76
+ */
77
+ delete: async (context, request, h) => {
78
+ const histTimerEnd = Metrics.getHistogram(
79
+ 'ing_deleteOracle',
80
+ 'Ingress: Delete oracle by Id',
81
+ ['success']
82
+ ).startTimer()
83
+ const span = request.span
84
+ const spanTags = LibUtil.getSpanTags(request, Enum.Events.Event.Type.ORACLE, Enum.Events.Event.Action.DELETE)
85
+ span.setTags(spanTags)
86
+ await span.audit({
87
+ headers: request.headers
88
+ }, EventSdk.AuditEventAction.start)
89
+ const metadata = `${request.method} ${request.path}`
90
+ try {
91
+ await oracle.deleteOracle(request.params)
92
+ histTimerEnd({ success: true })
93
+ return h.response().code(204)
94
+ } catch (err) {
95
+ Logger.isErrorEnabled && Logger.error(`ERROR - ${metadata}: ${err.stack}`)
96
+ histTimerEnd({ success: false })
97
+ throw ErrorHandler.Factory.reformatFSPIOPError(err)
98
+ }
99
+ }
100
+ }
@@ -0,0 +1,96 @@
1
+ /*****
2
+ License
3
+ --------------
4
+ Copyright © 2017 Bill & Melinda Gates Foundation
5
+ The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at
6
+ http://www.apache.org/licenses/LICENSE-2.0
7
+ Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
8
+ Contributors
9
+ --------------
10
+ This is the official list of the Mojaloop project contributors for this file.
11
+ Names of the original copyright holders (individuals or organizations)
12
+ should be listed with a '*' in the first column. People who have
13
+ contributed from an organization can be listed under the organization
14
+ that actually holds the copyright for their contributions (see the
15
+ Gates Foundation organization for an example). Those individuals should have
16
+ their names indented and be marked with a '-'. Email address can be added
17
+ optionally within square brackets <email>.
18
+ * Gates Foundation
19
+
20
+ * Rajiv Mothilal <rajiv.mothilal@modusbox.com>
21
+
22
+ --------------
23
+ ******/
24
+
25
+ 'use strict'
26
+
27
+ const Enum = require('@mojaloop/central-services-shared').Enum
28
+ const EventSdk = require('@mojaloop/event-sdk')
29
+ const Metrics = require('@mojaloop/central-services-metrics')
30
+ const LibUtil = require('../lib/util')
31
+ const oracle = require('../domain/oracle')
32
+
33
+ /**
34
+ * Operations on /oracles
35
+ */
36
+ module.exports = {
37
+ /**
38
+ * summary: Get Oracles
39
+ * description: The HTTP request GET /oracles is used to return the list of all oracle endpoints. There are optional fields for type and currency i.e. /admin/oracles?type=MSISDN&amp;currency=USD which can be used to get more filtered results or a specific entry
40
+ * parameters: type, currency, accept, content-type, date
41
+ * produces: application/json
42
+ * responses: 200, 400, 401, 403, 404, 405, 406, 501, 503
43
+ */
44
+ get: async (context, request, h) => {
45
+ const histTimerEnd = Metrics.getHistogram(
46
+ 'ing_getOracle',
47
+ 'Ingress: Get oracles',
48
+ ['success']
49
+ ).startTimer()
50
+ const span = request.span
51
+ const spanTags = LibUtil.getSpanTags(request, Enum.Events.Event.Type.ORACLE, Enum.Events.Event.Action.LOOKUP)
52
+ span.setTags(spanTags)
53
+ await span.audit({
54
+ headers: request.headers,
55
+ query: request.query
56
+ }, EventSdk.AuditEventAction.start)
57
+ let response
58
+ try {
59
+ response = await oracle.getOracle(request.query)
60
+ histTimerEnd({ success: true })
61
+ return h.response(response).code(200)
62
+ } catch (err) {
63
+ histTimerEnd({ success: false })
64
+ throw err
65
+ }
66
+ },
67
+ /**
68
+ * summary: Create Oracles
69
+ * description: The HTTP request POST /oracles is used to create information in the server regarding the provided oracles. This request should be used for creation of Oracle information.
70
+ * parameters: body, accept, content-length, content-type, date
71
+ * produces: application/json
72
+ * responses: 201, 400, 401, 403, 404, 405, 406, 501, 503
73
+ */
74
+ post: async (context, request, h) => {
75
+ const histTimerEnd = Metrics.getHistogram(
76
+ 'ing_createOracle',
77
+ 'Ingress: Create oracles',
78
+ ['success']
79
+ ).startTimer()
80
+ const span = request.span
81
+ const spanTags = LibUtil.getSpanTags(request, Enum.Events.Event.Type.ORACLE, Enum.Events.Event.Action.POST)
82
+ span.setTags(spanTags)
83
+ await span.audit({
84
+ headers: request.headers,
85
+ payload: request.payload
86
+ }, EventSdk.AuditEventAction.start)
87
+ try {
88
+ await oracle.createOracle(request.payload)
89
+ histTimerEnd({ success: true })
90
+ return h.response().code(201)
91
+ } catch (err) {
92
+ histTimerEnd({ success: false })
93
+ throw err
94
+ }
95
+ }
96
+ }
@@ -0,0 +1,44 @@
1
+ /*****
2
+ License
3
+ --------------
4
+ Copyright © 2017 Bill & Melinda Gates Foundation
5
+ The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at
6
+ http://www.apache.org/licenses/LICENSE-2.0
7
+ Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
8
+ Contributors
9
+ --------------
10
+ This is the official list of the Mojaloop project contributors for this file.
11
+ Names of the original copyright holders (individuals or organizations)
12
+ should be listed with a '*' in the first column. People who have
13
+ contributed from an organization can be listed under the organization
14
+ that actually holds the copyright for their contributions (see the
15
+ Gates Foundation organization for an example). Those individuals should have
16
+ their names indented and be marked with a '-'. Email address can be added
17
+ optionally within square brackets <email>.
18
+ * Gates Foundation
19
+ * Name Surname <name.surname@gatesfoundation.com>
20
+
21
+ * Rajiv Mothilal <rajiv.mothilal@modusbox.com>
22
+
23
+ --------------
24
+ ******/
25
+ /* istanbul ignore file */
26
+ 'use strict'
27
+
28
+ const ErrorHandler = require('@mojaloop/central-services-error-handling')
29
+
30
+ /**
31
+ * Operations on /participants/{ID}/error
32
+ */
33
+ module.exports = {
34
+ /**
35
+ * summary: ParticipantsByIDAndError
36
+ * description: If there is an error during FSP information creation in the server, the error callback PUT /participants/&lt;ID&gt;/error is used. The &lt;ID&gt; in the URI should contain the requestId that was used for the creation of the participant information.
37
+ * parameters: ID, body, Content-Length, Content-Type, Date, X-Forwarded-For, FSPIOP-Source, FSPIOP-Destination, FSPIOP-Encryption, FSPIOP-Signature, FSPIOP-URI, FSPIOP-HTTP-Method
38
+ * produces: application/json
39
+ * responses: 200, 400, 401, 403, 404, 405, 406, 501, 503
40
+ */
41
+ put: function (context, request, h) {
42
+ return h.response(ErrorHandler.Factory.createFSPIOPError(ErrorHandler.Enums.FSPIOPErrorCodes.NOT_IMPLEMENTED))
43
+ }
44
+ }
@@ -0,0 +1,44 @@
1
+ /*****
2
+ License
3
+ --------------
4
+ Copyright © 2017 Bill & Melinda Gates Foundation
5
+ The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at
6
+ http://www.apache.org/licenses/LICENSE-2.0
7
+ Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
8
+ Contributors
9
+ --------------
10
+ This is the official list of the Mojaloop project contributors for this file.
11
+ Names of the original copyright holders (individuals or organizations)
12
+ should be listed with a '*' in the first column. People who have
13
+ contributed from an organization can be listed under the organization
14
+ that actually holds the copyright for their contributions (see the
15
+ Gates Foundation organization for an example). Those individuals should have
16
+ their names indented and be marked with a '-'. Email address can be added
17
+ optionally within square brackets <email>.
18
+ * Gates Foundation
19
+ * Name Surname <name.surname@gatesfoundation.com>
20
+
21
+ * Rajiv Mothilal <rajiv.mothilal@modusbox.com>
22
+
23
+ --------------
24
+ ******/
25
+ /* istanbul ignore file */
26
+ 'use strict'
27
+
28
+ const ErrorHandler = require('@mojaloop/central-services-error-handling')
29
+
30
+ /**
31
+ * Operations on /participants/{ID}
32
+ */
33
+ module.exports = {
34
+ /**
35
+ * summary: ParticipantsByID
36
+ * description: The callback PUT /participants/&lt;ID&gt; is used to inform the client of the result of the creation of the provided list of identities.
37
+ * parameters: ID, body, Content-Length, Content-Type, Date, X-Forwarded-For, FSPIOP-Source, FSPIOP-Destination, FSPIOP-Encryption, FSPIOP-Signature, FSPIOP-URI, FSPIOP-HTTP-Method
38
+ * produces: application/json
39
+ * responses: 200, 400, 401, 403, 404, 405, 406, 501, 503
40
+ */
41
+ put: function (context, request, h) {
42
+ return h.response(ErrorHandler.Factory.createFSPIOPError(ErrorHandler.Enums.FSPIOPErrorCodes.NOT_IMPLEMENTED))
43
+ }
44
+ }