From f2ece2e5538ca6fb4ceae62408c6417ae6bc5cf5 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Thu, 7 Jul 2022 11:57:28 +0200 Subject: [PATCH 01/31] fix(mojaloop/#2811): sdk-scheme-adapter sending incorrect transferState on a PUT transfers Callback - fixed transfer-state for callback-response by PayeeFSP to use FSPIOP TransferState Enums from central-services-shared - re-factored & consolidated enums into a common SDKStateEnum which is used for all `currentState` operations and comparisons - removed duplicate/unnecessary enums - updated unit tests to use enums - updated dependencies --- package-lock.json | 76 +++++++++---------- package.json | 20 ++--- src/lib/model/AccountsModel.js | 11 +-- src/lib/model/Async2SyncModel.js | 7 +- src/lib/model/InboundTransfersModel.js | 30 ++++---- src/lib/model/OutboundBulkQuotesModel.js | 11 +-- src/lib/model/OutboundBulkTransfersModel.js | 11 +-- src/lib/model/OutboundRequestToPayModel.js | 15 ++-- .../OutboundRequestToPayTransferModel.js | 18 ++--- src/lib/model/OutboundTransfersModel.js | 19 ++--- src/lib/model/common/BackendError.js | 14 +--- src/lib/model/common/Enums.js | 30 ++++++++ src/lib/model/common/index.js | 5 +- test/integration/lib/Outbound/parties.test.js | 3 +- test/integration/lib/Outbound/quotes.test.js | 4 +- .../lib/Outbound/simpleTransfers.test.js | 3 +- test/unit/inboundApi/handlers.test.js | 4 +- test/unit/lib/model/AccountsModel.test.js | 3 +- .../lib/model/InboundTransfersModel.test.js | 16 ++-- .../lib/model/OutboundBulkQuotesModel.test.js | 8 +- .../model/OutboundBulkTransfersModel.test.js | 7 +- .../model/OutboundRequestToPayModel.test.js | 5 +- .../OutboundRequestToPayTransferModel.test.js | 7 +- .../lib/model/OutboundTransfersModel.test.js | 71 ++++++++--------- test/unit/lib/model/PartiesModel.test.js | 3 +- test/unit/lib/model/QuotesModel.test.js | 3 +- test/unit/lib/model/TransfersModel.test.js | 3 +- .../data/getBulkTransfersBackendResponse.json | 2 +- .../getBulkTransfersMojaloopResponse.json | 2 +- 29 files changed, 218 insertions(+), 193 deletions(-) create mode 100644 src/lib/model/common/Enums.js diff --git a/package-lock.json b/package-lock.json index d3b12ed76..a81cc19a9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,20 +9,20 @@ "version": "17.0.1", "license": "Apache-2.0", "dependencies": { - "@koa/cors": "^3.1.0", + "@koa/cors": "^3.3.0", "@mojaloop/central-services-shared": "17.0.2", "@mojaloop/sdk-standard-components": "^17.1.0", "ajv": "8.11.0", "axios": "^0.27.2", "co-body": "^6.1.0", "dotenv": "^16.0.1", - "env-var": "^7.0.1", - "express": "^4.17.2", + "env-var": "^7.1.1", + "express": "^4.18.1", "fast-json-patch": "^3.1.1", "javascript-state-machine": "^3.1.0", "js-yaml": "^4.1.0", "json-schema-ref-parser": "^9.0.9", - "koa": "^2.13.1", + "koa": "^2.13.4", "koa-body": "^5.0.0", "lodash": "^4.17.21", "module-alias": "^2.2.2", @@ -31,30 +31,30 @@ "prom-client": "^14.0.1", "promise-timeout": "^1.3.0", "random-word-slugs": "^0.1.6", - "redis": "^4.1.1", - "uuidv4": "^6.2.12", + "redis": "^4.2.0", + "uuidv4": "^6.2.13", "ws": "^8.8.0" }, "devDependencies": { "@babel/core": "^7.18.6", "@babel/preset-env": "^7.18.6", "@mojaloop/api-snippets": "^14.0.0", - "@redocly/openapi-cli": "^1.0.0-beta.59", + "@redocly/openapi-cli": "^1.0.0-beta.94", "@types/jest": "^28.1.4", "babel-jest": "^28.1.2", "eslint": "^8.19.0", "eslint-config-airbnb-base": "^15.0.0", - "eslint-plugin-import": "^2.24.2", + "eslint-plugin-import": "^2.26.0", "eslint-plugin-jest": "^26.5.3", "jest": "^28.1.2", "jest-junit": "^14.0.0", "nock": "^13.2.8", "npm-audit-resolver": "^3.0.0-0", - "npm-check-updates": "^15.0.2", + "npm-check-updates": "^15.2.0", "openapi-response-validator": "^12.0.0", "openapi-typescript": "^5.4.0", "redis-mock": "^0.56.3", - "standard-version": "^9.3.1", + "standard-version": "^9.5.0", "supertest": "^6.2.4", "swagger-cli": "^4.0.4" }, @@ -3434,9 +3434,9 @@ } }, "node_modules/@redis/client": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.1.1.tgz", - "integrity": "sha512-IGGyazghVYuqsXv7/AxzMS0HmCPj0JRQX4l0XZ52BdJTUv2lNSnPgfWEE65HnC2gZCEO7STyaJbNultn1i0Y3g==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.2.0.tgz", + "integrity": "sha512-a8Nlw5fv2EIAFJxTDSSDVUT7yfBGpZO96ybZXzQpgkyLg/dxtQ1uiwTc0EGfzg1mrPjZokeBSEGTbGXekqTNOg==", "dependencies": { "cluster-key-slot": "1.1.0", "generic-pool": "3.8.2", @@ -13115,9 +13115,9 @@ } }, "node_modules/npm-check-updates": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-15.0.2.tgz", - "integrity": "sha512-ZSmNUm2Cl8K7VZBhLY4/AE2NHmZfR4glKoRZIeJrgg5bvFP1LhRBU3tdS+IX1+MLoUvpF2L+Q7oD5QO+nBOm+Q==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-15.2.0.tgz", + "integrity": "sha512-QcNQE3FyOsolWD1Nc+DRryffuBf68fXqVDvN5gBMk3BSaRQ+urZCTfm9By0VuPPA2vrDBRPVgYZB+8L9UN4Avw==", "dev": true, "dependencies": { "chalk": "^4.1.2", @@ -13138,7 +13138,7 @@ "pacote": "^13.6.1", "parse-github-url": "^1.0.2", "progress": "^2.0.3", - "prompts-ncu": "^2.5.0", + "prompts-ncu": "^2.5.1", "rc-config-loader": "^4.1.0", "remote-git-tags": "^3.0.0", "rimraf": "^3.0.2", @@ -14644,9 +14644,9 @@ } }, "node_modules/prompts-ncu": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/prompts-ncu/-/prompts-ncu-2.5.0.tgz", - "integrity": "sha512-a9WdInrG7zSlmfzDszmF3r8O4grZRI8+ChV0LtagHRT4dH7F+kxkrwFPGxeS83FZgAGBx3AXoLP+c4kGJb1P3w==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/prompts-ncu/-/prompts-ncu-2.5.1.tgz", + "integrity": "sha512-Hdd7GgV7b76Yh9FP9HL1D9xqtJCJdVPpiM2vDtuoc8W1KfweJe15gutFYmxkq83ViFaagFM8K0UcPCQ/tZq8bA==", "dev": true, "dependencies": { "kleur": "^4.0.1", @@ -15131,12 +15131,12 @@ } }, "node_modules/redis": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/redis/-/redis-4.1.1.tgz", - "integrity": "sha512-vVLYD0RMiDH4YQ1dtmtNU0RX5MAsvEA35Wj+4ZhrSNZXtGK87ktQ0lmI3O3Qn/omoIW456wfOUanqI/RNxagLw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.2.0.tgz", + "integrity": "sha512-bCR0gKVhIXFg8zCQjXEANzgI01DDixtPZgIUZHBCmwqixnu+MK3Tb2yqGjh+HCLASQVVgApiwhNkv+FoedZOGQ==", "dependencies": { "@redis/bloom": "1.0.2", - "@redis/client": "1.1.1", + "@redis/client": "1.2.0", "@redis/graph": "1.0.1", "@redis/json": "1.0.3", "@redis/search": "1.0.6", @@ -20832,9 +20832,9 @@ "requires": {} }, "@redis/client": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.1.1.tgz", - "integrity": "sha512-IGGyazghVYuqsXv7/AxzMS0HmCPj0JRQX4l0XZ52BdJTUv2lNSnPgfWEE65HnC2gZCEO7STyaJbNultn1i0Y3g==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.2.0.tgz", + "integrity": "sha512-a8Nlw5fv2EIAFJxTDSSDVUT7yfBGpZO96ybZXzQpgkyLg/dxtQ1uiwTc0EGfzg1mrPjZokeBSEGTbGXekqTNOg==", "requires": { "cluster-key-slot": "1.1.0", "generic-pool": "3.8.2", @@ -28239,9 +28239,9 @@ } }, "npm-check-updates": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-15.0.2.tgz", - "integrity": "sha512-ZSmNUm2Cl8K7VZBhLY4/AE2NHmZfR4glKoRZIeJrgg5bvFP1LhRBU3tdS+IX1+MLoUvpF2L+Q7oD5QO+nBOm+Q==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-15.2.0.tgz", + "integrity": "sha512-QcNQE3FyOsolWD1Nc+DRryffuBf68fXqVDvN5gBMk3BSaRQ+urZCTfm9By0VuPPA2vrDBRPVgYZB+8L9UN4Avw==", "dev": true, "requires": { "chalk": "^4.1.2", @@ -28262,7 +28262,7 @@ "pacote": "^13.6.1", "parse-github-url": "^1.0.2", "progress": "^2.0.3", - "prompts-ncu": "^2.5.0", + "prompts-ncu": "^2.5.1", "rc-config-loader": "^4.1.0", "remote-git-tags": "^3.0.0", "rimraf": "^3.0.2", @@ -29415,9 +29415,9 @@ } }, "prompts-ncu": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/prompts-ncu/-/prompts-ncu-2.5.0.tgz", - "integrity": "sha512-a9WdInrG7zSlmfzDszmF3r8O4grZRI8+ChV0LtagHRT4dH7F+kxkrwFPGxeS83FZgAGBx3AXoLP+c4kGJb1P3w==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/prompts-ncu/-/prompts-ncu-2.5.1.tgz", + "integrity": "sha512-Hdd7GgV7b76Yh9FP9HL1D9xqtJCJdVPpiM2vDtuoc8W1KfweJe15gutFYmxkq83ViFaagFM8K0UcPCQ/tZq8bA==", "dev": true, "requires": { "kleur": "^4.0.1", @@ -29789,12 +29789,12 @@ } }, "redis": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/redis/-/redis-4.1.1.tgz", - "integrity": "sha512-vVLYD0RMiDH4YQ1dtmtNU0RX5MAsvEA35Wj+4ZhrSNZXtGK87ktQ0lmI3O3Qn/omoIW456wfOUanqI/RNxagLw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.2.0.tgz", + "integrity": "sha512-bCR0gKVhIXFg8zCQjXEANzgI01DDixtPZgIUZHBCmwqixnu+MK3Tb2yqGjh+HCLASQVVgApiwhNkv+FoedZOGQ==", "requires": { "@redis/bloom": "1.0.2", - "@redis/client": "1.1.1", + "@redis/client": "1.2.0", "@redis/graph": "1.0.1", "@redis/json": "1.0.3", "@redis/search": "1.0.6", diff --git a/package.json b/package.json index f5f653e95..b22944319 100644 --- a/package.json +++ b/package.json @@ -55,20 +55,20 @@ "url": "git@github.com:mojaloop/sdk-scheme-adapter.git" }, "dependencies": { - "@koa/cors": "^3.1.0", + "@koa/cors": "^3.3.0", "@mojaloop/central-services-shared": "17.0.2", "@mojaloop/sdk-standard-components": "^17.1.0", "ajv": "8.11.0", "axios": "^0.27.2", "co-body": "^6.1.0", "dotenv": "^16.0.1", - "env-var": "^7.0.1", - "express": "^4.17.2", + "env-var": "^7.1.1", + "express": "^4.18.1", "fast-json-patch": "^3.1.1", "javascript-state-machine": "^3.1.0", "js-yaml": "^4.1.0", "json-schema-ref-parser": "^9.0.9", - "koa": "^2.13.1", + "koa": "^2.13.4", "koa-body": "^5.0.0", "lodash": "^4.17.21", "module-alias": "^2.2.2", @@ -77,30 +77,30 @@ "prom-client": "^14.0.1", "promise-timeout": "^1.3.0", "random-word-slugs": "^0.1.6", - "redis": "^4.1.1", - "uuidv4": "^6.2.12", + "redis": "^4.2.0", + "uuidv4": "^6.2.13", "ws": "^8.8.0" }, "devDependencies": { "@babel/core": "^7.18.6", "@babel/preset-env": "^7.18.6", "@mojaloop/api-snippets": "^14.0.0", - "@redocly/openapi-cli": "^1.0.0-beta.59", + "@redocly/openapi-cli": "^1.0.0-beta.94", "@types/jest": "^28.1.4", "babel-jest": "^28.1.2", "eslint": "^8.19.0", "eslint-config-airbnb-base": "^15.0.0", - "eslint-plugin-import": "^2.24.2", + "eslint-plugin-import": "^2.26.0", "eslint-plugin-jest": "^26.5.3", "jest": "^28.1.2", "jest-junit": "^14.0.0", "nock": "^13.2.8", "npm-audit-resolver": "^3.0.0-0", - "npm-check-updates": "^15.0.2", + "npm-check-updates": "^15.2.0", "openapi-response-validator": "^12.0.0", "openapi-typescript": "^5.4.0", "redis-mock": "^0.56.3", - "standard-version": "^9.3.1", + "standard-version": "^9.5.0", "supertest": "^6.2.4", "swagger-cli": "^4.0.4" } diff --git a/src/lib/model/AccountsModel.js b/src/lib/model/AccountsModel.js index 6f73db582..4f2ccac6a 100644 --- a/src/lib/model/AccountsModel.js +++ b/src/lib/model/AccountsModel.js @@ -16,10 +16,7 @@ const StateMachine = require('javascript-state-machine'); const { MojaloopRequests, Errors } = require('@mojaloop/sdk-standard-components'); const { BackendError } = require('./common'); -const stateEnum = { - 'ERROR_OCCURRED': 'ERROR_OCCURRED', - 'COMPLETED': 'COMPLETED', -}; +const { SDKStateEnum } = require('./common'); /** @@ -283,11 +280,11 @@ class AccountsModel { switch(this._data.currentState) { case 'succeeded': - resp.currentState = stateEnum.COMPLETED; + resp.currentState = SDKStateEnum.COMPLETED; break; case 'errored': - resp.currentState = stateEnum.ERROR_OCCURRED; + resp.currentState = SDKStateEnum.ERROR_OCCURRED; break; default: @@ -295,7 +292,7 @@ class AccountsModel { `Account model response being returned from an unexpected state: ${this._data.currentState}. ` + 'Returning ERROR_OCCURRED state' ); - resp.currentState = stateEnum.ERROR_OCCURRED; + resp.currentState = SDKStateEnum.ERROR_OCCURRED; break; } return resp; diff --git a/src/lib/model/Async2SyncModel.js b/src/lib/model/Async2SyncModel.js index 366062a07..f79e018e3 100644 --- a/src/lib/model/Async2SyncModel.js +++ b/src/lib/model/Async2SyncModel.js @@ -12,6 +12,7 @@ const util = require('util'); const PSM = require('./common').PersistentStateMachine; +const { SDKStateEnum } = require('./common'); const MojaloopRequests = require('@mojaloop/sdk-standard-components').MojaloopRequests; const deferredJob = require('./lib').deferredJob; @@ -123,9 +124,9 @@ function generate({ } const mapCurrentState = { - start: 'WAITING_FOR_ACTION', - succeeded: 'COMPLETED', - errored: 'ERROR_OCCURRED' + start: SDKStateEnum.WAITING_FOR_ACTION, + succeeded: SDKStateEnum.COMPLETED, + errored: SDKStateEnum.ERROR_OCCURRED }; /** diff --git a/src/lib/model/InboundTransfersModel.js b/src/lib/model/InboundTransfersModel.js index 099821e22..0916b450a 100644 --- a/src/lib/model/InboundTransfersModel.js +++ b/src/lib/model/InboundTransfersModel.js @@ -22,7 +22,9 @@ const { Errors, } = require('@mojaloop/sdk-standard-components'); const shared = require('./lib/shared'); -const { TransferStateEnum } = require('./common'); +const { SDKStateEnum } = require('./common'); +const FSPIOPTransferStateEnum = require('@mojaloop/central-services-shared').Enum.Transfers.TransferState; +const FSPIOPBulkTransferStateEnum = require('@mojaloop/central-services-shared').Enum.Transfers.BulkTransferState; /** * Models the operations required for performing inbound transfers @@ -74,7 +76,7 @@ class InboundTransfersModel { updateStateWithError(err) { this.data.lastError = err; - this.data.currentState = TransferStateEnum.ERROR_OCCURRED; + this.data.currentState = SDKStateEnum.ERROR_OCCURRED; return this._save(); } @@ -188,7 +190,7 @@ class InboundTransfersModel { headers: request.headers, body: request.body }, - currentState: TransferStateEnum.QUOTE_REQUEST_RECEIVED, + currentState: SDKStateEnum.QUOTE_REQUEST_RECEIVED, initiatedTimestamp: new Date().toISOString(), }; @@ -237,7 +239,7 @@ class InboundTransfersModel { headers: res.originalRequest.headers, body: res.originalRequest.body, }; - this.data.currentState = TransferStateEnum.WAITING_FOR_QUOTE_ACCEPTANCE; + this.data.currentState = SDKStateEnum.WAITING_FOR_QUOTE_ACCEPTANCE; await this._save(); return res; } @@ -342,7 +344,7 @@ class InboundTransfersModel { // persist our state so we have a record if we crash during processing the prepare this.data.prepare = request; - this.data.currentState = TransferStateEnum.PREPARE_RECEIVED; + this.data.currentState = SDKStateEnum.PREPARE_RECEIVED; await this._save(); // Calculate or retrieve fulfilment and condition @@ -390,7 +392,7 @@ class InboundTransfersModel { // create a mojaloop transfer fulfil response const mojaloopResponse = { completedTimestamp: response.completedTimestamp || new Date(), - transferState: response.transferState || (this._reserveNotification ? TransferStateEnum.RESERVED : TransferStateEnum.COMPLETED), + transferState: response.transferState || (this._reserveNotification ? FSPIOPTransferStateEnum.RESERVED : FSPIOPTransferStateEnum.COMMITTED), fulfilment: response.fulfilment || fulfilment, ...response.extensionList && { extensionList: { @@ -406,7 +408,7 @@ class InboundTransfersModel { headers: res.originalRequest.headers, body: res.originalRequest.body, }; - this.data.currentState = response.transferState || (this._reserveNotification ? TransferStateEnum.RESERVED : TransferStateEnum.COMPLETED); + this.data.currentState = response.transferState || (this._reserveNotification ? SDKStateEnum.RESERVED : SDKStateEnum.COMPLETED); await this._save(); return res; } catch(err) { @@ -679,7 +681,7 @@ class InboundTransfersModel { // create a mojaloop transfer fulfil response const mojaloopResponse = { completedTimestamp: new Date(), - bulkTransferState: 'COMMITTED', + bulkTransferState: FSPIOPBulkTransferStateEnum.COMMITTED, }; if (response.individualTransferResults && response.individualTransferResults.length) { @@ -784,18 +786,18 @@ class InboundTransfersModel { // tag the final notification body on to the state this.data.finalNotification = body; - if(body.transferState === 'COMMITTED') { + if(body.transferState === FSPIOPTransferStateEnum.COMMITTED) { // if the transfer was successful in the switch, set the overall transfer state to COMPLETED - this.data.currentState = TransferStateEnum.COMPLETED; + this.data.currentState = SDKStateEnum.COMPLETED; } - else if(body.transferState === 'ABORTED') { + else if(body.transferState === FSPIOPTransferStateEnum.ABORTED) { // if the transfer was ABORTED in the switch, set the overall transfer state to ABORTED - this.data.currentState = TransferStateEnum.ABORTED; + this.data.currentState = SDKStateEnum.ABORTED; } else { // if the final notification has anything other than COMMITTED as the final state, set an error // in the transfer state. - this.data.currentState = TransferStateEnum.ERROR_OCCURED; + this.data.currentState = SDKStateEnum.ERROR_OCCURED; this.data.lastError = 'Final notification state not COMMITTED'; } @@ -845,7 +847,7 @@ class InboundTransfersModel { originalError: err.stack || util.inspect(err), mojaloopError: mojaloopError, }; - this.data.currentState = TransferStateEnum.ERROR_OCCURRED; + this.data.currentState = SDKStateEnum.ERROR_OCCURRED; await this._save(); } return mojaloopError; diff --git a/src/lib/model/OutboundBulkQuotesModel.js b/src/lib/model/OutboundBulkQuotesModel.js index 950219193..725dbc8d9 100644 --- a/src/lib/model/OutboundBulkQuotesModel.js +++ b/src/lib/model/OutboundBulkQuotesModel.js @@ -17,10 +17,7 @@ const { MojaloopRequests } = require('@mojaloop/sdk-standard-components'); const shared = require('./lib/shared'); const { BackendError } = require('./common'); -const stateEnum = { - 'ERROR_OCCURRED': 'ERROR_OCCURRED', - 'COMPLETED': 'COMPLETED', -}; +const { SDKStateEnum } = require('./common'); /** @@ -381,16 +378,16 @@ class OutboundBulkQuotesModel { switch(this.data.currentState) { case 'succeeded': - resp.currentState = stateEnum.COMPLETED; + resp.currentState = SDKStateEnum.COMPLETED; break; case 'errored': - resp.currentState = stateEnum.ERROR_OCCURRED; + resp.currentState = SDKStateEnum.ERROR_OCCURRED; break; default: this._logger.log(`Bulk quote model response being returned from an unexpected state: ${this.data.currentState}. Returning ERROR_OCCURRED state`); - resp.currentState = stateEnum.ERROR_OCCURRED; + resp.currentState = SDKStateEnum.ERROR_OCCURRED; break; } diff --git a/src/lib/model/OutboundBulkTransfersModel.js b/src/lib/model/OutboundBulkTransfersModel.js index e79997563..151c50ab3 100644 --- a/src/lib/model/OutboundBulkTransfersModel.js +++ b/src/lib/model/OutboundBulkTransfersModel.js @@ -16,10 +16,7 @@ const StateMachine = require('javascript-state-machine'); const { MojaloopRequests } = require('@mojaloop/sdk-standard-components'); const { BackendError } = require('./common'); -const stateEnum = { - 'ERROR_OCCURRED': 'ERROR_OCCURRED', - 'COMPLETED': 'COMPLETED', -}; +const { SDKStateEnum } = require('./common'); /** * Models the state machine and operations required for performing an outbound bulk transfer @@ -373,16 +370,16 @@ class OutboundBulkTransfersModel { switch(this.data.currentState) { case 'succeeded': - resp.currentState = stateEnum.COMPLETED; + resp.currentState = SDKStateEnum.COMPLETED; break; case 'errored': - resp.currentState = stateEnum.ERROR_OCCURRED; + resp.currentState = SDKStateEnum.ERROR_OCCURRED; break; default: this._logger.log(`Bulk transfer model response being returned from an unexpected state: ${this.data.currentState}. Returning ERROR_OCCURRED state`); - resp.currentState = stateEnum.ERROR_OCCURRED; + resp.currentState = SDKStateEnum.ERROR_OCCURRED; break; } diff --git a/src/lib/model/OutboundRequestToPayModel.js b/src/lib/model/OutboundRequestToPayModel.js index 0ad13e1f9..617e6591a 100644 --- a/src/lib/model/OutboundRequestToPayModel.js +++ b/src/lib/model/OutboundRequestToPayModel.js @@ -17,12 +17,7 @@ const { MojaloopRequests } = require('@mojaloop/sdk-standard-components'); const { BackendError } = require('./common'); const PartiesModel = require('./PartiesModel'); -const transferStateEnum = { - 'WAITING_FOR_PARTY_ACCEPTANCE': 'WAITING_FOR_PARTY_ACCEPTANCE', - 'WAITING_FOR_QUOTE_ACCEPTANCE': 'WAITING_FOR_QUOTE_ACCEPTANCE', - 'ERROR_OCCURRED': 'ERROR_OCCURRED', - 'COMPLETED': 'COMPLETED', -}; +const { SDKStateEnum } = require('./common'); class OutboundRequestToPayModel { @@ -480,20 +475,20 @@ class OutboundRequestToPayModel { switch(this.data.currentState) { case 'payeeResolved': - resp.currentState = transferStateEnum.WAITING_FOR_PARTY_ACCEPTANCE; + resp.currentState = SDKStateEnum.WAITING_FOR_PARTY_ACCEPTANCE; break; case 'succeeded': - resp.currentState = transferStateEnum.COMPLETED; + resp.currentState = SDKStateEnum.COMPLETED; break; case 'errored': - resp.currentState = transferStateEnum.ERROR_OCCURRED; + resp.currentState = SDKStateEnum.ERROR_OCCURRED; break; default: this._logger.log(`Transaction Request model response being returned from an unexpected state: ${this.data.currentState}. Returning ERROR_OCCURRED state`); - resp.currentState = transferStateEnum.ERROR_OCCURRED; + resp.currentState = SDKStateEnum.ERROR_OCCURRED; break; } diff --git a/src/lib/model/OutboundRequestToPayTransferModel.js b/src/lib/model/OutboundRequestToPayTransferModel.js index 17505f7cb..f9890bc26 100644 --- a/src/lib/model/OutboundRequestToPayTransferModel.js +++ b/src/lib/model/OutboundRequestToPayTransferModel.js @@ -18,13 +18,7 @@ const shared = require('./lib/shared'); const { BackendError } = require('./common'); const PartiesModel = require('./PartiesModel'); -const requestToPayTransferStateEnum = { - 'WAITING_FOR_QUOTE_ACCEPTANCE': 'WAITING_FOR_QUOTE_ACCEPTANCE', - 'WAITING_FOR_OTP_ACCEPTANCE': 'WAITING_FOR_OTP_ACCEPTANCE', - 'ERROR_OCCURRED': 'ERROR_OCCURRED', - 'COMPLETED': 'COMPLETED', -}; - +const { SDKStateEnum } = require('./common'); /** * Models the state machine and operations required for performing an outbound transfer @@ -826,24 +820,24 @@ class OutboundRequestToPayTransferModel { switch(this.data.currentState) { case 'quoteReceived': - resp.currentState = requestToPayTransferStateEnum.WAITING_FOR_QUOTE_ACCEPTANCE; + resp.currentState = SDKStateEnum.WAITING_FOR_QUOTE_ACCEPTANCE; break; case 'otpReceived': - resp.currentState = requestToPayTransferStateEnum.WAITING_FOR_OTP_ACCEPTANCE; + resp.currentState = SDKStateEnum.WAITING_FOR_OTP_ACCEPTANCE; break; case 'succeeded': - resp.currentState = requestToPayTransferStateEnum.COMPLETED; + resp.currentState = SDKStateEnum.COMPLETED; break; case 'errored': - resp.currentState = requestToPayTransferStateEnum.ERROR_OCCURRED; + resp.currentState = SDKStateEnum.ERROR_OCCURRED; break; default: this._logger.log(`Transfer model response being returned from an unexpected state: ${this.data.currentState}. Returning ERROR_OCCURRED state`); - resp.currentState = requestToPayTransferStateEnum.ERROR_OCCURRED; + resp.currentState = SDKStateEnum.ERROR_OCCURRED; break; } diff --git a/src/lib/model/OutboundTransfersModel.js b/src/lib/model/OutboundTransfersModel.js index 075ed4333..7ab3b4bb7 100644 --- a/src/lib/model/OutboundTransfersModel.js +++ b/src/lib/model/OutboundTransfersModel.js @@ -15,7 +15,8 @@ const { uuid } = require('uuidv4'); const StateMachine = require('javascript-state-machine'); const { Ilp, MojaloopRequests } = require('@mojaloop/sdk-standard-components'); const shared = require('./lib/shared'); -const { BackendError, TransferStateEnum } = require('./common'); +const { BackendError, SDKStateEnum } = require('./common'); +const FSPIOPTransferStateEnum = require('@mojaloop/central-services-shared').Enum.Transfers.TransferState; const PartiesModel = require('./PartiesModel'); /** @@ -685,7 +686,7 @@ class OutboundTransfersModel { if(this._checkIlp && !this._ilp.validateFulfil(fulfil.body.fulfilment, this.data.quoteResponse.body.condition)) { throw new Error('Invalid fulfilment received from peer DFSP.'); } - if(this._sendFinalNotificationIfRequested && fulfil.body.transferState === 'RESERVED') { + if(this._sendFinalNotificationIfRequested && fulfil.body.transferState === FSPIOPTransferStateEnum.RESERVED) { // we need to send a PATCH notification back to say we have committed the transfer. // Note that this is normally a switch only responsibility but the capability is // implemented here to support testing use cases where the mojaloop-connector is @@ -695,7 +696,7 @@ class OutboundTransfersModel { // we will use the current server time as committed timestamp. const patchNotification = { completedTimestamp: (new Date()).toISOString(), - transferState: 'COMMITTED', + transferState: FSPIOPTransferStateEnum.COMMITTED, }; const res = this._requests.patchTransfers(this.data.transferId, patchNotification, this.data.quoteResponseSource); @@ -885,28 +886,28 @@ class OutboundTransfersModel { switch(this.data.currentState) { case 'payeeResolved': - resp.currentState = TransferStateEnum.WAITING_FOR_PARTY_ACCEPTANCE; + resp.currentState = SDKStateEnum.WAITING_FOR_PARTY_ACCEPTANCE; break; case 'quoteReceived': - resp.currentState = TransferStateEnum.WAITING_FOR_QUOTE_ACCEPTANCE; + resp.currentState = SDKStateEnum.WAITING_FOR_QUOTE_ACCEPTANCE; break; case 'succeeded': - resp.currentState = TransferStateEnum.COMPLETED; + resp.currentState = SDKStateEnum.COMPLETED; break; case 'aborted': - resp.currentState = TransferStateEnum.ABORTED; + resp.currentState = SDKStateEnum.ABORTED; break; case 'errored': - resp.currentState = TransferStateEnum.ERROR_OCCURRED; + resp.currentState = SDKStateEnum.ERROR_OCCURRED; break; default: this._logger.log(`Transfer model response being returned from an unexpected state: ${this.data.currentState}. Returning ERROR_OCCURRED state`); - resp.currentState = TransferStateEnum.ERROR_OCCURRED; + resp.currentState = SDKStateEnum.ERROR_OCCURRED; break; } diff --git a/src/lib/model/common/BackendError.js b/src/lib/model/common/BackendError.js index 2fcd76e8f..4b35593ec 100644 --- a/src/lib/model/common/BackendError.js +++ b/src/lib/model/common/BackendError.js @@ -10,17 +10,6 @@ 'use strict'; -const TransferStateEnum = { - 'WAITING_FOR_PARTY_ACCEPTANCE': 'WAITING_FOR_PARTY_ACCEPTANCE', - 'QUOTE_REQUEST_RECEIVED': 'QUOTE_REQUEST_RECEIVED', - 'WAITING_FOR_QUOTE_ACCEPTANCE': 'WAITING_FOR_QUOTE_ACCEPTANCE', - 'PREPARE_RECEIVED': 'PREPARE_RECEIVED', - 'ERROR_OCCURRED': 'ERROR_OCCURRED', - 'COMPLETED': 'COMPLETED', - 'ABORTED': 'ABORTED', - 'RESERVED': 'RESERVED', -}; - class BackendError extends Error { constructor(msg, httpStatusCode) { super(msg); @@ -45,6 +34,5 @@ class BackendError extends Error { module.exports = { - BackendError, - TransferStateEnum, + BackendError }; diff --git a/src/lib/model/common/Enums.js b/src/lib/model/common/Enums.js new file mode 100644 index 000000000..8c9f83082 --- /dev/null +++ b/src/lib/model/common/Enums.js @@ -0,0 +1,30 @@ + +/************************************************************************** + * (C) Copyright ModusBox Inc. 2019 - All rights reserved. * + * * + * This file is made available under the terms of the license agreement * + * specified in the corresponding source code repository. * + * * + * ORIGINAL AUTHOR: * + * Yevhen Kyriukha - yevhen.kyriukha@modusbox.com * + **************************************************************************/ + +'use strict'; + +// NOTE: Stick all common SDK ENUMS here. SDKStateEnum is the first attempt at consolidating and cleaning up ENUMS in the SDK. + +const SDKStateEnum = { + WAITING_FOR_ACTION: 'WAITING_FOR_ACTION', + WAITING_FOR_PARTY_ACCEPTANCE: 'WAITING_FOR_PARTY_ACCEPTANCE', + QUOTE_REQUEST_RECEIVED: 'QUOTE_REQUEST_RECEIVED', + WAITING_FOR_QUOTE_ACCEPTANCE: 'WAITING_FOR_QUOTE_ACCEPTANCE', + PREPARE_RECEIVED: 'PREPARE_RECEIVED', + ERROR_OCCURRED: 'ERROR_OCCURRED', + COMPLETED: 'COMPLETED', + ABORTED: 'ABORTED', + RESERVED: 'RESERVED', +}; + +module.exports = { + SDKStateEnum, +}; diff --git a/src/lib/model/common/index.js b/src/lib/model/common/index.js index 2aa968f30..1ec95dcc1 100644 --- a/src/lib/model/common/index.js +++ b/src/lib/model/common/index.js @@ -9,11 +9,12 @@ **************************************************************************/ 'use strict'; -const { BackendError, TransferStateEnum } = require('./BackendError'); +const { SDKStateEnum } = require('./Enums'); +const { BackendError } = require('./BackendError'); const PersistentStateMachine = require('./PersistentStateMachine'); module.exports = { BackendError, - TransferStateEnum, + SDKStateEnum, PersistentStateMachine }; diff --git a/test/integration/lib/Outbound/parties.test.js b/test/integration/lib/Outbound/parties.test.js index eed8bf9ef..1677b6eb0 100644 --- a/test/integration/lib/Outbound/parties.test.js +++ b/test/integration/lib/Outbound/parties.test.js @@ -2,6 +2,7 @@ const axios = require('axios'); const env = require('../../testEnv'); +const { SDKStateEnum } = require('../../../../src/lib/model/common'); jest.dontMock('redis'); @@ -12,7 +13,7 @@ describe('/parties', () => { const res = await axios.get(getPartiesURI); expect(res.status).toEqual(200); - expect(res.data.currentState).toEqual('COMPLETED'); + expect(res.data.currentState).toEqual(SDKStateEnum.COMPLETED); expect(typeof res.data.party).toEqual('object'); expect(typeof res.data.party.body).toEqual('object'); expect(typeof res.data.party.headers).toEqual('object'); diff --git a/test/integration/lib/Outbound/quotes.test.js b/test/integration/lib/Outbound/quotes.test.js index 898da31d7..e4ca533ff 100644 --- a/test/integration/lib/Outbound/quotes.test.js +++ b/test/integration/lib/Outbound/quotes.test.js @@ -4,6 +4,8 @@ const axios = require('axios'); const { uuid } = require('uuidv4'); const env = require('../../testEnv'); const quotesPostRequest = require('./data/quotesPostRequest.json'); +const { SDKStateEnum } = require('../../../../src/lib/model/common'); + jest.dontMock('redis'); @@ -28,7 +30,7 @@ describe('/quotes', () => { }); expect(res.status).toEqual(200); - expect(res.data.currentState).toEqual('COMPLETED'); + expect(res.data.currentState).toEqual(SDKStateEnum.COMPLETED); expect(typeof res.data.quotes).toEqual('object'); expect(typeof res.data.quotes.body).toEqual('object'); expect(typeof res.data.quotes.headers).toEqual('object'); diff --git a/test/integration/lib/Outbound/simpleTransfers.test.js b/test/integration/lib/Outbound/simpleTransfers.test.js index 7edfba57a..b0001e969 100644 --- a/test/integration/lib/Outbound/simpleTransfers.test.js +++ b/test/integration/lib/Outbound/simpleTransfers.test.js @@ -4,6 +4,7 @@ const axios = require('axios'); const { uuid } = require('uuidv4'); const env = require('../../testEnv'); const transfersPostRequest = require('./data/transfersPostRequest.json'); +const { SDKStateEnum } = require('../../../../src/lib/model/common'); jest.dontMock('redis'); @@ -37,7 +38,7 @@ describe('/simpleTransfers', () => { }); expect(res.status).toEqual(200); - expect(res.data.currentState).toEqual('COMPLETED'); + expect(res.data.currentState).toEqual(SDKStateEnum.COMPLETED); expect(typeof res.data.transfer).toEqual('object'); expect(typeof res.data.transfer.body).toEqual('object'); expect(typeof res.data.transfer.headers).toEqual('object'); diff --git a/test/unit/inboundApi/handlers.test.js b/test/unit/inboundApi/handlers.test.js index 2ee98efa3..89558162d 100644 --- a/test/unit/inboundApi/handlers.test.js +++ b/test/unit/inboundApi/handlers.test.js @@ -22,6 +22,8 @@ const mockArguments = require('./data/mockArguments'); const mockTransactionRequestData = require('./data/mockTransactionRequest'); const { Logger } = require('@mojaloop/sdk-standard-components'); +const FSPIOPTransferStateEnum = require('@mojaloop/central-services-shared').Enum.Transfers.TransferState; + describe('Inbound API handlers:', () => { let mockArgs; let mockTransactionRequest; @@ -549,7 +551,7 @@ describe('Inbound API handlers:', () => { }, body: { - transferState: 'COMMITTED', + transferState: FSPIOPTransferStateEnum.COMMITTED, completedTimestamp: '2020-08-18T09:39:33.552Z' } }, diff --git a/test/unit/lib/model/AccountsModel.test.js b/test/unit/lib/model/AccountsModel.test.js index fd8404c50..96df14412 100644 --- a/test/unit/lib/model/AccountsModel.test.js +++ b/test/unit/lib/model/AccountsModel.test.js @@ -19,6 +19,7 @@ const { AccountsModel } = require('~/lib/model'); const StateMachine = require('javascript-state-machine'); const { MojaloopRequests, Logger } = require('@mojaloop/sdk-standard-components'); +const { SDKStateEnum } = require('../../../../src/lib/model/common'); const defaultConfig = require('./data/defaultConfig'); const transferRequest = require('./data/transferRequest'); @@ -83,7 +84,7 @@ describe('AccountsModel', () => { (Math.floor(count / MAX_ITEMS_PER_REQUEST) + ((count % MAX_ITEMS_PER_REQUEST) ? 1 : 0)); expect(MojaloopRequests.__postParticipants).toHaveBeenCalledTimes(expectedRequestsCount); - expect(result.currentState).toBe('COMPLETED'); + expect(result.currentState).toBe(SDKStateEnum.COMPLETED); expect(StateMachine.__instance.state).toBe('succeeded'); } diff --git a/test/unit/lib/model/InboundTransfersModel.test.js b/test/unit/lib/model/InboundTransfersModel.test.js index 6d7f6fe6a..65928e04b 100644 --- a/test/unit/lib/model/InboundTransfersModel.test.js +++ b/test/unit/lib/model/InboundTransfersModel.test.js @@ -31,6 +31,10 @@ const notificationToPayee = require('./data/notificationToPayee'); const notificationAbortedToPayee = require('./data/notificationAbortedToPayee'); const notificationReservedToPayee = require('./data/notificationReservedToPayee'); +const { SDKStateEnum } = require('../../../../src/lib/model/common'); +const FSPIOPTransferStateEnum = require('@mojaloop/central-services-shared').Enum.Transfers.TransferState; +const FSPIOPBulkTransferStateEnum = require('@mojaloop/central-services-shared').Enum.Transfers.BulkTransferState; + describe('inboundModel', () => { let config; let mockArgs; @@ -324,7 +328,7 @@ describe('inboundModel', () => { const call = MojaloopRequests.__putTransfers.mock.calls[0]; expect(call[0]).toEqual(TRANSFER_ID); expect(call[1]).toEqual(getTransfersMojaloopResponse); - expect(call[1].transferState).toEqual('COMMITTED'); + expect(call[1].transferState).toEqual(FSPIOPTransferStateEnum.COMMITTED); }); test('getTransfer should not return fulfillment from payer', async () => { @@ -345,7 +349,7 @@ describe('inboundModel', () => { const call = MojaloopRequests.__putTransfers.mock.calls[0]; expect(call[0]).toEqual(TRANSFER_ID); expect(call[1]).toEqual({...getTransfersMojaloopResponse, fulfilment: undefined}); - expect(call[1].transferState).toEqual('COMMITTED'); + expect(call[1].transferState).toEqual(FSPIOPTransferStateEnum.COMMITTED); }); test('getTransfer should return not found error', async () => { @@ -601,7 +605,7 @@ describe('inboundModel', () => { const call = MojaloopRequests.__putBulkTransfers.mock.calls[0]; expect(call[0]).toEqual(BULK_TRANSFER_ID); expect(call[1]).toEqual(getBulkTransfersMojaloopResponse); - expect(call[1].bulkTransferState).toEqual('COMMITTED'); + expect(call[1].bulkTransferState).toEqual(FSPIOPBulkTransferStateEnum.COMPLETED); }); test('getBulkTransfer should not return fulfillment from payer', async () => { @@ -621,7 +625,7 @@ describe('inboundModel', () => { const call = MojaloopRequests.__putBulkTransfers.mock.calls[0]; expect(call[0]).toEqual(BULK_TRANSFER_ID); - expect(call[1].bulkTransferState).toEqual('COMMITTED'); + expect(call[1].bulkTransferState).toEqual(FSPIOPBulkTransferStateEnum.COMPLETED); const expectedResponse = {...getBulkTransfersMojaloopResponse}; expectedResponse.individualTransferResults[0].fulfilment = undefined; expect(call[1]).toMatchObject(expectedResponse); @@ -738,7 +742,7 @@ describe('inboundModel', () => { const notif = JSON.parse(JSON.stringify(notificationToPayee)); const expectedRequest = { - currentState: 'COMPLETED', + currentState: SDKStateEnum.COMPLETED, finalNotification: notif.data, }; @@ -760,7 +764,7 @@ describe('inboundModel', () => { const notif = JSON.parse(JSON.stringify(notificationAbortedToPayee)); const expectedRequest = { - currentState: 'ABORTED', + currentState: SDKStateEnum.ABORTED, finalNotification: notif.data, }; diff --git a/test/unit/lib/model/OutboundBulkQuotesModel.test.js b/test/unit/lib/model/OutboundBulkQuotesModel.test.js index c3bb09716..bb621b891 100644 --- a/test/unit/lib/model/OutboundBulkQuotesModel.test.js +++ b/test/unit/lib/model/OutboundBulkQuotesModel.test.js @@ -20,6 +20,8 @@ const Model = require('~/lib/model').OutboundBulkQuotesModel; const { MojaloopRequests, Logger } = require('@mojaloop/sdk-standard-components'); const StateMachine = require('javascript-state-machine'); +const { SDKStateEnum } = require('../../../../src/lib/model/common'); + const defaultConfig = require('./data/defaultConfig'); const bulkQuoteRequest = require('./data/bulkQuoteRequest'); const bulkQuoteResponseTemplate = require('./data/bulkQuoteResponse'); @@ -74,7 +76,7 @@ describe('OutboundBulkQuotesModel', () => { await expect(model.run()).rejects.toThrowError(expectError); } else { const result = await model.run(); - await expect(result.currentState).toBe('COMPLETED'); + await expect(result.currentState).toBe(SDKStateEnum.COMPLETED); } } @@ -139,7 +141,7 @@ describe('OutboundBulkQuotesModel', () => { expect(MojaloopRequests.__getBulkQuotes).toHaveBeenCalledTimes(1); // check we stopped at succeeded state - expect(result.currentState).toBe('COMPLETED'); + expect(result.currentState).toBe(SDKStateEnum.COMPLETED); expect(StateMachine.__instance.state).toBe('succeeded'); }); @@ -174,7 +176,7 @@ describe('OutboundBulkQuotesModel', () => { expect(MojaloopRequests.__postBulkQuotes).toHaveBeenCalledTimes(1); // check we stopped at 'succeeded' state - expect(result.currentState).toBe('COMPLETED'); + expect(result.currentState).toBe(SDKStateEnum.COMPLETED); expect(StateMachine.__instance.state).toBe('succeeded'); }); diff --git a/test/unit/lib/model/OutboundBulkTransfersModel.test.js b/test/unit/lib/model/OutboundBulkTransfersModel.test.js index 7d5346865..ce0ce9f50 100644 --- a/test/unit/lib/model/OutboundBulkTransfersModel.test.js +++ b/test/unit/lib/model/OutboundBulkTransfersModel.test.js @@ -19,6 +19,7 @@ const Model = require('~/lib/model').OutboundBulkTransfersModel; const { MojaloopRequests, Logger } = require('@mojaloop/sdk-standard-components'); const StateMachine = require('javascript-state-machine'); +const { SDKStateEnum } = require('../../../../src/lib/model/common'); const defaultConfig = require('./data/defaultConfig'); const bulkTransferRequest = require('./data/bulkTransferRequest'); @@ -70,7 +71,7 @@ describe('outboundBulkTransferModel', () => { await expect(model.run()).rejects.toThrowError(expectError); } else { const result = await model.run(); - await expect(result.currentState).toBe('COMPLETED'); + await expect(result.currentState).toBe(SDKStateEnum.COMPLETED); } } @@ -136,7 +137,7 @@ describe('outboundBulkTransferModel', () => { expect(MojaloopRequests.__postBulkTransfers).toHaveBeenCalledTimes(1); // check we stopped at succeeded state - expect(result.currentState).toBe('COMPLETED'); + expect(result.currentState).toBe(SDKStateEnum.COMPLETED); expect(StateMachine.__instance.state).toBe('succeeded'); }); @@ -168,7 +169,7 @@ describe('outboundBulkTransferModel', () => { expect(MojaloopRequests.__getBulkTransfers).toHaveBeenCalledTimes(1); // check we stopped at succeeded state - expect(result.currentState).toBe('COMPLETED'); + expect(result.currentState).toBe(SDKStateEnum.COMPLETED); expect(StateMachine.__instance.state).toBe('succeeded'); }); diff --git a/test/unit/lib/model/OutboundRequestToPayModel.test.js b/test/unit/lib/model/OutboundRequestToPayModel.test.js index 20dcc9531..48dfe0a3e 100644 --- a/test/unit/lib/model/OutboundRequestToPayModel.test.js +++ b/test/unit/lib/model/OutboundRequestToPayModel.test.js @@ -20,6 +20,7 @@ const PartiesModel = require('~/lib/model').PartiesModel; const { MojaloopRequests, Logger } = require('@mojaloop/sdk-standard-components'); const StateMachine = require('javascript-state-machine'); +const { SDKStateEnum } = require('../../../../src/lib/model/common'); const defaultConfig = require('./data/defaultConfig'); const requestToPayRequest = require('./data/requestToPayRequest'); @@ -124,7 +125,7 @@ describe('outboundModel', () => { expect(MojaloopRequests.__postTransactionRequests).toHaveBeenCalledTimes(1); // check we stopped at payeeResolved state - expect(result.currentState).toBe('COMPLETED'); + expect(result.currentState).toBe(SDKStateEnum.COMPLETED); expect(result.requestToPayState).toBe('RECEIVED'); expect(StateMachine.__instance.state).toBe('succeeded'); }); @@ -157,7 +158,7 @@ describe('outboundModel', () => { const result = await resultPromise; // check we stopped at payeeResolved state - expect(result.currentState).toBe('WAITING_FOR_PARTY_ACCEPTANCE'); + expect(result.currentState).toBe(SDKStateEnum.WAITING_FOR_PARTY_ACCEPTANCE); expect(StateMachine.__instance.state).toBe('payeeResolved'); }); diff --git a/test/unit/lib/model/OutboundRequestToPayTransferModel.test.js b/test/unit/lib/model/OutboundRequestToPayTransferModel.test.js index 7fb2466be..9a7a1ad49 100644 --- a/test/unit/lib/model/OutboundRequestToPayTransferModel.test.js +++ b/test/unit/lib/model/OutboundRequestToPayTransferModel.test.js @@ -19,6 +19,7 @@ const Model = require('~/lib/model').OutboundRequestToPayTransferModel; const { MojaloopRequests, Logger } = require('@mojaloop/sdk-standard-components'); const StateMachine = require('javascript-state-machine'); +const { SDKStateEnum } = require('../../../../src/lib/model/common'); const defaultConfig = require('./data/defaultConfig'); const requestToPayTransferRequest = require('./data/requestToPayTransferRequest'); @@ -154,7 +155,7 @@ describe('outboundRequestToPayTransferModel', () => { expect(MojaloopRequests.__postTransfers).toHaveBeenCalledTimes(1); // check we stopped at payeeResolved state - expect(result.currentState).toBe('COMPLETED'); + expect(result.currentState).toBe(SDKStateEnum.COMPLETED); expect(StateMachine.__instance.state).toBe('succeeded'); }); @@ -183,7 +184,7 @@ describe('outboundRequestToPayTransferModel', () => { // let result = await resultPromise; // // check we stopped at quoteReceived state - // expect(result.currentState).toBe('WAITING_FOR_QUOTE_ACCEPTANCE'); + // expect(result.currentState).toBe(SDKStateEnum.WAITING_FOR_QUOTE_ACCEPTANCE); // expect(StateMachine.__instance.state).toBe('quoteReceived'); // const requestToPayTransactionId = requestToPayTransferRequest.requestToPayTransactionId; @@ -235,7 +236,7 @@ describe('outboundRequestToPayTransferModel', () => { // result = await resultPromise; // // check we stopped at quoteReceived state - // expect(result.currentState).toBe('COMPLETED'); + // expect(result.currentState).toBe(SDKStateEnum.COMPLETED); // expect(StateMachine.__instance.state).toBe('succeeded'); // }); diff --git a/test/unit/lib/model/OutboundTransfersModel.test.js b/test/unit/lib/model/OutboundTransfersModel.test.js index 541dca3f9..c101cb11f 100644 --- a/test/unit/lib/model/OutboundTransfersModel.test.js +++ b/test/unit/lib/model/OutboundTransfersModel.test.js @@ -28,6 +28,9 @@ const payeeParty = require('./data/payeeParty'); const quoteResponseTemplate = require('./data/quoteResponse'); const transferFulfil = require('./data/transferFulfil'); +const { SDKStateEnum } = require('../../../../src/lib/model/common'); +const FSPIOPTransferStateEnum = require('@mojaloop/central-services-shared').Enum.Transfers.TransferState; + const genPartyId = (party) => { const { partyIdType, partyIdentifier, partySubIdOrType } = party.body.party.partyIdInfo; return PartiesModel.channelName({ @@ -134,7 +137,7 @@ describe('outboundModel', () => { await expect(model.run()).rejects.toThrowError(expectError); } else { const result = await model.run(); - await expect(result.currentState).toBe('COMPLETED'); + await expect(result.currentState).toBe(SDKStateEnum.COMPLETED); } } @@ -250,7 +253,7 @@ describe('outboundModel', () => { expect(MojaloopRequests.__patchTransfers).toHaveBeenCalledTimes(0); // check we stopped at payeeResolved state - expect(result.currentState).toBe('COMPLETED'); + expect(result.currentState).toBe(SDKStateEnum.COMPLETED); expect(StateMachine.__instance.state).toBe('succeeded'); }); @@ -275,7 +278,7 @@ describe('outboundModel', () => { return Promise.resolve(dummyRequestsModuleResponse); }); const pb = JSON.parse(JSON.stringify(transferFulfil)); - pb.data.body.transferState = 'RESERVED'; + pb.data.body.transferState = FSPIOPTransferStateEnum.RESERVED; MojaloopRequests.__postTransfers = jest.fn((postTransfersBody, destFspId) => { //ensure that the `MojaloopRequests.postTransfers` method has been called with the correct arguments // set as the destination FSPID, picked up from the header's value `fspiop-source` @@ -307,13 +310,13 @@ describe('outboundModel', () => { expect(MojaloopRequests.__postTransfers).toHaveBeenCalledTimes(1); expect(MojaloopRequests.__patchTransfers).toHaveBeenCalledTimes(1); expect(MojaloopRequests.__patchTransfers.mock.calls[0][0]).toEqual(model.data.transferId); - expect(MojaloopRequests.__patchTransfers.mock.calls[0][1].transferState).toEqual('COMMITTED'); + expect(MojaloopRequests.__patchTransfers.mock.calls[0][1].transferState).toEqual(FSPIOPTransferStateEnum.COMMITTED); expect(MojaloopRequests.__patchTransfers.mock.calls[0][1].completedTimestamp).not.toBeUndefined(); expect(MojaloopRequests.__patchTransfers.mock.calls[0][2]).toEqual(quoteResponse.data.headers['fspiop-source']); // check we stopped at payeeResolved state - expect(result.currentState).toBe('COMPLETED'); + expect(result.currentState).toBe(SDKStateEnum.COMPLETED); expect(StateMachine.__instance.state).toBe('succeeded'); }); @@ -396,7 +399,7 @@ describe('outboundModel', () => { expect(MojaloopRequests.__patchTransfers).toHaveBeenCalledTimes(0); // check we stopped at payeeResolved state - expect(result.currentState).toBe('COMPLETED'); + expect(result.currentState).toBe(SDKStateEnum.COMPLETED); expect(StateMachine.__instance.state).toBe('succeeded'); }); @@ -429,7 +432,7 @@ describe('outboundModel', () => { expect(MojaloopRequests.__getTransfers).toHaveBeenCalledTimes(1); // check we stopped at payeeResolved state - expect(result.currentState).toBe('COMPLETED'); + expect(result.currentState).toBe(SDKStateEnum.COMPLETED); expect(StateMachine.__instance.state).toBe('succeeded'); }); @@ -458,7 +461,7 @@ describe('outboundModel', () => { const result = await resultPromise; // check we stopped at payeeResolved state - expect(result.currentState).toBe('WAITING_FOR_PARTY_ACCEPTANCE'); + expect(result.currentState).toBe(SDKStateEnum.WAITING_FOR_PARTY_ACCEPTANCE); expect(StateMachine.__instance.state).toBe('payeeResolved'); }); @@ -490,7 +493,7 @@ describe('outboundModel', () => { const result = await resultPromise; // check we stopped at payeeResolved state - expect(result.currentState).toBe('WAITING_FOR_PARTY_ACCEPTANCE'); + expect(result.currentState).toBe(SDKStateEnum.WAITING_FOR_PARTY_ACCEPTANCE); expect(StateMachine.__instance.state).toBe('payeeResolved'); // check getParties mojaloop requests method was called with the correct arguments @@ -521,7 +524,7 @@ describe('outboundModel', () => { // wait for the model to reach a terminal state const result = await resultPromise; // check we stopped at payeeResolved state - expect(result.currentState).toBe('WAITING_FOR_PARTY_ACCEPTANCE'); + expect(result.currentState).toBe(SDKStateEnum.WAITING_FOR_PARTY_ACCEPTANCE); expect(StateMachine.__instance.state).toBe('payeeResolved'); expect(result.to[0].fspId).toEqual('FirstFspId'); expect(result.to[1].fspId).toEqual('SecondFspId'); @@ -552,7 +555,7 @@ describe('outboundModel', () => { let result = await resultPromise; // check we stopped at payeeResolved state - expect(result.currentState).toBe('WAITING_FOR_PARTY_ACCEPTANCE'); + expect(result.currentState).toBe(SDKStateEnum.WAITING_FOR_PARTY_ACCEPTANCE); expect(StateMachine.__instance.state).toBe('payeeResolved'); const transferId = result.transferId; @@ -579,7 +582,7 @@ describe('outboundModel', () => { result = await resultPromise; // check we stopped at payeeResolved state - expect(result.currentState).toBe('WAITING_FOR_QUOTE_ACCEPTANCE'); + expect(result.currentState).toBe(SDKStateEnum.WAITING_FOR_QUOTE_ACCEPTANCE); expect(StateMachine.__instance.state).toBe('quoteReceived'); }); @@ -613,7 +616,7 @@ describe('outboundModel', () => { let result = await resultPromise; // check we stopped at payeeResolved state - expect(result.currentState).toBe('WAITING_FOR_PARTY_ACCEPTANCE'); + expect(result.currentState).toBe(SDKStateEnum.WAITING_FOR_PARTY_ACCEPTANCE); expect(StateMachine.__instance.state).toBe('payeeResolved'); expect(result.amount).toEqual(initialAmount); @@ -648,7 +651,7 @@ describe('outboundModel', () => { result = await resultPromise; // check we stopped at quoteReceived state - expect(result.currentState).toBe('WAITING_FOR_QUOTE_ACCEPTANCE'); + expect(result.currentState).toBe(SDKStateEnum.WAITING_FOR_QUOTE_ACCEPTANCE); expect(StateMachine.__instance.state).toBe('quoteReceived'); // check the accept party key got merged to the state @@ -692,7 +695,7 @@ describe('outboundModel', () => { let result = await resultPromise; // check we stopped at payeeResolved state - expect(result.currentState).toBe('WAITING_FOR_PARTY_ACCEPTANCE'); + expect(result.currentState).toBe(SDKStateEnum.WAITING_FOR_PARTY_ACCEPTANCE); expect(StateMachine.__instance.state).toBe('payeeResolved'); expect(result.amount).toEqual(initialAmount); @@ -742,7 +745,7 @@ describe('outboundModel', () => { result = await resultPromise; // check we stopped at quoteReceived state - expect(result.currentState).toBe('WAITING_FOR_QUOTE_ACCEPTANCE'); + expect(result.currentState).toBe(SDKStateEnum.WAITING_FOR_QUOTE_ACCEPTANCE); expect(StateMachine.__instance.state).toBe('quoteReceived'); // check the accept party key got merged to the state @@ -785,7 +788,7 @@ describe('outboundModel', () => { let result = await resultPromise; // check we stopped at payeeResolved state - expect(result.currentState).toBe('WAITING_FOR_PARTY_ACCEPTANCE'); + expect(result.currentState).toBe(SDKStateEnum.WAITING_FOR_PARTY_ACCEPTANCE); expect(StateMachine.__instance.state).toBe('payeeResolved'); expect(result.amount).toEqual(initialAmount); @@ -821,7 +824,7 @@ describe('outboundModel', () => { result = await resultPromise; // check we stopped at quoteReceived state - expect(result.currentState).toBe('WAITING_FOR_QUOTE_ACCEPTANCE'); + expect(result.currentState).toBe(SDKStateEnum.WAITING_FOR_QUOTE_ACCEPTANCE); expect(StateMachine.__instance.state).toBe('quoteReceived'); // check the accept party key got merged to the state @@ -868,7 +871,7 @@ describe('outboundModel', () => { let result = await resultPromise; // check we stopped at quoteReceived state - expect(result.currentState).toBe('WAITING_FOR_QUOTE_ACCEPTANCE'); + expect(result.currentState).toBe(SDKStateEnum.WAITING_FOR_QUOTE_ACCEPTANCE); expect(StateMachine.__instance.state).toBe('quoteReceived'); }); @@ -897,7 +900,7 @@ describe('outboundModel', () => { let result = await resultPromise; // check we stopped at payeeResolved state - expect(result.currentState).toBe('WAITING_FOR_PARTY_ACCEPTANCE'); + expect(result.currentState).toBe(SDKStateEnum.WAITING_FOR_PARTY_ACCEPTANCE); expect(StateMachine.__instance.state).toBe('payeeResolved'); const transferId = result.transferId; @@ -919,7 +922,7 @@ describe('outboundModel', () => { result = await model.run({ resume: { acceptParty: false } }); // check we stopped at quoteReceived state - expect(result.currentState).toBe('ABORTED'); + expect(result.currentState).toBe(SDKStateEnum.ABORTED); expect(result.abortedReason).toBe('Payee rejected by backend'); expect(StateMachine.__instance.state).toBe('aborted'); }); @@ -949,7 +952,7 @@ describe('outboundModel', () => { let result = await resultPromise; // check we stopped at payeeResolved state - expect(result.currentState).toBe('WAITING_FOR_PARTY_ACCEPTANCE'); + expect(result.currentState).toBe(SDKStateEnum.WAITING_FOR_PARTY_ACCEPTANCE); expect(StateMachine.__instance.state).toBe('payeeResolved'); const transferId = result.transferId; @@ -977,13 +980,13 @@ describe('outboundModel', () => { result = await resultPromise; // check we stopped at payeeResolved state - expect(result.currentState).toBe('WAITING_FOR_QUOTE_ACCEPTANCE'); + expect(result.currentState).toBe(SDKStateEnum.WAITING_FOR_QUOTE_ACCEPTANCE); expect(StateMachine.__instance.state).toBe('quoteReceived'); // now run the model again. this should trigger abort as the quote was not accepted result = await model.run({ acceptQuote: false }); - expect(result.currentState).toBe('ABORTED'); + expect(result.currentState).toBe(SDKStateEnum.ABORTED); expect(result.abortedReason).toBe('Quote rejected by backend'); expect(StateMachine.__instance.state).toBe('aborted'); }); @@ -1039,7 +1042,7 @@ describe('outboundModel', () => { let result = await resultPromise; // check we stopped at payeeResolved state - expect(result.currentState).toBe('WAITING_FOR_PARTY_ACCEPTANCE'); + expect(result.currentState).toBe(SDKStateEnum.WAITING_FOR_PARTY_ACCEPTANCE); expect(StateMachine.__instance.state).toBe('payeeResolved'); const transferId = result.transferId; @@ -1067,20 +1070,20 @@ describe('outboundModel', () => { result = await resultPromise; // check we stopped at payeeResolved state - expect(result.currentState).toBe('WAITING_FOR_QUOTE_ACCEPTANCE'); + expect(result.currentState).toBe(SDKStateEnum.WAITING_FOR_QUOTE_ACCEPTANCE); expect(StateMachine.__instance.state).toBe('quoteReceived'); // now run the model again. this should trigger abort as the quote was not accepted result = await model.run({ acceptQuote: false }); - expect(result.currentState).toBe('ABORTED'); + expect(result.currentState).toBe(SDKStateEnum.ABORTED); expect(result.abortedReason).toBe('Quote rejected by backend'); expect(StateMachine.__instance.state).toBe('aborted'); // now run the model again. this should get the same result as previous one result = await model.run({ acceptQuote: false }); - expect(result.currentState).toBe('ABORTED'); + expect(result.currentState).toBe(SDKStateEnum.ABORTED); expect(result.abortedReason).toBe('Quote rejected by backend'); expect(StateMachine.__instance.state).toBe('aborted'); }); @@ -1110,7 +1113,7 @@ describe('outboundModel', () => { let result = await resultPromise; // check we stopped at payeeResolved state - expect(result.currentState).toBe('WAITING_FOR_PARTY_ACCEPTANCE'); + expect(result.currentState).toBe(SDKStateEnum.WAITING_FOR_PARTY_ACCEPTANCE); expect(StateMachine.__instance.state).toBe('payeeResolved'); const transferId = result.transferId; @@ -1138,7 +1141,7 @@ describe('outboundModel', () => { result = await resultPromise; // check we stopped at quoteReceived state - expect(result.currentState).toBe('WAITING_FOR_QUOTE_ACCEPTANCE'); + expect(result.currentState).toBe(SDKStateEnum.WAITING_FOR_QUOTE_ACCEPTANCE); expect(StateMachine.__instance.state).toBe('quoteReceived'); // load a new model from the saved state @@ -1164,7 +1167,7 @@ describe('outboundModel', () => { result = await resultPromise; // check we stopped at quoteReceived state - expect(result.currentState).toBe('COMPLETED'); + expect(result.currentState).toBe(SDKStateEnum.COMPLETED); expect(StateMachine.__instance.state).toBe('succeeded'); }); @@ -1216,7 +1219,7 @@ describe('outboundModel', () => { const result = await resultPromise; // check we stopped at payeeResolved state - expect(result.currentState).toBe('COMPLETED'); + expect(result.currentState).toBe(SDKStateEnum.COMPLETED); expect(StateMachine.__instance.state).toBe('succeeded'); }); @@ -1268,7 +1271,7 @@ describe('outboundModel', () => { const result = await resultPromise; // check we stopped at payeeResolved state - expect(result.currentState).toBe('COMPLETED'); + expect(result.currentState).toBe(SDKStateEnum.COMPLETED); expect(StateMachine.__instance.state).toBe('succeeded'); }); @@ -1569,7 +1572,7 @@ describe('outboundModel', () => { let result = await resultPromise; // check we stopped at quoteReceived state - expect(result.currentState).toBe('WAITING_FOR_QUOTE_ACCEPTANCE'); + expect(result.currentState).toBe(SDKStateEnum.WAITING_FOR_QUOTE_ACCEPTANCE); expect(StateMachine.__instance.state).toBe('quoteReceived'); }); diff --git a/test/unit/lib/model/PartiesModel.test.js b/test/unit/lib/model/PartiesModel.test.js index ff5b7ce91..6b6e018a2 100644 --- a/test/unit/lib/model/PartiesModel.test.js +++ b/test/unit/lib/model/PartiesModel.test.js @@ -16,6 +16,7 @@ jest.mock('@mojaloop/sdk-standard-components'); const { uuid } = require('uuidv4'); const Model = require('~/lib/model').PartiesModel; const PSM = require('~/lib/model/common').PersistentStateMachine; +const { SDKStateEnum } = require('~/lib/model/common'); const { MojaloopRequests } = require('@mojaloop/sdk-standard-components'); const defaultConfig = require('./data/defaultConfig'); const mockLogger = require('../../mockLogger'); @@ -403,7 +404,7 @@ describe('PartiesModel', () => { expect(model.context.data.currentState).toEqual('errored'); expect(err.requestActionState).toEqual( { ...data, - currentState: 'ERROR_OCCURRED', + currentState: SDKStateEnum.ERROR_OCCURRED, }); } }); diff --git a/test/unit/lib/model/QuotesModel.test.js b/test/unit/lib/model/QuotesModel.test.js index 328eb696f..cd99930ad 100644 --- a/test/unit/lib/model/QuotesModel.test.js +++ b/test/unit/lib/model/QuotesModel.test.js @@ -16,6 +16,7 @@ jest.mock('@mojaloop/sdk-standard-components'); const { uuid } = require('uuidv4'); const Model = require('~/lib/model').QuotesModel; const PSM = require('~/lib/model/common').PersistentStateMachine; +const { SDKStateEnum } = require('~/lib/model/common'); const { MojaloopRequests } = require('@mojaloop/sdk-standard-components'); const defaultConfig = require('./data/defaultConfig'); const mockLogger = require('../../mockLogger'); @@ -381,7 +382,7 @@ describe('QuotesModel', () => { expect(model.context.data.currentState).toEqual('errored'); expect(err.requestActionState).toEqual( { ...data, - currentState: 'ERROR_OCCURRED', + currentState: SDKStateEnum.ERROR_OCCURRED, }); } }); diff --git a/test/unit/lib/model/TransfersModel.test.js b/test/unit/lib/model/TransfersModel.test.js index 9203a0de1..263d4ea79 100644 --- a/test/unit/lib/model/TransfersModel.test.js +++ b/test/unit/lib/model/TransfersModel.test.js @@ -16,6 +16,7 @@ jest.mock('@mojaloop/sdk-standard-components'); const { uuid } = require('uuidv4'); const Model = require('~/lib/model').TransfersModel; const PSM = require('~/lib/model/common').PersistentStateMachine; +const { SDKStateEnum } = require('~/lib/model/common'); const { MojaloopRequests } = require('@mojaloop/sdk-standard-components'); const defaultConfig = require('./data/defaultConfig'); const mockLogger = require('../../mockLogger'); @@ -386,7 +387,7 @@ describe('TransfersModel', () => { expect(model.context.data.currentState).toEqual('errored'); expect(err.requestActionState).toEqual( { ...data, - currentState: 'ERROR_OCCURRED', + currentState: SDKStateEnum.ERROR_OCCURRED, }); } }); diff --git a/test/unit/lib/model/data/getBulkTransfersBackendResponse.json b/test/unit/lib/model/data/getBulkTransfersBackendResponse.json index d644eabe0..3f1a18e9f 100644 --- a/test/unit/lib/model/data/getBulkTransfersBackendResponse.json +++ b/test/unit/lib/model/data/getBulkTransfersBackendResponse.json @@ -26,7 +26,7 @@ } ] }, - "bulkTransferState": "COMMITTED", + "bulkTransferState": "COMPLETED", "timestamp": "2019-11-15T14:16:09.663", "note": "test payment", "extensions": [ diff --git a/test/unit/lib/model/data/getBulkTransfersMojaloopResponse.json b/test/unit/lib/model/data/getBulkTransfersMojaloopResponse.json index e7e58fa98..ea783de58 100644 --- a/test/unit/lib/model/data/getBulkTransfersMojaloopResponse.json +++ b/test/unit/lib/model/data/getBulkTransfersMojaloopResponse.json @@ -12,7 +12,7 @@ } ] }, - "bulkTransferState": "COMMITTED", + "bulkTransferState": "COMPLETED", "individualTransferResults": [ { "transferId": "fake-transfer-id", From 809598a9e5c177333772fc61de8df68bb2a2ad79 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Thu, 7 Jul 2022 12:03:35 +0200 Subject: [PATCH 02/31] chore: fixed audit-resolve issues --- audit-resolve.json | 95 +++++++++++++--------------------------------- 1 file changed, 27 insertions(+), 68 deletions(-) diff --git a/audit-resolve.json b/audit-resolve.json index 79c1f9057..180747def 100644 --- a/audit-resolve.json +++ b/audit-resolve.json @@ -2,99 +2,58 @@ "decisions": { "1075703|@mojaloop/central-services-shared>@mojaloop/event-sdk>grpc>protobufjs": { "decision": "ignore", - "madeAt": 1656678986448 + "madeAt": 1657188195403, + "expiresAt": 1659780190646 }, "1075704|@mojaloop/central-services-shared>@mojaloop/event-sdk>grpc>protobufjs": { "decision": "ignore", - "madeAt": 1656678989848 + "madeAt": 1657188196343, + "expiresAt": 1659780190646 }, - "1070412|@mojaloop/central-services-shared>@mojaloop/event-sdk>grpc>protobufjs>shins>ejs": { + "1080944|@mojaloop/central-services-shared>@mojaloop/event-sdk>grpc>protobufjs>moment": { "decision": "ignore", - "madeAt": 1656679958470 + "madeAt": 1657188197274, + "expiresAt": 1659780190646 }, - "1070412|ejs": { - "decision": "ignore", - "madeAt": 1656679958471 - }, - "1070030|@mojaloop/central-services-shared>@mojaloop/event-sdk>grpc>protobufjs>shins>ejs>markdown-it": { + "1070030|@mojaloop/central-services-shared>@mojaloop/event-sdk>grpc>protobufjs>moment>shins>markdown-it": { "decision": "ignore", - "madeAt": 1656679961621 + "madeAt": 1657188198190, + "expiresAt": 1659780190646 }, "1070030|widdershins>markdown-it": { "decision": "ignore", - "madeAt": 1656681873020 + "madeAt": 1657188198190, + "expiresAt": 1659780190646 }, - "1068155|@mojaloop/central-services-shared>@mojaloop/event-sdk>grpc>protobufjs>shins>ejs>markdown-it>sanitize-html": { + "1068155|@mojaloop/central-services-shared>@mojaloop/event-sdk>grpc>protobufjs>moment>shins>markdown-it>sanitize-html": { "decision": "ignore", - "madeAt": 1656679964361 + "madeAt": 1657188199040, + "expiresAt": 1659780190646 }, - "1070260|@mojaloop/central-services-shared>@mojaloop/event-sdk>grpc>protobufjs>shins>ejs>markdown-it>sanitize-html": { + "1070260|@mojaloop/central-services-shared>@mojaloop/event-sdk>grpc>protobufjs>moment>shins>markdown-it>sanitize-html": { "decision": "ignore", - "madeAt": 1656679966871 + "madeAt": 1657188199954, + "expiresAt": 1659780190646 }, - "1067553|@mojaloop/central-services-shared>@mojaloop/event-sdk>grpc>protobufjs>shins>ejs>markdown-it>sanitize-html>widdershins>swagger2openapi>better-ajv-errors>jsonpointer": { + "1070412|ejs": { "decision": "ignore", - "madeAt": 1656679000803 + "madeAt": 1657188200902, + "expiresAt": 1659780190646 }, "1067553|swagger2openapi>better-ajv-errors>jsonpointer": { "decision": "ignore", - "madeAt": 1656679000803 - }, - "1067553|widdershins>markdown-it>swagger2openapi>better-ajv-errors>jsonpointer": { - "decision": "ignore", - "madeAt": 1656679000804 - }, - "1067946|@mojaloop/central-services-shared>@mojaloop/event-sdk>grpc>protobufjs>shins>ejs>markdown-it>sanitize-html>widdershins>swagger2openapi>better-ajv-errors>jsonpointer>oas-validator>ajv": { - "decision": "ignore", - "madeAt": 1656679005322 + "madeAt": 1657188201786, + "expiresAt": 1659780190646 }, "1067946|swagger2openapi>better-ajv-errors>jsonpointer>oas-validator>ajv": { "decision": "ignore", - "madeAt": 1656679005322 - }, - "1067946|widdershins>markdown-it>swagger2openapi>better-ajv-errors>jsonpointer>oas-validator>ajv": { - "decision": "ignore", - "madeAt": 1656679005322 - }, - "1068310|@mojaloop/central-services-shared>@mojaloop/event-sdk>grpc>protobufjs>shins>ejs>markdown-it>sanitize-html>widdershins>swagger2openapi>better-ajv-errors>jsonpointer>oas-validator>ajv>yargs>yargs-parser": { - "decision": "ignore", - "madeAt": 1656679007475 - }, - "1068310|widdershins>markdown-it>swagger2openapi>better-ajv-errors>jsonpointer>oas-validator>ajv>yargs>yargs-parser": { - "decision": "ignore", - "madeAt": 1656679007475 - }, - "1070412|shins>ejs": { - "decision": "ignore", - "madeAt": 1656679958471 - }, - "1070030|shins>ejs>markdown-it": { - "decision": "ignore", - "madeAt": 1656679961621 - }, - "1068155|shins>ejs>markdown-it>sanitize-html": { - "decision": "ignore", - "madeAt": 1656679964361 - }, - "1070260|shins>ejs>markdown-it>sanitize-html": { - "decision": "ignore", - "madeAt": 1656679966871 - }, - "1070030|@mojaloop/central-services-shared>@mojaloop/event-sdk>grpc>protobufjs>shins>markdown-it": { - "decision": "ignore", - "madeAt": 1656681873020 - }, - "1068155|@mojaloop/central-services-shared>@mojaloop/event-sdk>grpc>protobufjs>shins>markdown-it>sanitize-html": { - "decision": "ignore", - "madeAt": 1656681876693 - }, - "1070260|@mojaloop/central-services-shared>@mojaloop/event-sdk>grpc>protobufjs>shins>markdown-it>sanitize-html": { - "decision": "ignore", - "madeAt": 1656681880214 + "madeAt": 1657188202661, + "expiresAt": 1659780190646 }, "1068310|widdershins>markdown-it>yargs>yargs-parser": { "decision": "ignore", - "madeAt": 1656681883038 + "madeAt": 1657188203603, + "expiresAt": 1659780190646 } }, "rules": {}, From 9a7b0d855898495eb36c21a9c7d7c189466e356e Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Thu, 7 Jul 2022 12:39:25 +0200 Subject: [PATCH 03/31] chore: aligned ci config to standards --- .circleci/config.yml | 570 +++++++++++++++++++++++++++++++++---------- 1 file changed, 435 insertions(+), 135 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index bf8d6c308..503dd0445 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -7,10 +7,14 @@ version: 2.1 # Orbs used in this pipeline ### orbs: - anchore: anchore/anchore-engine@1.6.0 - slack: circleci/slack@3.4.2 + anchore: anchore/anchore-engine@1.9.0 + ## Remove + # slack: circleci/slack@3.4.2 + slack: circleci/slack@4.9.3 # Ref: https://github.com/mojaloop/ci-config/tree/master/slack-templates pr-tools: mojaloop/pr-tools@0.1.10 + ## remove github-release: h-matsuo/github-release@0.1.3 + gh: circleci/github-cli@2.1.0 ## @@ -19,24 +23,18 @@ orbs: # YAML defaults templates, in alphabetical order ## defaults_Dependencies: &defaults_Dependencies | + apk --no-cache add bash apk --no-cache add git apk --no-cache add ca-certificates apk --no-cache add curl apk --no-cache add openssh-client - apk --no-cache add bash - apk add --no-cache -t build-dependencies make gcc g++ python3 libtool autoconf automake + apk add --no-cache -t build-dependencies make gcc g++ python3 libtool autoconf automake jq + apk add --no-cache -t openssl ncurses coreutils libgcc linux-headers grep util-linux binutils findutils npm config set unsafe-perm true npm install -g node-gyp defaults_awsCliDependencies: &defaults_awsCliDependencies | - apk upgrade --no-cache - apk --no-cache add \ - python3 \ - py3-pip \ - groff \ - less \ - mailcap - pip3 install --upgrade pip awscli==1.14.5 s3cmd==2.0.1 python-magic + apk --no-cache add aws-cli defaults_license_scanner: &defaults_license_scanner name: Install and set up license-scanner @@ -44,10 +42,12 @@ defaults_license_scanner: &defaults_license_scanner git clone https://github.com/mojaloop/license-scanner /tmp/license-scanner cd /tmp/license-scanner && make build default-files set-up +## remove defaults_npm_auth: &defaults_npm_auth name: Update NPM registry auth token command: echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > .npmrc +## remove defaults_npm_publish_release: &defaults_npm_publish_release name: Publish NPM $RELEASE_TAG artifact command: | @@ -55,6 +55,31 @@ defaults_npm_publish_release: &defaults_npm_publish_release echo "Publishing tag $RELEASE_TAG" npm publish --tag $RELEASE_TAG --access public +defaults_export_version_from_package: &defaults_export_version_from_package + name: Format the changelog into the github release body and get release tag + command: | + git diff --no-indent-heuristic master~1 HEAD CHANGELOG.md | sed -n '/^+[^+]/ s/^+//p' > /tmp/changes + echo 'export RELEASE_CHANGES=`cat /tmp/changes`' >> $BASH_ENV + echo 'export RELEASE_TAG=`cat package-lock.json | jq -r .version`' >> $BASH_ENV + +defaults_configure_git: &defaults_configure_git + name: Configure git + command: | + git config user.email ${GIT_CI_EMAIL} + git config user.name ${GIT_CI_USER} + +defaults_configure_nvm: &defaults_configure_nvm + name: Configure NVM + command: | + touch $HOME/.profile + curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash + export NVM_DIR="$HOME/.nvm" + [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" + echo "Installing Node version: $(cat .nvmrc)" + nvm install $(cat .nvmrc) + nvm alias default $(cat .nvmrc) + nvm use $(cat .nvmrc) + ## # Executors # @@ -64,11 +89,11 @@ executors: default-docker: working_directory: /home/circleci/project docker: - - image: node:16.15.0-alpine + - image: node:16.15.0-alpine # Ref: https://hub.docker.com/_/node?tab=tags&page=1&name=alpine default-machine: machine: - image: ubuntu-2004:202010-01 + image: ubuntu-2004:current # Ref: https://circleci.com/developer/machine/image/ubuntu-2004 ## # Jobs @@ -84,19 +109,45 @@ jobs: command: *defaults_Dependencies - checkout - run: - name: Access npm folder as root - command: cd $(npm root -g)/npm + <<: *defaults_configure_nvm - run: - name: Update NPM install (using `npm ci`) + name: Update NPM install command: npm ci - - run: - name: Delete build dependencies - command: apk del build-dependencies - save_cache: key: dependency-cache-{{ .Environment.CIRCLE_SHA1 }} paths: - node_modules + test-dependencies: + executor: default-docker + steps: + - run: + name: Install general dependencies + command: *defaults_Dependencies + - checkout + - run: + <<: *defaults_configure_nvm + - restore_cache: + key: dependency-cache-{{ .Environment.CIRCLE_SHA1 }} + - run: + name: Execute dependency tests + command: npm run dep:check + + test-lint: + executor: default-docker + steps: + - run: + name: Install general dependencies + command: *defaults_Dependencies + - checkout + - run: + <<: *defaults_configure_nvm + - restore_cache: + key: dependency-cache-{{ .Environment.CIRCLE_SHA1 }} + - run: + name: Execute lint tests + command: npm run lint + test-unit: executor: default-docker steps: @@ -104,6 +155,8 @@ jobs: name: Install general dependencies command: *defaults_Dependencies - checkout + - run: + <<: *defaults_configure_nvm - restore_cache: key: dependency-cache-{{ .Environment.CIRCLE_SHA1 }} - run: @@ -119,20 +172,22 @@ jobs: steps: - checkout - run: - name: Install Docker Compose - command: | - curl -L https://github.com/docker/compose/releases/download/1.28.2/docker-compose-`uname -s`-`uname -m` > ~/docker-compose - chmod +x ~/docker-compose - sudo mv ~/docker-compose /usr/local/bin/docker-compose + <<: *defaults_configure_nvm + # - run: + # name: Install Docker Compose + # command: | + # curl -L https://github.com/docker/compose/releases/download/1.28.2/docker-compose-`uname -s`-`uname -m` > ~/docker-compose + # chmod +x ~/docker-compose + # sudo mv ~/docker-compose /usr/local/bin/docker-compose - restore_cache: key: dependency-cache-{{ .Environment.CIRCLE_SHA1 }} - - run: - name: Set up NVM - command: | - echo ${NVM_DIR} - [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" - nvm install v16.14 - nvm alias default v16.14 + # - run: + # name: Set up NVM + # command: | + # echo ${NVM_DIR} + # [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" + # nvm install v16.15 + # nvm alias default v16.15 - run: name: Start docker-compose command: | @@ -176,23 +231,23 @@ jobs: name: Execute unit tests command: npm run build:openapi && npm run validate:api - lint: - executor: default-docker - steps: - - run: - name: Install general dependencies - command: *defaults_Dependencies - - checkout - - restore_cache: - key: dependency-cache-{{ .Environment.CIRCLE_SHA1 }} - - run: - name: Create dir for lint results - command: mkdir -p /lintresults - - run: - name: Execute linting - command: (npm run lint > /lintresults/results.txt) - - store_artifacts: - path: /lintresults + # lint: + # executor: default-docker + # steps: + # - run: + # name: Install general dependencies + # command: *defaults_Dependencies + # - checkout + # - restore_cache: + # key: dependency-cache-{{ .Environment.CIRCLE_SHA1 }} + # - run: + # name: Create dir for lint results + # command: mkdir -p /lintresults + # - run: + # name: Execute linting + # command: (npm run lint > /lintresults/results.txt) + # - store_artifacts: + # path: /lintresults vulnerability-check: executor: default-docker @@ -201,6 +256,8 @@ jobs: name: Install general dependencies command: *defaults_Dependencies - checkout + - run: + <<: *defaults_configure_nvm - restore_cache: key: dependency-cache-{{ .Environment.CIRCLE_SHA1 }} - run: @@ -211,6 +268,7 @@ jobs: command: npm run audit:check --silent -- --json > ./audit/results/auditResults.json - store_artifacts: path: ./audit/results + prefix: audit audit-licenses: executor: default-docker @@ -232,23 +290,6 @@ jobs: - store_artifacts: path: /tmp/license-scanner/results - build-local: - executor: default-machine - steps: - - checkout - - run: - name: Build Docker local image for testing - command: | - echo "Building Docker image: local" - docker build -t mojaloop/$CIRCLE_PROJECT_REPONAME:local . - - run: - name: Save docker image to workspace - command: docker save -o /tmp/docker-image.tar mojaloop/$CIRCLE_PROJECT_REPONAME:local - - persist_to_workspace: - root: /tmp - paths: - - ./docker-image.tar - license-scan: executor: default-machine steps: @@ -316,6 +357,44 @@ jobs: - store_artifacts: path: anchore-reports + build-local: + executor: default-machine + steps: + - checkout + - run: + name: Build Docker local image for testing + command: | + echo "Building Docker image: local" + docker build -t $DOCKER_ORG/$CIRCLE_PROJECT_REPONAME:local . + - run: + name: Save docker image to workspace + command: docker save -o /tmp/docker-image-local.tar $DOCKER_ORG/$CIRCLE_PROJECT_REPONAME:local + - persist_to_workspace: + root: /tmp + paths: + - ./docker-image-local.tar + + build: + executor: default-machine + steps: + - attach_workspace: + at: /tmp + - run: + name: Load the pre-built docker local image from workspace + command: docker load -i /tmp/docker-image-local.tar + - run: + name: Re-tag the image + command: | + echo "Re-tagging Docker image: $CIRCLE_TAG" + docker tag $DOCKER_ORG/$CIRCLE_PROJECT_REPONAME:local $DOCKER_ORG/$CIRCLE_PROJECT_REPONAME:$CIRCLE_TAG + - run: + name: Save the new docker image to workspace + command: docker save -o /tmp/docker-image.tar $DOCKER_ORG/$CIRCLE_PROJECT_REPONAME:$CIRCLE_TAG + - persist_to_workspace: + root: /tmp + paths: + - ./docker-image.tar + release: executor: default-docker steps: @@ -323,26 +402,30 @@ jobs: name: Install general dependencies command: *defaults_Dependencies - checkout + - run: + <<: *defaults_configure_nvm - restore_cache: - key: dependency-cache-{{ .Environment.CIRCLE_SHA1 }} + keys: + - dependency-cache-{{ .Environment.CIRCLE_SHA1 }} - run: - name: Configure git - command: | - git config user.email ${GIT_CI_EMAIL} - git config user.name ${GIT_CI_USER} - git checkout ${CIRCLE_BRANCH} + <<: *defaults_configure_git - run: - name: Configure ssh + name: Setup Slack config command: | - mkdir -p ~/.ssh - ssh-keyscan -p 443 ssh.github.com >> ~/.ssh/known_hosts - ssh-keyscan github.com >> ~/.ssh/known_hosts + echo "export SLACK_PROJECT_NAME=${CIRCLE_PROJECT_REPONAME}" >> $BASH_ENV + echo "export SLACK_RELEASE_TYPE='GitHub Release'" >> $BASH_ENV + echo "export SLACK_RELEASE_TAG='${RELEASE_TAG} on ${CIRCLE_BRANCH} branch'" >> $BASH_ENV + echo "export SLACK_BUILD_ID=${CIRCLE_BUILD_NUM}" >> $BASH_ENV + echo "export SLACK_CI_URL=${CIRCLE_BUILD_URL}" >> $BASH_ENV - run: name: Generate changelog and bump package version - command: npm run release + command: npm run release -- --no-verify - run: name: Push the release command: git push --follow-tags origin ${CIRCLE_BRANCH} + - slack/notify: + event: fail + template: SLACK_TEMP_RELEASE_FAILURE github-release: executor: default-machine @@ -351,77 +434,236 @@ jobs: name: Install git command: | sudo apt-get update && sudo apt-get install -y git + - gh/install - checkout + - run: + <<: *defaults_configure_git - run: name: Fetch updated release branch command: | - git config user.email ${GIT_CI_EMAIL} - git config user.name ${GIT_CI_USER} git fetch origin git checkout origin/${CIRCLE_BRANCH} - run: - # Note: this is rather imperfect, but will do for now - name: Format the changelog into the github release body and get release tag - command: | - git diff --no-indent-heuristic master~1 HEAD CHANGELOG.md | sed -n '/^+[^+]/ s/^+//p' > /tmp/changes - echo 'export RELEASE_CHANGES=`cat /tmp/changes`' >> $BASH_ENV - echo 'export RELEASE_TAG=`cat package-lock.json | jq -r .version`' >> $BASH_ENV + <<: *defaults_export_version_from_package - run: - name: check the release changes + name: Check the release changes command: | echo "Changes are: ${RELEASE_CHANGES}" - - github-release/create: - github-token-variable: ${GITHUB_TOKEN} - tag: v${RELEASE_TAG} - title: v${RELEASE_TAG} Release - description: ${RELEASE_CHANGES} - file-path: CHANGELOG.md - - slack/status: - webhook: "$SLACK_WEBHOOK_ANNOUNCEMENT" - success_message: '*"${CIRCLE_PROJECT_REPONAME}"* - Release \`"v${RELEASE_TAG}"\` \nhttps://github.com/mojaloop/"${CIRCLE_PROJECT_REPONAME}"/releases/tag/"v${RELEASE_TAG}"' + - run: + name: Setup Slack config + command: | + echo "export SLACK_PROJECT_NAME=${CIRCLE_PROJECT_REPONAME}" >> $BASH_ENV + echo "export SLACK_RELEASE_TYPE='Github Release'" >> $BASH_ENV + echo "export SLACK_RELEASE_TAG=v${RELEASE_TAG}" >> $BASH_ENV + echo "export SLACK_RELEASE_URL=https://github.com/mojaloop/${CIRCLE_PROJECT_REPONAME}/releases/tag/v${RELEASE_TAG}" >> $BASH_ENV + echo "export SLACK_BUILD_ID=${CIRCLE_BUILD_NUM}" >> $BASH_ENV + echo "export SLACK_CI_URL=${CIRCLE_BUILD_URL}" >> $BASH_ENV + - run: + name: Create Release + command: | + gh release create "v${RELEASE_TAG}" --title "v${RELEASE_TAG} Release" --draft=false --notes "${RELEASE_CHANGES}" ./CHANGELOG.md + - slack/notify: + event: pass + template: SLACK_TEMP_RELEASE_SUCCESS + - slack/notify: + event: fail + template: SLACK_TEMP_RELEASE_FAILURE publish-docker: executor: default-machine steps: - checkout + - run: + name: Setup for LATEST release + command: | + echo "export RELEASE_TAG=$RELEASE_TAG_PROD" >> $BASH_ENV + echo "RELEASE_TAG=$RELEASE_TAG_PROD" + + PACKAGE_VERSION=$(cat package-lock.json | jq -r .version) + echo "export PACKAGE_VERSION=${PACKAGE_VERSION}" >> $BASH_ENV + echo "PACKAGE_VERSION=${PACKAGE_VERSION}" + - run: + name: Setup Slack config + command: | + echo "export SLACK_PROJECT_NAME=${CIRCLE_PROJECT_REPONAME}" >> $BASH_ENV + echo "export SLACK_RELEASE_TYPE='Docker Release'" >> $BASH_ENV + echo "export SLACK_RELEASE_TAG=v${CIRCLE_TAG:1}" >> $BASH_ENV + echo "export SLACK_BUILD_ID=${CIRCLE_BUILD_NUM}" >> $BASH_ENV + echo "export SLACK_CI_URL=${CIRCLE_BUILD_URL}" >> $BASH_ENV - attach_workspace: at: /tmp - run: name: Load the pre-built docker image from workspace - command: docker load -i /tmp/docker-image.tar + command: | + docker load -i /tmp/docker-image.tar - run: name: Login to Docker Hub command: docker login -u $DOCKER_USER -p $DOCKER_PASS - run: name: Re-tag pre built image command: | - docker tag $DOCKER_ORG/$CIRCLE_PROJECT_REPONAME:local $DOCKER_ORG/$CIRCLE_PROJECT_REPONAME:latest - docker tag $DOCKER_ORG/$CIRCLE_PROJECT_REPONAME:local $DOCKER_ORG/$CIRCLE_PROJECT_REPONAME:$CIRCLE_TAG + docker tag $DOCKER_ORG/$CIRCLE_PROJECT_REPONAME:$CIRCLE_TAG $DOCKER_ORG/$CIRCLE_PROJECT_REPONAME:$RELEASE_TAG - run: name: Publish Docker image $CIRCLE_TAG & Latest tag to Docker Hub command: | echo "Publishing $DOCKER_ORG/$CIRCLE_PROJECT_REPONAME:$CIRCLE_TAG" docker push $DOCKER_ORG/$CIRCLE_PROJECT_REPONAME:$CIRCLE_TAG - echo "Publishing $DOCKER_ORG/$CIRCLE_PROJECT_REPONAME:latest" - docker push $DOCKER_ORG/$CIRCLE_PROJECT_REPONAME:latest + echo "Publishing $DOCKER_ORG/$CIRCLE_PROJECT_REPONAME:$RELEASE_TAG" + docker push $DOCKER_ORG/$CIRCLE_PROJECT_REPONAME:$RELEASE_TAG + - run: + name: Set Image Digest + command: | + IMAGE_DIGEST=$(docker inspect $DOCKER_ORG/$CIRCLE_PROJECT_REPONAME:v${CIRCLE_TAG:1} | jq '.[0].RepoDigests | .[]') + echo "IMAGE_DIGEST=${IMAGE_DIGEST}" + echo "export IMAGE_DIGEST=${IMAGE_DIGEST}" >> $BASH_ENV + - run: + name: Update Slack config + command: | + echo "export SLACK_RELEASE_URL='https://hub.docker.com/layers/${CIRCLE_PROJECT_REPONAME}/${DOCKER_ORG}/${CIRCLE_PROJECT_REPONAME}/v${CIRCLE_TAG:1}/images/${IMAGE_DIGEST}?context=explore'" | sed -r "s/${DOCKER_ORG}\/${CIRCLE_PROJECT_REPONAME}@sha256:/sha256-/g" >> $BASH_ENV + - slack/notify: + event: pass + template: SLACK_TEMP_RELEASE_SUCCESS + - slack/notify: + event: fail + template: SLACK_TEMP_RELEASE_FAILURE + + publish-docker-snapshot: + executor: default-machine + steps: + - checkout + - run: + name: Setup for SNAPSHOT release + command: | + echo "export RELEASE_TAG=$RELEASE_TAG_SNAPSHOT" >> $BASH_ENV + echo "RELEASE_TAG=$RELEASE_TAG_SNAPSHOT" + + PACKAGE_VERSION=$(cat package-lock.json | jq -r .version) + echo "export PACKAGE_VERSION=${PACKAGE_VERSION}" >> $BASH_ENV + echo "PACKAGE_VERSION=${PACKAGE_VERSION}" + - run: + name: Setup Slack config + command: | + echo "export SLACK_PROJECT_NAME=${CIRCLE_PROJECT_REPONAME}" >> $BASH_ENV + echo "export SLACK_RELEASE_TYPE='Docker Release'" >> $BASH_ENV + echo "export SLACK_RELEASE_TAG=v${CIRCLE_TAG:1}" >> $BASH_ENV + echo "export SLACK_BUILD_ID=${CIRCLE_BUILD_NUM}" >> $BASH_ENV + echo "export SLACK_CI_URL=${CIRCLE_BUILD_URL}" >> $BASH_ENV + - attach_workspace: + at: /tmp + - run: + name: Load the pre-built docker image from workspace + command: | + docker load -i /tmp/docker-image.tar + - run: + name: Login to Docker Hub + command: docker login -u $DOCKER_USER -p $DOCKER_PASS + - run: + name: Re-tag pre built image + command: | + docker tag $DOCKER_ORG/$CIRCLE_PROJECT_REPONAME:$CIRCLE_TAG $DOCKER_ORG/$CIRCLE_PROJECT_REPONAME:$RELEASE_TAG + - run: + name: Publish Docker image $CIRCLE_TAG & Latest tag to Docker Hub + command: | + echo "Publishing $DOCKER_ORG/$CIRCLE_PROJECT_REPONAME:$CIRCLE_TAG" + docker push $DOCKER_ORG/$CIRCLE_PROJECT_REPONAME:$CIRCLE_TAG + echo "Publishing $DOCKER_ORG/$CIRCLE_PROJECT_REPONAME:$RELEASE_TAG" + docker push $DOCKER_ORG/$CIRCLE_PROJECT_REPONAME:$RELEASE_TAG + - run: + name: Set Image Digest + command: | + IMAGE_DIGEST=$(docker inspect $DOCKER_ORG/$CIRCLE_PROJECT_REPONAME:v${CIRCLE_TAG:1} | jq '.[0].RepoDigests | .[]') + echo "IMAGE_DIGEST=${IMAGE_DIGEST}" + echo "export IMAGE_DIGEST=${IMAGE_DIGEST}" >> $BASH_ENV + - run: + name: Update Slack config + command: | + echo "export SLACK_RELEASE_URL='https://hub.docker.com/layers/${CIRCLE_PROJECT_REPONAME}/${DOCKER_ORG}/${CIRCLE_PROJECT_REPONAME}/v${CIRCLE_TAG:1}/images/${IMAGE_DIGEST}?context=explore'" | sed -r "s/${DOCKER_ORG}\/${CIRCLE_PROJECT_REPONAME}@sha256:/sha256-/g" >> $BASH_ENV + - slack/notify: + event: pass + template: SLACK_TEMP_RELEASE_SUCCESS + - slack/notify: + event: fail + template: SLACK_TEMP_RELEASE_FAILURE publish-npm: executor: default-docker steps: + - run: + name: Install general dependencies + command: *defaults_Dependencies - checkout + - restore_cache: + key: dependency-cache-{{ .Environment.CIRCLE_SHA1 }} + - run: + name: Setup for LATEST release + command: | + echo "export RELEASE_TAG=$RELEASE_TAG_PROD" >> $BASH_ENV + echo "RELEASE_TAG=$RELEASE_TAG_PROD" + + PACKAGE_VERSION=$(cat package-lock.json | jq -r .version) + echo "export PACKAGE_VERSION=${PACKAGE_VERSION}" >> $BASH_ENV + echo "PACKAGE_VERSION=${PACKAGE_VERSION}" + - run: + name: Setup Slack config + command: | + echo "export SLACK_PROJECT_NAME=${CIRCLE_PROJECT_REPONAME}" >> $BASH_ENV + echo "export SLACK_RELEASE_TYPE='NPM Release'" >> $BASH_ENV + echo "export SLACK_RELEASE_TAG=v${CIRCLE_TAG:1}" >> $BASH_ENV + echo "export SLACK_RELEASE_URL=https://www.npmjs.com/package/@mojaloop/${CIRCLE_PROJECT_REPONAME}/v/${CIRCLE_TAG:1}" >> $BASH_ENV + echo "export SLACK_BUILD_ID=${CIRCLE_BUILD_NUM}" >> $BASH_ENV + echo "export SLACK_CI_URL=${CIRCLE_BUILD_URL}" >> $BASH_ENV + - run: + <<: *defaults_npm_auth + - run: + <<: *defaults_npm_publish_release + - slack/notify: + event: pass + template: SLACK_TEMP_RELEASE_SUCCESS + - slack/notify: + event: fail + template: SLACK_TEMP_RELEASE_FAILURE + + publish-npm-snapshot: + executor: default-docker + steps: - run: name: Install general dependencies command: *defaults_Dependencies + - checkout - restore_cache: key: dependency-cache-{{ .Environment.CIRCLE_SHA1 }} - run: - name: setup environment vars for LATEST release + name: Setup for SNAPSHOT release + command: | + echo "export RELEASE_TAG=${RELEASE_TAG_SNAPSHOT}" >> $BASH_ENV + echo "RELEASE_TAG=${RELEASE_TAG_SNAPSHOT}" + + echo "Override package version: ${CIRCLE_TAG:1}" + npx standard-version --skip.tag --skip.commit --skip.changelog --release-as ${CIRCLE_TAG:1} + + PACKAGE_VERSION=$(cat package-lock.json | jq -r .version) + echo "export PACKAGE_VERSION=${PACKAGE_VERSION}" >> $BASH_ENV + echo "PACKAGE_VERSION=${PACKAGE_VERSION}" + - run: + name: Setup Slack config command: | - echo 'export RELEASE_TAG=$RELEASE_TAG_PROD' >> $BASH_ENV + echo "export SLACK_PROJECT_NAME=${CIRCLE_PROJECT_REPONAME}" >> $BASH_ENV + echo "export SLACK_RELEASE_TYPE='NPM Snapshot'" >> $BASH_ENV + echo "export SLACK_RELEASE_TAG=v${CIRCLE_TAG:1}" >> $BASH_ENV + echo "export SLACK_RELEASE_URL=https://www.npmjs.com/package/@mojaloop/${CIRCLE_PROJECT_REPONAME}/v/${CIRCLE_TAG:1}" >> $BASH_ENV + echo "export SLACK_BUILD_ID=${CIRCLE_BUILD_NUM}" >> $BASH_ENV + echo "export SLACK_CI_URL=${CIRCLE_BUILD_URL}" >> $BASH_ENV - run: <<: *defaults_npm_auth - run: <<: *defaults_npm_publish_release + - slack/notify: + event: pass + template: SLACK_TEMP_RELEASE_SUCCESS + - slack/notify: + event: fail + template: SLACK_TEMP_RELEASE_FAILURE + ## # Workflows # @@ -442,8 +684,7 @@ workflows: ignore: - /feature*/ - /bugfix*/ - - - test-unit: + - test-dependencies: context: org-global requires: - setup @@ -454,8 +695,7 @@ workflows: ignore: - /feature*/ - /bugfix*/ - - - validate-openapi: + - test-lint: context: org-global requires: - setup @@ -466,8 +706,18 @@ workflows: ignore: - /feature*/ - /bugfix*/ - - - lint: + - test-unit: + context: org-global + requires: + - setup + filters: + tags: + only: /.*/ + branches: + ignore: + - /feature*/ + - /bugfix*/ + - validate-openapi: context: org-global requires: - setup @@ -478,7 +728,6 @@ workflows: ignore: - /feature*/ - /bugfix*/ - - test-integration: context: org-global requires: @@ -490,7 +739,6 @@ workflows: ignore: - /feature*/ - /bugfix*/ - - vulnerability-check: context: org-global requires: @@ -513,64 +761,75 @@ workflows: ignore: - /feature*/ - /bugfix*/ - - build-local: context: org-global requires: - - test-integration - - validate-openapi - - test-unit + - setup filters: tags: - only: /v[0-9]+(\.[0-9]+)*(\-snapshot)?/ + only: /.*/ branches: ignore: - /feature*/ - /bugfix*/ - - - image-scan: + - build: context: org-global requires: + - setup + - test-dependencies + - test-lint + - test-unit + - test-integration + - vulnerability-check + - audit-licenses - build-local + - validate-openapi filters: tags: - only: /v[0-9]+(\.[0-9]+)*(\-snapshot)?/ + only: /v[0-9]+(\.[0-9]+)*(\-snapshot(\.[0-9]+)?)?(\-hotfix(\.[0-9]+)?)?(\-perf(\.[0-9]+)?)?/ branches: ignore: - - /feature*/ - - /bugfix*/ - + - /.*/ - license-scan: context: org-global requires: - - build-local + - build filters: tags: - only: /v[0-9]+(\.[0-9]+)*(\-snapshot)?/ + only: /v[0-9]+(\.[0-9]+)*(\-snapshot(\.[0-9]+)?)?(\-hotfix(\.[0-9]+)?)?(\-perf(\.[0-9]+)?)?/ branches: ignore: - - /feature*/ - - /bugfix*/ - + - /.*/ + - image-scan: + context: org-global + requires: + - build + filters: + tags: + only: /v[0-9]+(\.[0-9]+)*(\-snapshot(\.[0-9]+)?)?(\-hotfix(\.[0-9]+)?)?(\-perf(\.[0-9]+)?)?/ + branches: + ignore: + - /.*/ # New commits to master release automatically - release: context: org-global requires: - - build-local - pr-tools/pr-title-check - - validate-openapi + - test-dependencies + - test-lint - test-unit + - build + - test-integration - vulnerability-check - audit-licenses - - test-integration - license-scan - image-scan + - validate-openapi filters: branches: only: - master - /release\/v.*/ - - github-release: context: org-global requires: @@ -580,40 +839,81 @@ workflows: only: - master - /release\/v.*/ - - publish-docker: context: org-global requires: - - build-local - pr-tools/pr-title-check + - test-dependencies + - test-lint + - test-unit + - build + - test-integration + - vulnerability-check + - audit-licenses + - license-scan + - image-scan - validate-openapi + filters: + tags: + only: /v[0-9]+(\.[0-9]+)*/ + branches: + ignore: + - /.*/ + - publish-docker-snapshot: + context: org-global + requires: + - pr-tools/pr-title-check + - test-dependencies + - test-lint - test-unit + - build - vulnerability-check - audit-licenses - test-integration - license-scan - image-scan + - validate-openapi filters: tags: - only: /.*/ + only: /v[0-9]+(\.[0-9]+)*\-snapshot+((\.[0-9]+)?)/ branches: ignore: - /.*/ - - publish-npm: context: org-global requires: - pr-tools/pr-title-check - - validate-openapi + - test-dependencies + - test-lint - test-unit - vulnerability-check - audit-licenses - test-integration - license-scan - image-scan + - validate-openapi filters: tags: only: /.*/ branches: ignore: - /.*/ + - publish-npm-snapshot: + context: org-global + requires: + - pr-tools/pr-title-check + - test-dependencies + - test-lint + - test-unit + - vulnerability-check + - audit-licenses + - test-integration + - license-scan + - image-scan + - validate-openapi + filters: + tags: + only: /v[0-9]+(\.[0-9]+)*\-snapshot+((\.[0-9]+)?)/ + branches: + ignore: + - /.*/ From 0487acc42780dbc6e512e14a8e9da005c1912cc8 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Thu, 7 Jul 2022 12:49:42 +0200 Subject: [PATCH 04/31] chore: aligned ci config to standards --- .circleci/config.yml | 119 +++++++++++++++++++------------------------ package.json | 4 +- 2 files changed, 54 insertions(+), 69 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 503dd0445..e7da5a185 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -8,15 +8,10 @@ version: 2.1 ### orbs: anchore: anchore/anchore-engine@1.9.0 - ## Remove - # slack: circleci/slack@3.4.2 slack: circleci/slack@4.9.3 # Ref: https://github.com/mojaloop/ci-config/tree/master/slack-templates - pr-tools: mojaloop/pr-tools@0.1.10 - ## remove - github-release: h-matsuo/github-release@0.1.3 + pr-tools: mojaloop/pr-tools@0.1.10 # Ref: https://github.com/mojaloop/ci-config/ gh: circleci/github-cli@2.1.0 - ## # defaults # @@ -173,21 +168,8 @@ jobs: - checkout - run: <<: *defaults_configure_nvm - # - run: - # name: Install Docker Compose - # command: | - # curl -L https://github.com/docker/compose/releases/download/1.28.2/docker-compose-`uname -s`-`uname -m` > ~/docker-compose - # chmod +x ~/docker-compose - # sudo mv ~/docker-compose /usr/local/bin/docker-compose - restore_cache: key: dependency-cache-{{ .Environment.CIRCLE_SHA1 }} - # - run: - # name: Set up NVM - # command: | - # echo ${NVM_DIR} - # [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" - # nvm install v16.15 - # nvm alias default v16.15 - run: name: Start docker-compose command: | @@ -231,24 +213,6 @@ jobs: name: Execute unit tests command: npm run build:openapi && npm run validate:api - # lint: - # executor: default-docker - # steps: - # - run: - # name: Install general dependencies - # command: *defaults_Dependencies - # - checkout - # - restore_cache: - # key: dependency-cache-{{ .Environment.CIRCLE_SHA1 }} - # - run: - # name: Create dir for lint results - # command: mkdir -p /lintresults - # - run: - # name: Execute linting - # command: (npm run lint > /lintresults/results.txt) - # - store_artifacts: - # path: /lintresults - vulnerability-check: executor: default-docker steps: @@ -312,6 +276,29 @@ jobs: steps: - setup_remote_docker - checkout + - run: + name: Setup Slack config + command: | + echo "export SLACK_PROJECT_NAME=${CIRCLE_PROJECT_REPONAME}" >> $BASH_ENV + echo "export SLACK_RELEASE_TYPE='GitHub Release'" >> $BASH_ENV + echo "export SLACK_RELEASE_TAG='${RELEASE_TAG} on ${CIRCLE_BRANCH} branch'" >> $BASH_ENV + echo "export SLACK_BUILD_ID=${CIRCLE_BUILD_NUM}" >> $BASH_ENV + echo "export SLACK_CI_URL=${CIRCLE_BUILD_URL}" >> $BASH_ENV + echo "export SLACK_CUSTOM_MSG='Anchore Image Scan failed for: \`${DOCKER_ORG}/${CIRCLE_PROJECT_REPONAME}:${CIRCLE_TAG}\`'" >> $BASH_ENV + - run: + name: Install docker dependencies for anchore + command: | + apk add --update py-pip docker python3-dev libffi-dev openssl-dev gcc libc-dev make jq npm + - run: + name: Install general dependencies + command: | + apk --no-cache add git + apk --no-cache add ca-certificates + apk --no-cache add curl + apk --no-cache add openssh-client + apk add --no-cache -t build-dependencies make gcc g++ python3 libtool autoconf automake + npm config set unsafe-perm true + npm install -g node-gyp - run: name: Install AWS CLI dependencies command: *defaults_awsCliDependencies @@ -320,42 +307,40 @@ jobs: - run: name: Load the pre-built docker image from workspace command: docker load -i /tmp/docker-image.tar + - run: + name: Download the mojaloop/ci-config repo + command: | + git clone https://github.com/mojaloop/ci-config /tmp/ci-config + # Generate the mojaloop anchore-policy + cd /tmp/ci-config/container-scanning && ./mojaloop-policy-generator.js /tmp/mojaloop-policy.json + - run: + name: Pull base image locally + command: | + docker pull node:16.15.0-alpine + # Analyze the base and derived image + # Note: It seems images are scanned in parallel, so preloading the base image result doesn't give us any real performance gain - anchore/analyze_local_image: - dockerfile_path: ./Dockerfile - image_name: mojaloop/${CIRCLE_PROJECT_REPONAME}:local - # Anchore bug: if policy_failure is `true`, reports don't get written - we manually check for failures below + # Force the older version, version 0.7.0 was just published, and is broken + anchore_version: v0.6.1 + image_name: "docker.io/node:16.15.0-alpine $DOCKER_ORG/$CIRCLE_PROJECT_REPONAME:$CIRCLE_TAG" policy_failure: false timeout: '500' + # Note: if the generated policy is invalid, this will fallback to the default policy, which we don't want! + policy_bundle_file_path: /tmp/mojaloop-policy.json + - run: + name: Upload Anchore reports to s3 + command: | + aws s3 cp anchore-reports ${AWS_S3_DIR_ANCHORE_REPORTS}/${CIRCLE_PROJECT_REPONAME}/ --recursive + aws s3 rm ${AWS_S3_DIR_ANCHORE_REPORTS}/latest/ --recursive --exclude "*" --include "${CIRCLE_PROJECT_REPONAME}*" + aws s3 cp anchore-reports ${AWS_S3_DIR_ANCHORE_REPORTS}/latest/ --recursive - run: - name: Evaluate Failures. - command: | - if [[ ! $(which jq) ]]; then - (set +o pipefail; apk add jq || apt-get install -y jq || yum install -y jq) - fi - if [[ $(ls anchore-reports/*content-os*.json 2> /dev/null) ]]; then - printf "\n%s\n" "The following OS packages are installed:" - jq '[.content | sort_by(.package) | .[] | {package: .package, version: .version}]' anchore-reports/*content-os*.json - fi - if [[ $(ls anchore-reports/*vuln*.json 2> /dev/null) ]]; then - printf "\n%s\n" "The following vulnerabilities were found:" - jq '[.vulnerabilities | group_by(.package) | .[] | {package: .[0].package, vuln: [.[].vuln]}]' anchore-reports/*vuln*.json - fi - # - run: - # name: Upload Anchore reports to s3 - # command: | - # aws s3 cp anchore-reports ${AWS_S3_DIR_ANCHORE_REPORTS}/${CIRCLE_PROJECT_REPONAME}/ --recursive - # aws s3 rm ${AWS_S3_DIR_ANCHORE_REPORTS}/latest/ --recursive --exclude "*" --include "${CIRCLE_PROJECT_REPONAME}*" - # aws s3 cp anchore-reports ${AWS_S3_DIR_ANCHORE_REPORTS}/latest/ --recursive - - # TODO: Enable this when we want to increase the strictness of our security policies - # failCount=$(cat anchore-reports/*policy*.json | grep 'fail' | wc -l) - # echo "FailCount is: ${failCount}" - # if [ $failCount -gt 0 ]; then - # printf "Failed with a policy failure count of: ${failCount}" - # exit 1 - # fi + name: Evaluate failures + command: /tmp/ci-config/container-scanning/anchore-result-diff.js anchore-reports/node_16.15.0-alpine-policy.json anchore-reports/${CIRCLE_PROJECT_REPONAME}*-policy.json - store_artifacts: path: anchore-reports + - slack/notify: + event: fail + template: SLACK_TEMP_RELEASE_FAILURE build-local: executor: default-machine diff --git a/package.json b/package.json index b22944319..733c145bf 100644 --- a/package.json +++ b/package.json @@ -11,8 +11,8 @@ "~": "src" }, "scripts": { - "audit:resolve": "resolve-audit --production", - "audit:check": "check-audit --production", + "audit:resolve": "npx resolve-audit --production", + "audit:check": "npx check-audit --production", "build": "npm run build:openapi; npm run build:dto:outbound", "build:openapi": "npm run build:openapi:inbound && npm run build:openapi:outbound", "build:openapi:inbound": "openapi bundle --output ./src/InboundServer/api.yaml --ext yaml ./src/InboundServer/api_template.yaml", From 4e8cf35f88972e651a9df177d572162c79d8b86c Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Thu, 7 Jul 2022 13:21:07 +0200 Subject: [PATCH 05/31] chore: test unit test fixes --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 733c145bf..e8d655f53 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,8 @@ "build:dto:outbound": "openapi-typescript ./src/OutboundServer/api.yaml --output ./src/OutboundServer/api_interfaces/openapi.d.ts", "lint": "eslint ./src/", "lint:fix": "eslint ./src/ --fix", - "test": "jest --ci --reporters=default --reporters=jest-junit --env=node test/unit/", + "test": "npm run test", + "test:unit": "jest --runInBand --ci --reporters=default --reporters=jest-junit --env=node test/unit/", "test:int": "jest --ci --reporters=default --reporters=jest-junit --env=node test/integration", "validate:api": "npm run validate:api:in; npm run validate:api:out", "validate:api:in": "swagger-cli validate ./src/InboundServer/api.yaml", From 76376b5a8cdf875e194d106026016ce67687fb9c Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Thu, 7 Jul 2022 13:25:27 +0200 Subject: [PATCH 06/31] chore: test unit test fixes --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e8d655f53..5a45782b5 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "build:dto:outbound": "openapi-typescript ./src/OutboundServer/api.yaml --output ./src/OutboundServer/api_interfaces/openapi.d.ts", "lint": "eslint ./src/", "lint:fix": "eslint ./src/ --fix", - "test": "npm run test", + "test": "npm run test:unit", "test:unit": "jest --runInBand --ci --reporters=default --reporters=jest-junit --env=node test/unit/", "test:int": "jest --ci --reporters=default --reporters=jest-junit --env=node test/integration", "validate:api": "npm run validate:api:in; npm run validate:api:out", From 43894895079e8e40821a3fc33e4ea3447c1c5963 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Thu, 7 Jul 2022 15:00:53 +0200 Subject: [PATCH 07/31] chore(snapshot): 17.0.2-snapshot.0 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index a81cc19a9..1299203fa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.1", + "version": "17.0.2-snapshot.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.1", + "version": "17.0.2-snapshot.0", "license": "Apache-2.0", "dependencies": { "@koa/cors": "^3.3.0", diff --git a/package.json b/package.json index 5a45782b5..a08ced422 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.1", + "version": "17.0.2-snapshot.0", "description": "An adapter for connecting to Mojaloop API enabled switches.", "main": "src/index.js", "types": "src/index.d.ts", From acae6fa20cfc2eb22cd653876f2b028bee50e9e5 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Thu, 7 Jul 2022 15:22:31 +0200 Subject: [PATCH 08/31] chore: updated npm-audit-resolve to latest version --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1299203fa..c606d2338 100644 --- a/package-lock.json +++ b/package-lock.json @@ -49,7 +49,7 @@ "jest": "^28.1.2", "jest-junit": "^14.0.0", "nock": "^13.2.8", - "npm-audit-resolver": "^3.0.0-0", + "npm-audit-resolver": "^3.0.0-7", "npm-check-updates": "^15.2.0", "openapi-response-validator": "^12.0.0", "openapi-typescript": "^5.4.0", diff --git a/package.json b/package.json index a08ced422..0751f8780 100644 --- a/package.json +++ b/package.json @@ -96,7 +96,7 @@ "jest": "^28.1.2", "jest-junit": "^14.0.0", "nock": "^13.2.8", - "npm-audit-resolver": "^3.0.0-0", + "npm-audit-resolver": "^3.0.0-7", "npm-check-updates": "^15.2.0", "openapi-response-validator": "^12.0.0", "openapi-typescript": "^5.4.0", From 8472e19fb2afe53ce622d2a8a6b7f33f6835f267 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Thu, 7 Jul 2022 15:25:00 +0200 Subject: [PATCH 09/31] chore: fixes for ci config --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index e7da5a185..6e719b1e9 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -257,7 +257,6 @@ jobs: license-scan: executor: default-machine steps: - - checkout - attach_workspace: at: /tmp - run: @@ -267,9 +266,10 @@ jobs: <<: *defaults_license_scanner - run: name: Run the license-scanner - command: cd /tmp/license-scanner && mode=docker dockerImages=mojaloop/$CIRCLE_PROJECT_REPONAME:local make run + command: cd /tmp/license-scanner && mode=docker dockerImages=$DOCKER_ORG/$CIRCLE_PROJECT_REPONAME:$CIRCLE_TAG make run - store_artifacts: path: /tmp/license-scanner/results + prefix: licenses image-scan: executor: anchore/anchore_engine From 9fe2aa0b4236670181e07c3696c1d0c2d50ae1ef Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Thu, 7 Jul 2022 15:29:14 +0200 Subject: [PATCH 10/31] chore(snapshot): 17.0.2-snapshot.1 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index c606d2338..ad4923b81 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.0", + "version": "17.0.2-snapshot.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.0", + "version": "17.0.2-snapshot.1", "license": "Apache-2.0", "dependencies": { "@koa/cors": "^3.3.0", diff --git a/package.json b/package.json index 0751f8780..56525ce5e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.0", + "version": "17.0.2-snapshot.1", "description": "An adapter for connecting to Mojaloop API enabled switches.", "main": "src/index.js", "types": "src/index.d.ts", From 7db3bf0e67f9cd8419fc6ffd19b31b5675e341e1 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Thu, 7 Jul 2022 15:36:17 +0200 Subject: [PATCH 11/31] chore(snapshot): 17.0.2-snapshot.2 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index ad4923b81..3a3315ffa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.1", + "version": "17.0.2-snapshot.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.1", + "version": "17.0.2-snapshot.2", "license": "Apache-2.0", "dependencies": { "@koa/cors": "^3.3.0", diff --git a/package.json b/package.json index 56525ce5e..f3784ed60 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.1", + "version": "17.0.2-snapshot.2", "description": "An adapter for connecting to Mojaloop API enabled switches.", "main": "src/index.js", "types": "src/index.d.ts", From cb91333b6ef3592f2f1fa38111e486864ddf60a9 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Thu, 7 Jul 2022 15:36:36 +0200 Subject: [PATCH 12/31] chore: fixes for ci config --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 6e719b1e9..b62cf4e6c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -860,7 +860,7 @@ workflows: - validate-openapi filters: tags: - only: /v[0-9]+(\.[0-9]+)*\-snapshot+((\.[0-9]+)?)/ + only: /v[0-9]+(\.[0-9]+)*/ branches: ignore: - /.*/ From cc7d2bd77c39fd763221736776ceff16621f161f Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Thu, 7 Jul 2022 15:36:42 +0200 Subject: [PATCH 13/31] chore(snapshot): 17.0.2-snapshot.3 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3a3315ffa..7ca601c5c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.2", + "version": "17.0.2-snapshot.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.2", + "version": "17.0.2-snapshot.3", "license": "Apache-2.0", "dependencies": { "@koa/cors": "^3.3.0", diff --git a/package.json b/package.json index f3784ed60..00c15c99c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.2", + "version": "17.0.2-snapshot.3", "description": "An adapter for connecting to Mojaloop API enabled switches.", "main": "src/index.js", "types": "src/index.d.ts", From ca892fc1d758c841679559b73804578622d14296 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Thu, 7 Jul 2022 15:45:10 +0200 Subject: [PATCH 14/31] chore: fixes for ci config --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index b62cf4e6c..bb0f19d34 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -860,7 +860,7 @@ workflows: - validate-openapi filters: tags: - only: /v[0-9]+(\.[0-9]+)*/ + only: /v[0-9]+(\.[0-9]+)*\-snapshot+((\.[0-9]+)?)/ branches: ignore: - /.*/ @@ -879,7 +879,7 @@ workflows: - validate-openapi filters: tags: - only: /.*/ + only: /v[0-9]+(\.[0-9]+)*/ branches: ignore: - /.*/ From 1351ba2d68d49633812a3f53680ca679bfa8f2bb Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Thu, 7 Jul 2022 15:45:18 +0200 Subject: [PATCH 15/31] chore(snapshot): 17.0.2-snapshot.4 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ca601c5c..4a66e1531 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.3", + "version": "17.0.2-snapshot.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.3", + "version": "17.0.2-snapshot.4", "license": "Apache-2.0", "dependencies": { "@koa/cors": "^3.3.0", diff --git a/package.json b/package.json index 00c15c99c..7e1f3e9a9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.3", + "version": "17.0.2-snapshot.4", "description": "An adapter for connecting to Mojaloop API enabled switches.", "main": "src/index.js", "types": "src/index.d.ts", From 4dfb02751987d5e4460bc620611ee8afee07e222 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Thu, 7 Jul 2022 18:11:17 +0200 Subject: [PATCH 16/31] chore: updat Dockerfile to add the ml-user --- Dockerfile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Dockerfile b/Dockerfile index cce3ba422..67eac04e2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -28,6 +28,10 @@ LABEL org.label-schema.vcs-ref=$VCS_REF LABEL org.label-schema.url="https://mojaloop.io/" LABEL org.label-schema.version=$VERSION +# Create a non-root user: ml-user +RUN adduser -D ml-user +USER ml-user + COPY --from=builder /src/ /src COPY ./src ./src COPY ./secrets / From 855d3fee29022d2e4dc6427de7186fa6aeb1b1cb Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Thu, 7 Jul 2022 18:11:24 +0200 Subject: [PATCH 17/31] chore(snapshot): 17.0.2-snapshot.5 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4a66e1531..d47fd1df6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.4", + "version": "17.0.2-snapshot.5", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.4", + "version": "17.0.2-snapshot.5", "license": "Apache-2.0", "dependencies": { "@koa/cors": "^3.3.0", diff --git a/package.json b/package.json index 7e1f3e9a9..533b99599 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.4", + "version": "17.0.2-snapshot.5", "description": "An adapter for connecting to Mojaloop API enabled switches.", "main": "src/index.js", "types": "src/index.d.ts", From e270a2af3d93d4c11a8b5c59d755235998653cd4 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Thu, 7 Jul 2022 18:17:52 +0200 Subject: [PATCH 18/31] chore: update depenendencies --- package-lock.json | 31 +++++++++++++++---------------- package.json | 4 ++-- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index d47fd1df6..6174cd47d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -50,9 +50,9 @@ "jest-junit": "^14.0.0", "nock": "^13.2.8", "npm-audit-resolver": "^3.0.0-7", - "npm-check-updates": "^15.2.0", + "npm-check-updates": "^15.2.1", "openapi-response-validator": "^12.0.0", - "openapi-typescript": "^5.4.0", + "openapi-typescript": "^5.4.1", "redis-mock": "^0.56.3", "standard-version": "^9.5.0", "supertest": "^6.2.4", @@ -13115,9 +13115,9 @@ } }, "node_modules/npm-check-updates": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-15.2.0.tgz", - "integrity": "sha512-QcNQE3FyOsolWD1Nc+DRryffuBf68fXqVDvN5gBMk3BSaRQ+urZCTfm9By0VuPPA2vrDBRPVgYZB+8L9UN4Avw==", + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-15.2.1.tgz", + "integrity": "sha512-UreoHjcbDYggZm4I8OX/Lp+QZZ8xrCDP+8xygchMBkax8mmOzL7VJ/cEvgWb99eYEZup6MuOoDaRCZUajwwG9g==", "dev": true, "dependencies": { "chalk": "^4.1.2", @@ -14000,9 +14000,9 @@ "integrity": "sha512-6Wd9k8nmGQHgCbehZCP6wwWcfXcvinhybUTBatuhjRsCxUIujuYFZc9QnGeae75CyHASewBtxs0HX/qwREReUw==" }, "node_modules/openapi-typescript": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-5.4.0.tgz", - "integrity": "sha512-YUtsWQ01igvx0xRmJvtzpHsxtvnSORrGMDTXFY1zs3znljsJDvhsUe7XrKoNP2eUmiOIwBXQMoM8M5V+nEnIrw==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-5.4.1.tgz", + "integrity": "sha512-AGB2QiZPz4rE7zIwV3dRHtoUC/CWHhUjuzGXvtmMQN2AFV8xCTLKcZUHLcdPQmt/83i22nRE7+TxXOXkK+gf4Q==", "dev": true, "dependencies": { "js-yaml": "^4.1.0", @@ -14016,8 +14016,7 @@ "openapi-typescript": "bin/cli.js" }, "engines": { - "node": ">= 14.0.0", - "npm": ">= 7.0.0" + "node": ">= 14.0.0" } }, "node_modules/openapi-typescript/node_modules/yargs-parser": { @@ -28239,9 +28238,9 @@ } }, "npm-check-updates": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-15.2.0.tgz", - "integrity": "sha512-QcNQE3FyOsolWD1Nc+DRryffuBf68fXqVDvN5gBMk3BSaRQ+urZCTfm9By0VuPPA2vrDBRPVgYZB+8L9UN4Avw==", + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-15.2.1.tgz", + "integrity": "sha512-UreoHjcbDYggZm4I8OX/Lp+QZZ8xrCDP+8xygchMBkax8mmOzL7VJ/cEvgWb99eYEZup6MuOoDaRCZUajwwG9g==", "dev": true, "requires": { "chalk": "^4.1.2", @@ -28936,9 +28935,9 @@ "integrity": "sha512-6Wd9k8nmGQHgCbehZCP6wwWcfXcvinhybUTBatuhjRsCxUIujuYFZc9QnGeae75CyHASewBtxs0HX/qwREReUw==" }, "openapi-typescript": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-5.4.0.tgz", - "integrity": "sha512-YUtsWQ01igvx0xRmJvtzpHsxtvnSORrGMDTXFY1zs3znljsJDvhsUe7XrKoNP2eUmiOIwBXQMoM8M5V+nEnIrw==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-5.4.1.tgz", + "integrity": "sha512-AGB2QiZPz4rE7zIwV3dRHtoUC/CWHhUjuzGXvtmMQN2AFV8xCTLKcZUHLcdPQmt/83i22nRE7+TxXOXkK+gf4Q==", "dev": true, "requires": { "js-yaml": "^4.1.0", diff --git a/package.json b/package.json index 533b99599..a351abec9 100644 --- a/package.json +++ b/package.json @@ -97,9 +97,9 @@ "jest-junit": "^14.0.0", "nock": "^13.2.8", "npm-audit-resolver": "^3.0.0-7", - "npm-check-updates": "^15.2.0", + "npm-check-updates": "^15.2.1", "openapi-response-validator": "^12.0.0", - "openapi-typescript": "^5.4.0", + "openapi-typescript": "^5.4.1", "redis-mock": "^0.56.3", "standard-version": "^9.5.0", "supertest": "^6.2.4", From 35cdf9444f64518d614197b3623fa078a77cef00 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Thu, 7 Jul 2022 18:17:58 +0200 Subject: [PATCH 19/31] chore(snapshot): 17.0.2-snapshot.6 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6174cd47d..5487fc2e6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.5", + "version": "17.0.2-snapshot.6", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.5", + "version": "17.0.2-snapshot.6", "license": "Apache-2.0", "dependencies": { "@koa/cors": "^3.3.0", diff --git a/package.json b/package.json index a351abec9..47ede3a60 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.5", + "version": "17.0.2-snapshot.6", "description": "An adapter for connecting to Mojaloop API enabled switches.", "main": "src/index.js", "types": "src/index.d.ts", From b50fd46fbe259796394ba86b7df6774f3754140c Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Thu, 7 Jul 2022 18:52:20 +0200 Subject: [PATCH 20/31] chore: updated dockerfile to use /opt/app folder to align to ml standards --- .dockerignore | 20 ++++++++++++++++++-- Dockerfile | 13 ++++++++----- package.json | 1 + 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/.dockerignore b/.dockerignore index 38c81075c..f30343f28 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,2 +1,18 @@ -*node_modules* -*junit.xml* +deploy/ +coverage/ +node_modules/ +.dockerignore +.editorconfig +.git/ +.gitignore +.istanbul.yml +circle.yml +docker-compose.circle.yml +docker-compose.dev.yml +docker-compose.functional.yml +docker-compose.yml +Dockerfile +LICENSE +README.md +sonar-project.properties +.devspace/ diff --git a/Dockerfile b/Dockerfile index 67eac04e2..65f1e29e4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,7 +4,7 @@ RUN apk add --no-cache git python3 build-base EXPOSE 3000 -WORKDIR /src +WORKDIR /opt/app # This is super-ugly, but it means we don't have to re-run npm install every time any of the source # files change- only when any dependencies change- which is a superior developer experience when @@ -12,7 +12,12 @@ WORKDIR /src COPY ./package.json . COPY ./package-lock.json . RUN npm ci --only=production + +COPY src /opt/app/src + FROM node:16.15.0-alpine +WORKDIR /opt/app + ARG BUILD_DATE ARG VCS_URL @@ -32,8 +37,6 @@ LABEL org.label-schema.version=$VERSION RUN adduser -D ml-user USER ml-user -COPY --from=builder /src/ /src -COPY ./src ./src -COPY ./secrets / +COPY --chown=ml-user --from=builder /opt/app . -CMD ["node", "src/index.js"] +CMD ["npm", "run", "start"] diff --git a/package.json b/package.json index 47ede3a60..34f1cd8f0 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "~": "src" }, "scripts": { + "start": "node src/index.js", "audit:resolve": "npx resolve-audit --production", "audit:check": "npx check-audit --production", "build": "npm run build:openapi; npm run build:dto:outbound", From d006c79c101ac59d9eb8a610f545e210b574bc64 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Thu, 7 Jul 2022 18:52:27 +0200 Subject: [PATCH 21/31] chore(snapshot): 17.0.2-snapshot.7 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5487fc2e6..40588bb7f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.6", + "version": "17.0.2-snapshot.7", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.6", + "version": "17.0.2-snapshot.7", "license": "Apache-2.0", "dependencies": { "@koa/cors": "^3.3.0", diff --git a/package.json b/package.json index 34f1cd8f0..cd84f66f2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.6", + "version": "17.0.2-snapshot.7", "description": "An adapter for connecting to Mojaloop API enabled switches.", "main": "src/index.js", "types": "src/index.d.ts", From b2da0fad546c6fbb85c1d406df68c2131a503788 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Thu, 7 Jul 2022 19:21:30 +0200 Subject: [PATCH 22/31] chore: fixes for docker-compose and integration.env - added ./secrets mounts to docker-compose - re-aligned wait4 mounts on docker-compose - updated test/config/integration.env to use /opt/app for JWS_SIGNING_KEY_PATH & JWS_VERIFICATION_KEYS_DIRECTORY - cleaned up CI config --- .circleci/config.yml | 4 ---- docker-compose.yml | 6 ++++-- test/config/integration.env | 4 ++-- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index bb0f19d34..35e3ea8be 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -179,15 +179,11 @@ jobs: - run: name: Execute Wait4 script command: | - [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" chmod +x ./docker/wait4/wait4.js - # chmod +x ./docker/wait4/setup_hosts_file.sh - # sh -c "./docker/wait4/setup_hosts_file.sh" sh -c "./docker/wait4/wait4.js cicd-integration-tests" - run: name: Execute integration tests command: | - [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" npm ci npm run test:int - run: diff --git a/docker-compose.yml b/docker-compose.yml index 33b4bcae9..19fe8fe3a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -22,9 +22,11 @@ services: - "4002:4002" depends_on: - redis - command: sh -c "/wait4/wait4.js sdk-scheme-adapter; node src/index.js" + command: sh -c "/tmp/wait4/wait4.js sdk-scheme-adapter && npm run start" + # command: sh -c "/tmp/wait4/wait4.js sdk-scheme-adapter && sleep 999999" volumes: - - ./docker/wait4:/wait4 + - ./docker/wait4:/tmp/wait4 + - ./secrets:/opt/app/secrets ml-testing-toolkit: networks: diff --git a/test/config/integration.env b/test/config/integration.env index 88c55c172..b56d9723c 100644 --- a/test/config/integration.env +++ b/test/config/integration.env @@ -26,8 +26,8 @@ JWS_SIGN=false JWS_SIGN_PUT_PARTIES=false # Path to JWS signing key (private key of THIS DFSP) -JWS_SIGNING_KEY_PATH=/jwsSigningKey.key -JWS_VERIFICATION_KEYS_DIRECTORY=/jwsVerificationKeys +JWS_SIGNING_KEY_PATH=/opt/app/secrets/jwsSigningKey.key +JWS_VERIFICATION_KEYS_DIRECTORY=/opt/app/secrets/jwsVerificationKeys # Location of certs and key required for TLS # IN_CA_CERT_PATH=./secrets/cacert.pem From 45ada929f1119107432813bbd488e3a9b6b3f822 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Thu, 7 Jul 2022 19:21:39 +0200 Subject: [PATCH 23/31] chore(snapshot): 17.0.2-snapshot.8 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 40588bb7f..6f866a061 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.7", + "version": "17.0.2-snapshot.8", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.7", + "version": "17.0.2-snapshot.8", "license": "Apache-2.0", "dependencies": { "@koa/cors": "^3.3.0", diff --git a/package.json b/package.json index cd84f66f2..a8967db89 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.7", + "version": "17.0.2-snapshot.8", "description": "An adapter for connecting to Mojaloop API enabled switches.", "main": "src/index.js", "types": "src/index.d.ts", From d982ee370906acba50041d1e803ec08829556a8f Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Thu, 7 Jul 2022 19:51:31 +0200 Subject: [PATCH 24/31] chore: minor integration.env cleanup --- test/config/integration.env | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/config/integration.env b/test/config/integration.env index b56d9723c..0e9d22089 100644 --- a/test/config/integration.env +++ b/test/config/integration.env @@ -26,8 +26,8 @@ JWS_SIGN=false JWS_SIGN_PUT_PARTIES=false # Path to JWS signing key (private key of THIS DFSP) -JWS_SIGNING_KEY_PATH=/opt/app/secrets/jwsSigningKey.key -JWS_VERIFICATION_KEYS_DIRECTORY=/opt/app/secrets/jwsVerificationKeys +JWS_SIGNING_KEY_PATH=secrets/jwsSigningKey.key +JWS_VERIFICATION_KEYS_DIRECTORY=secrets/jwsVerificationKeys # Location of certs and key required for TLS # IN_CA_CERT_PATH=./secrets/cacert.pem From 6ecdca48eee9b204a6dd219e979463029069479f Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Thu, 7 Jul 2022 19:51:47 +0200 Subject: [PATCH 25/31] chore(snapshot): 17.0.2-snapshot.9 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6f866a061..4aa61e903 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.8", + "version": "17.0.2-snapshot.9", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.8", + "version": "17.0.2-snapshot.9", "license": "Apache-2.0", "dependencies": { "@koa/cors": "^3.3.0", diff --git a/package.json b/package.json index a8967db89..719978358 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.8", + "version": "17.0.2-snapshot.9", "description": "An adapter for connecting to Mojaloop API enabled switches.", "main": "src/index.js", "types": "src/index.d.ts", From 5e9f1605114ae625e3e7e2a1fa89755ab747ca66 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Thu, 7 Jul 2022 20:08:15 +0200 Subject: [PATCH 26/31] chore: fixed audits --- audit-resolve.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/audit-resolve.json b/audit-resolve.json index 180747def..978cf010c 100644 --- a/audit-resolve.json +++ b/audit-resolve.json @@ -54,6 +54,11 @@ "decision": "ignore", "madeAt": 1657188203603, "expiresAt": 1659780190646 + }, + "1080969|@mojaloop/central-services-shared>@mojaloop/event-sdk>grpc>protobufjs>moment": { + "decision": "ignore", + "madeAt": 1657217280998, + "expiresAt": 1659809259103 } }, "rules": {}, From 889d693dae597c0c657866f994df3afaa6a1a599 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Thu, 7 Jul 2022 20:08:50 +0200 Subject: [PATCH 27/31] chore(snapshot): 17.0.2-snapshot.10 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4aa61e903..8f503f918 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.9", + "version": "17.0.2-snapshot.10", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.9", + "version": "17.0.2-snapshot.10", "license": "Apache-2.0", "dependencies": { "@koa/cors": "^3.3.0", diff --git a/package.json b/package.json index 719978358..72e610fd3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.9", + "version": "17.0.2-snapshot.10", "description": "An adapter for connecting to Mojaloop API enabled switches.", "main": "src/index.js", "types": "src/index.d.ts", From a4a35dacc95c9ecd55d31ca34ccd20a0b25c73f4 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Thu, 7 Jul 2022 20:33:37 +0200 Subject: [PATCH 28/31] removed commented out command from docker-compose --- docker-compose.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 19fe8fe3a..d943a6a02 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -23,7 +23,6 @@ services: depends_on: - redis command: sh -c "/tmp/wait4/wait4.js sdk-scheme-adapter && npm run start" - # command: sh -c "/tmp/wait4/wait4.js sdk-scheme-adapter && sleep 999999" volumes: - ./docker/wait4:/tmp/wait4 - ./secrets:/opt/app/secrets From 155f4a32ab123e6970bc8f4d49044ee5d96dbc07 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Thu, 7 Jul 2022 20:33:43 +0200 Subject: [PATCH 29/31] chore(snapshot): 17.0.2-snapshot.11 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8f503f918..4ab3386b9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.10", + "version": "17.0.2-snapshot.11", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.10", + "version": "17.0.2-snapshot.11", "license": "Apache-2.0", "dependencies": { "@koa/cors": "^3.3.0", diff --git a/package.json b/package.json index 72e610fd3..3c7b22b90 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.10", + "version": "17.0.2-snapshot.11", "description": "An adapter for connecting to Mojaloop API enabled switches.", "main": "src/index.js", "types": "src/index.d.ts", From 8efe1edf0f09458056422c366c5614eb75f504b2 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Fri, 8 Jul 2022 18:10:06 +0200 Subject: [PATCH 30/31] fix(mojaloop/#2816): SDK-Scheme-Adapter is missing bulkTransferState on a PUT /bulkTransfer/{id} Callback by the PayeeFSP fix(mojaloop/#2816): SDK-Scheme-Adapter is missing bulkTransferState on a PUT /bulkTransfer/{id} Callback by the PayeeFSP- https://github.com/mojaloop/project/issues/2816 --- src/lib/model/InboundTransfersModel.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/model/InboundTransfersModel.js b/src/lib/model/InboundTransfersModel.js index 0916b450a..1d620a78e 100644 --- a/src/lib/model/InboundTransfersModel.js +++ b/src/lib/model/InboundTransfersModel.js @@ -651,7 +651,7 @@ class InboundTransfersModel { if (individualTransferErrors.length) { // TODO: Verify and align with actual schema for bulk transfers error endpoint const mojaloopErrorResponse = { - bulkTransferState: 'REJECTED', + bulkTransferState: FSPIOPBulkTransferStateEnum.REJECTED, // eslint-disable-next-line no-unused-vars individualTransferResults: individualTransferErrors.map(({ transferId, transferError }) => ({ transferId, @@ -681,7 +681,7 @@ class InboundTransfersModel { // create a mojaloop transfer fulfil response const mojaloopResponse = { completedTimestamp: new Date(), - bulkTransferState: FSPIOPBulkTransferStateEnum.COMMITTED, + bulkTransferState: FSPIOPBulkTransferStateEnum.COMPLETED, }; if (response.individualTransferResults && response.individualTransferResults.length) { From 5764d232b4e9eb95cd299d7ce94256ec7d6cb595 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Fri, 8 Jul 2022 18:11:15 +0200 Subject: [PATCH 31/31] chore(snapshot): 17.0.2-snapshot.12 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4ab3386b9..eaeb744ee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.11", + "version": "17.0.2-snapshot.12", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.11", + "version": "17.0.2-snapshot.12", "license": "Apache-2.0", "dependencies": { "@koa/cors": "^3.3.0", diff --git a/package.json b/package.json index 3c7b22b90..0630cc51c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@mojaloop/sdk-scheme-adapter", - "version": "17.0.2-snapshot.11", + "version": "17.0.2-snapshot.12", "description": "An adapter for connecting to Mojaloop API enabled switches.", "main": "src/index.js", "types": "src/index.d.ts",