@mojaloop/sdk-scheme-adapter 12.3.0 → 13.0.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 (60) hide show
  1. package/.env.example +3 -0
  2. package/CHANGELOG.md +25 -0
  3. package/docker/ml-testing-toolkit/spec_files/api_definitions/fspiop_1.1/trigger_templates/transaction_request_followup.json +2 -2
  4. package/docker/ml-testing-toolkit/spec_files/rules_callback/default.json +7 -7
  5. package/docker/ml-testing-toolkit/spec_files/rules_response/default.json +16 -16
  6. package/docker/ml-testing-toolkit/spec_files/rules_response/default_pisp_rules.json +5 -5
  7. package/docker/ml-testing-toolkit/spec_files/rules_validation/default.json +10 -10
  8. package/package.json +3 -3
  9. package/src/InboundServer/handlers.js +114 -52
  10. package/src/OutboundServer/api.yaml +105 -32
  11. package/src/OutboundServer/api_interfaces/openapi.d.ts +46 -16
  12. package/src/OutboundServer/api_template/components/schemas/accountsResponse.yaml +9 -0
  13. package/src/OutboundServer/api_template/components/schemas/partiesByIdResponse.yaml +10 -3
  14. package/src/OutboundServer/api_template/components/schemas/quotesPostResponse.yaml +42 -34
  15. package/src/OutboundServer/api_template/components/schemas/simpleTransfersPostResponse.yaml +9 -2
  16. package/src/OutboundServer/api_template/components/schemas/transferRequest.yaml +3 -0
  17. package/src/OutboundServer/api_template/components/schemas/transferResponse.yaml +28 -2
  18. package/src/OutboundServer/api_template/components/schemas/transferStatusResponse.yaml +8 -1
  19. package/src/OutboundServer/handlers.js +1 -1
  20. package/src/config.js +1 -1
  21. package/src/lib/model/AccountsModel.js +13 -11
  22. package/src/lib/model/InboundTransfersModel.js +166 -24
  23. package/src/lib/model/OutboundRequestToPayModel.js +5 -6
  24. package/src/lib/model/OutboundRequestToPayTransferModel.js +2 -2
  25. package/src/lib/model/OutboundTransfersModel.js +261 -56
  26. package/src/lib/model/PartiesModel.js +15 -2
  27. package/src/lib/model/common/BackendError.js +28 -4
  28. package/src/lib/model/common/index.js +2 -1
  29. package/test/__mocks__/@mojaloop/sdk-standard-components.js +3 -2
  30. package/test/integration/lib/Outbound/parties.test.js +2 -0
  31. package/test/integration/lib/Outbound/quotes.test.js +2 -0
  32. package/test/integration/lib/Outbound/simpleTransfers.test.js +2 -0
  33. package/test/unit/InboundServer.test.js +9 -9
  34. package/test/unit/TestServer.test.js +11 -13
  35. package/test/unit/api/accounts/data/postAccountsErrorMojaloopResponse.json +11 -3
  36. package/test/unit/api/accounts/data/postAccountsSuccessResponse.json +14 -0
  37. package/test/unit/api/accounts/data/postAccountsSuccessResponseWithError1.json +13 -0
  38. package/test/unit/api/accounts/data/postAccountsSuccessResponseWithError2.json +18 -0
  39. package/test/unit/api/accounts/utils.js +15 -1
  40. package/test/unit/api/transfers/data/getTransfersCommittedResponse.json +18 -15
  41. package/test/unit/api/transfers/data/getTransfersErrorNotFound.json +1 -0
  42. package/test/unit/api/transfers/data/postTransfersErrorMojaloopResponse.json +9 -0
  43. package/test/unit/api/transfers/data/postTransfersErrorTimeoutResponse.json +1 -0
  44. package/test/unit/api/transfers/data/postTransfersSuccessResponse.json +74 -47
  45. package/test/unit/api/transfers/utils.js +85 -4
  46. package/test/unit/data/commonHttpHeaders.json +1 -0
  47. package/test/unit/inboundApi/handlers.test.js +45 -14
  48. package/test/unit/lib/model/AccountsModel.test.js +9 -6
  49. package/test/unit/lib/model/InboundTransfersModel.test.js +210 -30
  50. package/test/unit/lib/model/OutboundRequestToPayModel.test.js +1 -1
  51. package/test/unit/lib/model/OutboundRequestToPayTransferModel.test.js +3 -3
  52. package/test/unit/lib/model/OutboundTransfersModel.test.js +826 -157
  53. package/test/unit/lib/model/PartiesModel.test.js +13 -7
  54. package/test/unit/lib/model/QuotesModel.test.js +8 -2
  55. package/test/unit/lib/model/TransfersModel.test.js +8 -2
  56. package/test/unit/lib/model/data/defaultConfig.json +9 -9
  57. package/test/unit/lib/model/data/mockArguments.json +97 -40
  58. package/test/unit/lib/model/data/payeeParty.json +13 -11
  59. package/test/unit/lib/model/data/quoteResponse.json +36 -25
  60. package/test/unit/lib/model/data/transferFulfil.json +5 -3
@@ -155,9 +155,12 @@ describe('PartiesModel', () => {
155
155
  model.run = jest.fn(() => Promise.resolve());
156
156
 
157
157
  const message = {
158
- party: {
159
- Iam: 'the-body'
160
- }
158
+ body: {
159
+ party: {
160
+ Iam: 'the-body'
161
+ }
162
+ },
163
+ headers: {}
161
164
  };
162
165
 
163
166
  const onRequestActionPromise = new Promise((resolve, reject) => {
@@ -175,7 +178,7 @@ describe('PartiesModel', () => {
175
178
 
176
179
  // check that this.context.data is updated
177
180
  expect(model.context.data).toEqual({
178
- ...message,
181
+ party: { ...message },
179
182
  // current state will be updated by onAfterTransition which isn't called
180
183
  // when manual invocation of transition handler happens
181
184
  currentState: 'start'
@@ -216,9 +219,12 @@ describe('PartiesModel', () => {
216
219
  model.run = jest.fn(() => Promise.resolve());
217
220
 
218
221
  const message = {
219
- party: {
220
- Iam: 'the-body'
221
- }
222
+ body: {
223
+ party: {
224
+ Iam: 'the-body'
225
+ }
226
+ },
227
+ headers: {}
222
228
  };
223
229
 
224
230
  const onRequestActionPromise = new Promise((resolve, reject) => {
@@ -142,7 +142,10 @@ describe('QuotesModel', () => {
142
142
  // mock workflow execution which is tested in separate case
143
143
  model.run = jest.fn(() => Promise.resolve());
144
144
 
145
- const message = { ...putQuotesResponse };
145
+ const message = {
146
+ body: { ...putQuotesResponse },
147
+ headers: {}
148
+ };
146
149
 
147
150
  const onRequestActionPromise = new Promise((resolve, reject) => {
148
151
  // manually invoke transition handler
@@ -200,7 +203,10 @@ describe('QuotesModel', () => {
200
203
  // mock workflow execution which is tested in separate case
201
204
  model.run = jest.fn(() => Promise.resolve());
202
205
 
203
- const message = { ...putQuotesResponse };
206
+ const message = {
207
+ body: { ...putQuotesResponse },
208
+ headers: {}
209
+ };
204
210
 
205
211
  const onRequestActionPromise = new Promise((resolve, reject) => {
206
212
  // manually invoke transition handler
@@ -142,7 +142,10 @@ describe('TransfersModel', () => {
142
142
  // mock workflow execution which is tested in separate case
143
143
  model.run = jest.fn(() => Promise.resolve());
144
144
 
145
- const message = { ...putTransfersResponse };
145
+ const message = {
146
+ body: { ...putTransfersResponse },
147
+ headers: {}
148
+ };
146
149
 
147
150
  const onRequestActionPromise = new Promise((resolve, reject) => {
148
151
  // manually invoke transition handler
@@ -200,7 +203,10 @@ describe('TransfersModel', () => {
200
203
  // mock workflow execution which is tested in separate case
201
204
  model.run = jest.fn(() => Promise.resolve());
202
205
 
203
- const message = { ...putTransfersResponse };
206
+ const message = {
207
+ body: { ...putTransfersResponse },
208
+ headers: {}
209
+ };
204
210
 
205
211
  const onRequestActionPromise = new Promise((resolve, reject) => {
206
212
  // manually invoke transition handler
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "inbound": {
3
- "port": 4000,
4
- "tls": {
5
- "mutualTLS": { "enabled": false },
6
- "creds": {
7
- "ca": null,
8
- "cert": null,
9
- "key": null
10
- }
11
- }
3
+ "port": 4000,
4
+ "tls": {
5
+ "mutualTLS": { "enabled": false },
6
+ "creds": {
7
+ "ca": null,
8
+ "cert": null,
9
+ "key": null
10
+ }
11
+ }
12
12
  },
13
13
  "outbound": {
14
14
  "port": 4001,
@@ -1,50 +1,100 @@
1
1
  {
2
2
  "quoteRequest": {
3
- "quoteId": "fake-quote-id",
4
- "transactionId": "fake-transaction-id",
5
- "amountType": "SEND",
6
- "amount": {
7
- "currency": "XOF",
8
- "amount": 10
9
- },
10
- "expiration": "2019-06-04T04:02:10.378Z",
11
- "payer": {
12
- "partyIdInfo": {
13
- "partyIdType": "MSISDN",
14
- "partyIdentifier": "17855501914",
15
- "fspId": "mojaloop-sdk"
3
+ "body": {
4
+ "quoteId": "fake-quote-id",
5
+ "transactionId": "fake-transaction-id",
6
+ "amountType": "SEND",
7
+ "amount": {
8
+ "currency": "XOF",
9
+ "amount": 10
16
10
  },
17
- "personalInfo": {
18
- "complexName": {
19
- "firstName": "Murthy",
20
- "lastName": "Kakarlamudi"
11
+ "expiration": "2019-06-04T04:02:10.378Z",
12
+ "payer": {
13
+ "partyIdInfo": {
14
+ "partyIdType": "MSISDN",
15
+ "partyIdentifier": "17855501914",
16
+ "fspId": "mojaloop-sdk"
21
17
  },
22
- "dateOfBirth": "2010-10-10"
23
- },
24
- "name": "Murthy Kakarlamudi",
25
- "merchantClassificationCode": "123"
26
- },
27
- "payee": {
28
- "partyIdInfo": {
29
- "partyIdType": "PERSONAL_ID",
30
- "partyIdentifier": "123456789",
31
- "partySubIdOrType": "PASSPORT",
32
- "fspId": "goldenpayeefsp"
18
+ "personalInfo": {
19
+ "complexName": {
20
+ "firstName": "Murthy",
21
+ "lastName": "Kakarlamudi"
22
+ },
23
+ "dateOfBirth": "2010-10-10"
24
+ },
25
+ "name": "Murthy Kakarlamudi",
26
+ "merchantClassificationCode": "123"
33
27
  },
34
- "personalInfo": {
35
- "complexName": {
36
- "firstName": "Sridevi",
37
- "lastName": "Miriyala"
28
+ "payee": {
29
+ "partyIdInfo": {
30
+ "partyIdType": "PERSONAL_ID",
31
+ "partyIdentifier": "123456789",
32
+ "partySubIdOrType": "PASSPORT",
33
+ "fspId": "goldenpayeefsp"
38
34
  },
39
- "dateOfBirth": "2010-10-10"
35
+ "personalInfo": {
36
+ "complexName": {
37
+ "firstName": "Sridevi",
38
+ "lastName": "Miriyala"
39
+ },
40
+ "dateOfBirth": "2010-10-10"
41
+ },
42
+ "name": "Sridevi Miriyala",
43
+ "merchantClassificationCode": "456"
44
+ },
45
+ "transactionType": {
46
+ "scenario": "TRANSFER",
47
+ "initiator": "PAYER",
48
+ "initiatorType": "CONSUMER"
40
49
  },
41
- "name": "Sridevi Miriyala",
42
- "merchantClassificationCode": "456"
50
+ "extensionList": {
51
+ "extension": [{
52
+ "key": "qkey1",
53
+ "value": "qvalue1"
54
+ }, {
55
+ "key": "qkey2",
56
+ "value": "qvalue2"
57
+ }]
58
+ }
59
+ }
60
+ },
61
+ "internalQuoteRequest": {
62
+ "quoteId": "fake-quote-id",
63
+ "transactionId": "fake-transaction-id",
64
+ "to": {
65
+ "idType": "PERSONAL_ID",
66
+ "idValue": "123456789",
67
+ "idSubValue": "PASSPORT",
68
+ "fspId": "goldenpayeefsp",
69
+ "displayName": "Sridevi Miriyala",
70
+ "dateOfBirth": "2010-10-10",
71
+ "firstName": "Sridevi",
72
+ "lastName": "Miriyala"
73
+ },
74
+ "from": {
75
+ "idType": "MSISDN",
76
+ "idValue": "17855501914",
77
+ "fspId": "mojaloop-sdk",
78
+ "displayName": "Murthy Kakarlamudi",
79
+ "dateOfBirth": "2010-10-10",
80
+ "firstName": "Murthy",
81
+ "lastName": "Kakarlamudi"
43
82
  },
44
- "transactionType": {
45
- "scenario": "TRANSFER",
46
- "initiator": "PAYER",
47
- "initiatorType": "CONSUMER"
83
+ "amountType": "SEND",
84
+ "amount": 10,
85
+ "currency": "XOF",
86
+ "transactionType": "TRANSFER",
87
+ "initiator": "PAYER",
88
+ "initiatorType": "CONSUMER",
89
+ "expiration": "2019-06-04T04:02:10.378Z",
90
+ "extensionList": {
91
+ "extension": [{
92
+ "key": "qkey1",
93
+ "value": "qvalue1"
94
+ }, {
95
+ "key": "qkey2",
96
+ "value": "qvalue2"
97
+ }]
48
98
  }
49
99
  },
50
100
  "internalQuoteResponse": {
@@ -55,7 +105,14 @@
55
105
  "payeeFspCommission": 0,
56
106
  "condition": "fH9pAYDQbmoZLPbvv3CSW2RfjU4jvM4ApG_fqGnR7Xs",
57
107
  "expiration": "2019-11-12T09:02:10.378Z",
58
- "isValid": 1
108
+ "isValid": 1,
109
+ "extensionList": [{
110
+ "key": "qkey1",
111
+ "value": "qvalue1"
112
+ }, {
113
+ "key": "qkey2",
114
+ "value": "qvalue2"
115
+ }]
59
116
  },
60
117
  "internalGetOTPResponse" : {
61
118
  "value": "123456"
@@ -1,15 +1,17 @@
1
1
  {
2
- "party": {
3
- "partyIdInfo": {
4
- "partyIdType": "PERSONAL_ID",
5
- "partyIdentifier": "123456789",
6
- "partySubIdOrType": "PASSPORT",
7
- "fspId": "MobileMoney"
8
- },
9
- "personalInfo": {
10
- "complexName": {
11
- "firstName": "John",
12
- "lastName": "Doe"
2
+ "body": {
3
+ "party": {
4
+ "partyIdInfo": {
5
+ "partyIdType": "PERSONAL_ID",
6
+ "partyIdentifier": "123456789",
7
+ "partySubIdOrType": "PASSPORT",
8
+ "fspId": "MobileMoney"
9
+ },
10
+ "personalInfo": {
11
+ "complexName": {
12
+ "firstName": "John",
13
+ "lastName": "Doe"
14
+ }
13
15
  }
14
16
  }
15
17
  }
@@ -1,31 +1,42 @@
1
1
  {
2
2
  "type": "quoteResponse",
3
3
  "data": {
4
- "transferAmount": {
5
- "amount": "500",
6
- "currency": "USD"
4
+ "body": {
5
+ "transferAmount": {
6
+ "amount": "500",
7
+ "currency": "USD"
8
+ },
9
+ "payeeReceiveAmount": {
10
+ "amount": "490",
11
+ "currency": "USD"
12
+ },
13
+ "payeeFspFee": {
14
+ "amount": "5",
15
+ "currency": "USD"
16
+ },
17
+ "payeeFspCommission": {
18
+ "amount": "5",
19
+ "currency": "USD"
20
+ },
21
+ "geoCode": {
22
+ "latitude": "53.295971",
23
+ "longitude": "-0.038500"
24
+ },
25
+ "expiration": "2017-11-15T14:17:09.663+01:00",
26
+ "ilpPacket": "AQAAAAAAACasIWcuc2UubW9iaWxlbW9uZXkubXNpc2RuLjEyMzQ1Njc4OYIEIXsNCiAgICAidHJhbnNhY3Rpb25JZCI6ICI4NWZlYWMyZi0zOWIyLTQ5MWItODE3ZS00YTAzMjAzZDRmMTQiLA0KICAgICJxdW90ZUlkIjogIjdjMjNlODBjLWQwNzgtNDA3Ny04MjYzLTJjMDQ3ODc2ZmNmNiIsDQogICAgInBheWVlIjogew0KICAgICAgICAicGFydHlJZEluZm8iOiB7DQogICAgICAgICAgICAicGFydHlJZFR5cGUiOiAiTVNJU0ROIiwNCiAgICAgICAgICAgICJwYXJ0eUlkZW50aWZpZXIiOiAiMTIzNDU2Nzg5IiwNCiAgICAgICAgICAgICJmc3BJZCI6ICJNb2JpbGVNb25leSINCiAgICAgICAgfSwNCiAgICAgICAgInBlcnNvbmFsSW5mbyI6IHsNCiAgICAgICAgICAgICJjb21wbGV4TmFtZSI6IHsNCiAgICAgICAgICAgICAgICAiZmlyc3ROYW1lIjogIkhlbnJpayIsDQogICAgICAgICAgICAgICAgImxhc3ROYW1lIjogIkthcmxzc29uIg0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSwNCiAgICAicGF5ZXIiOiB7DQogICAgICAgICJwZXJzb25hbEluZm8iOiB7DQogICAgICAgICAgICAiY29tcGxleE5hbWUiOiB7DQogICAgICAgICAgICAgICAgImZpcnN0TmFtZSI6ICJNYXRzIiwNCiAgICAgICAgICAgICAgICAibGFzdE5hbWUiOiAiSGFnbWFuIg0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KICAgICAgICAicGFydHlJZEluZm8iOiB7DQogICAgICAgICAgICAicGFydHlJZFR5cGUiOiAiSUJBTiIsDQogICAgICAgICAgICAicGFydHlJZGVudGlmaWVyIjogIlNFNDU1MDAwMDAwMDA1ODM5ODI1NzQ2NiIsDQogICAgICAgICAgICAiZnNwSWQiOiAiQmFua05yT25lIg0KICAgICAgICB9DQogICAgfSwNCiAgICAiYW1vdW50Ijogew0KICAgICAgICAiYW1vdW50IjogIjEwMCIsDQogICAgICAgICJjdXJyZW5jeSI6ICJVU0QiDQogICAgfSwNCiAgICAidHJhbnNhY3Rpb25UeXBlIjogew0KICAgICAgICAic2NlbmFyaW8iOiAiVFJBTlNGRVIiLA0KICAgICAgICAiaW5pdGlhdG9yIjogIlBBWUVSIiwNCiAgICAgICAgImluaXRpYXRvclR5cGUiOiAiQ09OU1VNRVIiDQogICAgfSwNCiAgICAibm90ZSI6ICJGcm9tIE1hdHMiDQp9DQo\u003d\u003d",
27
+ "condition": "fH9pAYDQbmoZLPbvv3CSW2RfjU4jvM4ApG_fqGnR7Xs",
28
+ "extensionList": {
29
+ "extension": [{
30
+ "key": "qkey1",
31
+ "value": "qvalue1"
32
+ }, {
33
+ "key": "qkey2",
34
+ "value": "qvalue2"
35
+ }]
36
+ }
7
37
  },
8
- "payeeReceiveAmount": {
9
- "amount": "490",
10
- "currency": "USD"
11
- },
12
- "payeeFspFee": {
13
- "amount": "5",
14
- "currency": "USD"
15
- },
16
- "payeeFspCommission": {
17
- "amount": "5",
18
- "currency": "USD"
19
- },
20
- "geoCode": {
21
- "latitude": "53.295971",
22
- "longitude": "-0.038500"
23
- },
24
- "expiration": "2017-11-15T14:17:09.663+01:00",
25
- "ilpPacket": "AQAAAAAAACasIWcuc2UubW9iaWxlbW9uZXkubXNpc2RuLjEyMzQ1Njc4OYIEIXsNCiAgICAidHJhbnNhY3Rpb25JZCI6ICI4NWZlYWMyZi0zOWIyLTQ5MWItODE3ZS00YTAzMjAzZDRmMTQiLA0KICAgICJxdW90ZUlkIjogIjdjMjNlODBjLWQwNzgtNDA3Ny04MjYzLTJjMDQ3ODc2ZmNmNiIsDQogICAgInBheWVlIjogew0KICAgICAgICAicGFydHlJZEluZm8iOiB7DQogICAgICAgICAgICAicGFydHlJZFR5cGUiOiAiTVNJU0ROIiwNCiAgICAgICAgICAgICJwYXJ0eUlkZW50aWZpZXIiOiAiMTIzNDU2Nzg5IiwNCiAgICAgICAgICAgICJmc3BJZCI6ICJNb2JpbGVNb25leSINCiAgICAgICAgfSwNCiAgICAgICAgInBlcnNvbmFsSW5mbyI6IHsNCiAgICAgICAgICAgICJjb21wbGV4TmFtZSI6IHsNCiAgICAgICAgICAgICAgICAiZmlyc3ROYW1lIjogIkhlbnJpayIsDQogICAgICAgICAgICAgICAgImxhc3ROYW1lIjogIkthcmxzc29uIg0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSwNCiAgICAicGF5ZXIiOiB7DQogICAgICAgICJwZXJzb25hbEluZm8iOiB7DQogICAgICAgICAgICAiY29tcGxleE5hbWUiOiB7DQogICAgICAgICAgICAgICAgImZpcnN0TmFtZSI6ICJNYXRzIiwNCiAgICAgICAgICAgICAgICAibGFzdE5hbWUiOiAiSGFnbWFuIg0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KICAgICAgICAicGFydHlJZEluZm8iOiB7DQogICAgICAgICAgICAicGFydHlJZFR5cGUiOiAiSUJBTiIsDQogICAgICAgICAgICAicGFydHlJZGVudGlmaWVyIjogIlNFNDU1MDAwMDAwMDA1ODM5ODI1NzQ2NiIsDQogICAgICAgICAgICAiZnNwSWQiOiAiQmFua05yT25lIg0KICAgICAgICB9DQogICAgfSwNCiAgICAiYW1vdW50Ijogew0KICAgICAgICAiYW1vdW50IjogIjEwMCIsDQogICAgICAgICJjdXJyZW5jeSI6ICJVU0QiDQogICAgfSwNCiAgICAidHJhbnNhY3Rpb25UeXBlIjogew0KICAgICAgICAic2NlbmFyaW8iOiAiVFJBTlNGRVIiLA0KICAgICAgICAiaW5pdGlhdG9yIjogIlBBWUVSIiwNCiAgICAgICAgImluaXRpYXRvclR5cGUiOiAiQ09OU1VNRVIiDQogICAgfSwNCiAgICAibm90ZSI6ICJGcm9tIE1hdHMiDQp9DQo\u003d\u003d",
26
- "condition": "fH9pAYDQbmoZLPbvv3CSW2RfjU4jvM4ApG_fqGnR7Xs"
27
- },
28
- "headers": {
29
- "fspiop-source": "foo"
38
+ "headers": {
39
+ "fspiop-source": "foo"
40
+ }
30
41
  }
31
42
  }
@@ -1,8 +1,10 @@
1
1
  {
2
2
  "type": "transferFulfil",
3
3
  "data": {
4
- "fulfilment": "87mm1-reS3SAi8oIWXgBkLmgWc1MkZ_yLbFDX5XAdo5o",
5
- "completedTimestamp": "2017-11-15T14:16:09.663+01:00",
6
- "transferState": "COMMITTED"
4
+ "body": {
5
+ "fulfilment": "87mm1-reS3SAi8oIWXgBkLmgWc1MkZ_yLbFDX5XAdo5o",
6
+ "completedTimestamp": "2017-11-15T14:16:09.663+01:00",
7
+ "transferState": "COMMITTED"
8
+ }
7
9
  }
8
10
  }