From e2ca71c595c4427f6495185733c7bfca1544c38e Mon Sep 17 00:00:00 2001 From: Steven Oderayi Date: Fri, 26 Jun 2020 14:51:18 +0100 Subject: [PATCH 1/6] Add bulkTransfersNegative endpoint for error scenario tests --- package-lock.json | 22 +-- package.json | 4 +- src/bulkTransfers/handler.js | 2 +- src/bulkTransfers/routes.js | 24 +-- src/bulkTransfersNegative/handler.js | 141 +++++++++++++++++ src/bulkTransfersNegative/routes.js | 219 +++++++++++++++++++++++++++ 6 files changed, 388 insertions(+), 24 deletions(-) create mode 100644 src/bulkTransfersNegative/handler.js create mode 100644 src/bulkTransfersNegative/routes.js diff --git a/package-lock.json b/package-lock.json index cc3861c5..9d263a19 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "sims", - "version": "10.4.1", + "version": "10.5.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -488,9 +488,9 @@ } }, "@mojaloop/central-services-shared": { - "version": "10.4.4", - "resolved": "https://registry.npmjs.org/@mojaloop/central-services-shared/-/central-services-shared-10.4.4.tgz", - "integrity": "sha512-8gNlylzGpL7jgrHG/q8a2sIYByftjv4x7uB8sy3kH6mGhbRpC/8ZIE18I6oykBmHMWefyx8zU4ruEgr86A2djQ==", + "version": "10.5.2", + "resolved": "https://registry.npmjs.org/@mojaloop/central-services-shared/-/central-services-shared-10.5.2.tgz", + "integrity": "sha512-e8mLezEPFmUk3HTxxGnWn0IbHSHLuzgLukenB5iLYrbEc61340Y50peYH5Fmq/5KI8LVXFNVoUUm4GhOEdksuQ==", "requires": { "@hapi/catbox": "11.1.0", "@hapi/catbox-memory": "5.0.0", @@ -499,7 +499,7 @@ "@mojaloop/central-services-metrics": "9.5.0", "@mojaloop/event-sdk": "10.4.0", "ajv": "6.12.2", - "ajv-keywords": "3.4.1", + "ajv-keywords": "3.5.0", "axios": "0.19.2", "base64url": "3.0.1", "clone": "2.1.2", @@ -870,9 +870,9 @@ } }, "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==" + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.0.tgz", + "integrity": "sha512-eyoaac3btgU8eJlvh01En8OCKzRqlLe2G5jDsCr3RiE2uLGMEEB1aaGwVVpwR8M95956tGH6R+9edC++OvzaVw==" }, "ansi-align": { "version": "3.0.0", @@ -4046,9 +4046,9 @@ "dev": true }, "nise": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nise/-/nise-4.0.3.tgz", - "integrity": "sha512-EGlhjm7/4KvmmE6B/UFsKh7eHykRl9VH+au8dduHLCyWUO/hr7+N+WtTvDUwc9zHuM1IaIJs/0lQ6Ag1jDkQSg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/nise/-/nise-4.0.4.tgz", + "integrity": "sha512-bTTRUNlemx6deJa+ZyoCUTRvH3liK5+N6VQZ4NIw90AgDXY6iPnsqplNFf6STcj+ePk0H/xqxnP75Lr0J0Fq3A==", "requires": { "@sinonjs/commons": "^1.7.0", "@sinonjs/fake-timers": "^6.0.0", diff --git a/package.json b/package.json index 452d49fd..1b04b5e0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sims", - "version": "10.4.1", + "version": "10.5.0", "description": "A super-simple fsp simulator", "main": "src/index.js", "author": "ModusBox", @@ -42,7 +42,7 @@ "@mojaloop/central-services-error-handling": "10.4.1", "@mojaloop/central-services-logger": "10.4.0", "@mojaloop/central-services-metrics": "9.5.0", - "@mojaloop/central-services-shared": "10.4.4", + "@mojaloop/central-services-shared": "10.5.2", "@mojaloop/sdk-standard-components": "10.3.2", "axios": "0.19.2", "base64url": "3.0.1", diff --git a/src/bulkTransfers/handler.js b/src/bulkTransfers/handler.js index 00fa2654..e86aad0c 100644 --- a/src/bulkTransfers/handler.js +++ b/src/bulkTransfers/handler.js @@ -45,7 +45,7 @@ exports.postBulkTransfers = async function (req, h) { ['success', 'fsp', 'operation', 'source', 'destination'] ).startTimer() - Logger.isDebugEnabled && Logger.debug(`[cid=${req.payload.bulkTransferId}, fsp=${req.headers['fspiop-source']}, source=${req.headers['fspiop-source']}, dest=${req.headers['fspiop-destination']}] ~ Simulator::api::payee::postTransfers - START`) + Logger.isDebugEnabled && Logger.debug(`[cid=${req.payload.bulkTransferId}, fsp=${req.headers['fspiop-source']}, source=${req.headers['fspiop-source']}, dest=${req.headers['fspiop-destination']}] ~ Simulator::api::payee::postBulkTransfers - START`) const metadata = `${req.method} ${req.path} ${req.payload.bulkTransferId}` Logger.isInfoEnabled && Logger.info(`IN Bulk Transfers POST:: received: ${metadata}.`) diff --git a/src/bulkTransfers/routes.js b/src/bulkTransfers/routes.js index b1e7f2af..1e2392fb 100644 --- a/src/bulkTransfers/routes.js +++ b/src/bulkTransfers/routes.js @@ -179,17 +179,21 @@ module.exports = [ params: Joi.object({ id: Joi.string().required().description('path') }), + // payload: Joi.object({ + // errorInformation: Joi.object().keys({ + // errorDescription: Joi.string().required(), + // errorCode: Joi.string().required().regex(/^[0-9]{4}/), + // extensionList: Joi.object().keys({ + // extension: Joi.array().items(Joi.object().keys({ + // key: Joi.string().required().min(1).max(32).description('Key').label('@ Supplied key fails to match the required format. @'), + // value: Joi.string().required().min(1).max(128).description('Value').label('@ Supplied key value fails to match the required format. @') + // })).required().min(1).max(16).description('extension') + // }).optional().description('Extension list') + // }).required().description('Error information') + // }) payload: Joi.object({ - errorInformation: Joi.object().keys({ - errorDescription: Joi.string().required(), - errorCode: Joi.string().required().regex(/^[0-9]{4}/), - extensionList: Joi.object().keys({ - extension: Joi.array().items(Joi.object().keys({ - key: Joi.string().required().min(1).max(32).description('Key').label('@ Supplied key fails to match the required format. @'), - value: Joi.string().required().min(1).max(128).description('Value').label('@ Supplied key value fails to match the required format. @') - })).required().min(1).max(16).description('extension') - }).optional().description('Extension list') - }).required().description('Error information') + bulkTransferState: Joi.string().required().valid('RECEIVED', 'PENDING', 'ACCEPTED', 'PROCESSING', 'COMPLETED', 'REJECTED').description('State of the bulk transfer').label('@ Invalid bulk transfer state given. @'), + completedTimestamp: Joi.string().regex(/^(?:[1-9]\d{3}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)-02-29)T(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:(\.\d{3}))(?:Z|[+-][01]\d:[0-5]\d)$/).description('When the transfer was completed').label('@ A valid transfer completion date must be supplied. @') }) } } diff --git a/src/bulkTransfersNegative/handler.js b/src/bulkTransfersNegative/handler.js new file mode 100644 index 00000000..f4b17d3b --- /dev/null +++ b/src/bulkTransfersNegative/handler.js @@ -0,0 +1,141 @@ +/***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + * ModusBox + - Steven Oderayi + -------------- + ******/ + +'use strict' +const NodeCache = require('node-cache') +const correlationCache = new NodeCache() +const requestCache = new NodeCache() +const callbackCache = new NodeCache() +const Logger = require('@mojaloop/central-services-logger') +const Enums = require('@mojaloop/central-services-shared').Enum +const Metrics = require('../lib/metrics') + +exports.postBulkTransfers = async function (req, h) { + const histTimerEnd = Metrics.getHistogram( + 'sim_request', + 'Histogram for Simulator http operations', + ['success', 'fsp', 'operation', 'source', 'destination'] + ).startTimer() + Logger.isDebugEnabled && Logger.debug(`[cid=${req.payload.bulkTransferId}, fsp=${req.headers['fspiop-source']}, source=${req.headers['fspiop-source']}, dest=${req.headers['fspiop-destination']}] ~ Simulator::api::payee::postBulkTransfers - START`) + const metadata = `${req.method} ${req.path} ${req.payload.bulkTransferId}` + Logger.isInfoEnabled && Logger.info(`IN BulkTransfersNegative POST:: received: ${metadata}.`) + histTimerEnd({ + success: true, + fsp: req.headers['fspiop-source'], + operation: 'postBulkTransfers', + source: req.headers['fspiop-source'], + destination: req.headers['fspiop-destination'] + }) + + return h.response().code(Enums.Http.ReturnCodes.ACCEPTED.CODE) +} + +exports.putBulkTransfersById = function (request, h) { + const histTimerEnd = Metrics.getHistogram( + 'sim_request', + 'Histogram for Simulator http operations', + ['success', 'fsp', 'operation', 'source', 'destination'] + ).startTimer() + Logger.isInfoEnabled && Logger.info(`IN Bulk Transfer:: PUT /bulkTransfersNegative/${request.params.id}, PAYLOAD: [${JSON.stringify(request.payload)}]`) + correlationCache.set(request.params.id, request.payload) + // Saving Incoming request + const incomingRequest = { + headers: request.headers, + data: request.payload + } + callbackCache.set(request.params.id, incomingRequest) + histTimerEnd({ + success: true, + fsp: request.headers['fspiop-source'], + operation: 'putBulkTransfersById', + source: request.headers['fspiop-source'], + destination: request.headers['fspiop-destination'] + }) + return h.response().code(Enums.Http.ReturnCodes.OK.CODE) +} + +exports.putBulkTransfersByIdError = function (request, h) { + const histTimerEnd = Metrics.getHistogram( + 'sim_request', + 'Histogram for Simulator http operations', + ['success', 'fsp', 'operation', 'source', 'destination'] + ).startTimer() + Logger.isInfoEnabled && Logger.info(`IN Bulk Transfers :: PUT /bulkTransfersNegative/${request.params.id}/error, PAYLOAD: [${JSON.stringify(request.payload)}]`) + correlationCache.set(request.params.id, request.payload) + // Saving Incoming request + const incomingRequest = { + headers: request.headers, + data: request.payload + } + callbackCache.set(request.params.id, incomingRequest) + histTimerEnd({ + success: true, + fsp: request.headers['fspiop-source'], + operation: 'putBulkTransfersByIdError', + source: request.headers['fspiop-source'], + destination: request.headers['fspiop-destination'] + }) + return h.response().code(Enums.Http.ReturnCodes.OK.CODE) +} + +exports.getCorrelationId = function (request, h) { + const histTimerEnd = Metrics.getHistogram( + 'sim_request', + 'Histogram for Simulator http operations', + ['success', 'fsp', 'operation', 'source', 'destination'] + ).startTimer() + Logger.isInfoEnabled && Logger.info(`IN bulk transfers:: Final response for GET /bulkTransfersNegative/correlationid/${request.params.id}, CACHE: [${JSON.stringify(correlationCache.get(request.params.id))}`) + histTimerEnd({ success: true, fsp: 'payee', operation: 'getBulkCorrelationId' }) + return h.response(correlationCache.get(request.params.id)).code(Enums.Http.ReturnCodes.ACCEPTED.CODE) +} + +exports.getRequestById = function (request, h) { + const histTimerEnd = Metrics.getHistogram( + 'sim_request', + 'Histogram for Simulator http operations', + ['success', 'fsp', 'operation', 'source', 'destination'] + ).startTimer() + Logger.isInfoEnabled && Logger.info(`IN Bulk Transfers :: PUT /bulkTransfersNegative/requests/${request.params.id}, CACHE: [${JSON.stringify(requestCache.get(request.params.id))}]`) + const responseData = requestCache.get(request.params.id) + requestCache.del(request.params.id) + + histTimerEnd({ success: true, fsp: 'payee', operation: 'getBulkRequestById' }) + + return h.response(responseData).code(Enums.Http.ReturnCodes.OK.CODE) +} + +exports.getCallbackById = function (request, h) { + const histTimerEnd = Metrics.getHistogram( + 'sim_request', + 'Histogram for Simulator http operations', + ['success', 'fsp', 'operation', 'source', 'destination'] + ).startTimer() + + Logger.isInfoEnabled && Logger.info(`IN Bulk Transfers :: PUT /bulkTransfers/callbacks/${request.params.id}, CACHE: [${JSON.stringify(callbackCache.get(request.params.id))}]`) + const responseData = callbackCache.get(request.params.id) + callbackCache.del(request.params.id) + + histTimerEnd({ success: true, fsp: 'payee', operation: 'getBulkCallbackById' }) + + return h.response(responseData).code(Enums.Http.ReturnCodes.OK.CODE) +} diff --git a/src/bulkTransfersNegative/routes.js b/src/bulkTransfersNegative/routes.js new file mode 100644 index 00000000..78bcd5f0 --- /dev/null +++ b/src/bulkTransfersNegative/routes.js @@ -0,0 +1,219 @@ +/***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + * ModusBox + - Steven Oderayi + + -------------- + ******/ + +const Handler = require('./handler') +const Enum = require('@mojaloop/central-services-shared').Enum +const tags = ['api', 'metadata', Enum.Tags.RouteTags.SAMPLED] +const BaseJoi = require('@hapi/joi').extend(require('joi-currency-code')) +const Joi = BaseJoi.extend(require('@hapi/joi-date')) + +module.exports = [ + { + method: 'POST', + path: '/bulkTransfersNegative', + handler: Handler.postBulkTransfers, + config: { + id: `simulator_${__dirname.split('/').pop()}_postBulkTransfers`, + tags: tags, + auth: null, + description: 'Bulk Transfer API.', + payload: { + failAction: 'error', + output: 'data' + }, + validate: { + headers: Joi.object({ + accept: Joi.string().optional().regex(/application\/vnd.interoperability[.]/), + 'content-type': Joi.string().required().regex(/application\/vnd.interoperability[.]/), + 'content-length': Joi.number().max(5242880), + date: Joi.date().format('ddd, D MMM YYYY H:mm:ss [GMT]').required(), + 'x-forwarded-for': Joi.string().optional(), + 'fspiop-source': Joi.string().required(), + 'fspiop-destination': Joi.string().required(), + 'fspiop-encryption': Joi.string().optional(), + 'fspiop-signature': Joi.string().optional(), + 'fspiop-uri': Joi.string().optional(), + 'fspiop-http-method': Joi.string().optional(), + traceparent: Joi.string().optional(), + tracestate: Joi.string().optional() + }).unknown(false).options({ stripUnknown: true }), + payload: Joi.object({ + bulkTransferId: Joi.string().guid().required().description('Id of bulk transfer').label('@ Bulk Transfer Id must be in a valid GUID format. @'), + bulkQuoteId: Joi.string().guid().required().description('Id of bulk quote').label('@ Bulk Quote Id must be in a valid GUID format. @'), + payeeFsp: Joi.string().required().min(1).max(32).description('Financial Service Provider of Payee').label('@ A valid Payee FSP number must be supplied. @'), + payerFsp: Joi.string().required().min(1).max(32).description('Financial Service Provider of Payer').label('@ A valid Payer FSP number must be supplied. @'), + extensionList: Joi.object().keys({ + extension: Joi.array().items(Joi.object().keys({ + key: Joi.string().required().min(1).max(32).description('Key').label('Supplied key fails to match the required format.'), + value: Joi.string().required().min(1).max(128).description('Value').label('Supplied key value fails to match the required format.') + })).required().min(1).max(16).description('extension') + }).optional().description('Extension list'), + individualTransfers: Joi.array().required().items({ + transferId: Joi.string().guid().required().description('Id of transfer').label('Transfer Id must be in a valid GUID format.'), + transferAmount: Joi.object().keys({ + currency: Joi.string().required().currency().description('Currency of the transfer').label('Currency needs to be a valid ISO 4217 currency code.'), + amount: Joi.string().required().regex(/^([0]|([1-9][0-9]{0,17}))([.][0-9]{0,3}[1-9])?$/).description('Amount of the transfer') + }).required().description('Amount of the transfer').label('Supplied amount fails to match the required format.'), + ilpPacket: Joi.string().required().regex(/^[A-Za-z0-9-_]+[=]{0,2}$/).min(1).max(32768).description('ilp packet').label('Supplied ILPPacket fails to match the required format.'), + condition: Joi.string().required().trim().max(48).regex(/^[A-Za-z0-9-_]{43}$/).description('Condition of transfer').label('A valid transfer condition must be supplied.'), + extensionList: Joi.object().keys({ + extension: Joi.array().items(Joi.object().keys({ + key: Joi.string().required().min(1).max(32).description('Key').label('Supplied key fails to match the required format.'), + value: Joi.string().required().min(1).max(128).description('Value').label('Supplied key value fails to match the required format.') + })).required().min(1).max(16).description('extension') + }).optional().description('Extension list') + }), + expiration: Joi.string().required().regex(/^(?:[1-9]\d{3}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)-02-29)T(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:(\.\d{3}))(?:Z|[+-][01]\d:[0-5]\d)$/).description('When the transfer expires').label('A valid transfer expiry date must be supplied.') + }), + failAction: (request, h, err) => { throw err } + } + } + }, + { + method: 'PUT', + path: '/bulkTransfersNegative/{id}', + handler: Handler.putBulkTransfersById, + config: { + id: `simulator_${__dirname.split('/').pop()}_putBulkTransfersById`, + tags: tags, + description: 'Fulfil a bulk transfer', + payload: { + failAction: 'error' + }, + validate: { + headers: Joi.object({ + 'content-type': Joi.string().required().regex(/application\/vnd.interoperability[.]/), + date: Joi.date().format('ddd, D MMM YYYY H:mm:ss [GMT]').required(), + 'x-forwarded-for': Joi.string().optional(), + 'fspiop-source': Joi.string().required(), + 'fspiop-destination': Joi.string().required(), + 'fspiop-encryption': Joi.string().optional(), + 'fspiop-signature': Joi.string().optional(), + 'fspiop-uri': Joi.string().optional(), + 'fspiop-http-method': Joi.string().optional(), + traceparent: Joi.string().optional(), + tracestate: Joi.string().optional() + }).unknown(false).options({ stripUnknown: true }), + params: Joi.object({ + id: Joi.string().required().description('path') + }), + payload: Joi.object({ + bulkTransferState: Joi.string().required().valid('RECEIVED', 'PENDING', 'ACCEPTED', 'PROCESSING', 'COMPLETED', 'REJECTED').description('State of the bulk transfer').label('@ Invalid bulk transfer state given. @'), + completedTimestamp: Joi.string().regex(/^(?:[1-9]\d{3}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)-02-29)T(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:(\.\d{3}))(?:Z|[+-][01]\d:[0-5]\d)$/).description('When the transfer was completed').label('@ A valid transfer completion date must be supplied. @'), + individualTransferResults: Joi.array().required().items({ + transferId: Joi.string().guid().required().description('Id of transfer').label('Transfer Id must be in a valid GUID format.'), + fulfilment: Joi.string().regex(/^[A-Za-z0-9-_]{43}$/).max(48).description('fulfilment of the transfer').label('@ Invalid transfer fulfilment description. @'), + errorInformation: Joi.object().keys({ + errorDescription: Joi.string().required(), + errorCode: Joi.string().required().regex(/^[0-9]{4}/), + extensionList: Joi.object().keys({ + extension: Joi.array().items(Joi.object().keys({ + key: Joi.string().required().min(1).max(32).description('Key').label('@ Supplied key fails to match the required format. @'), + value: Joi.string().required().min(1).max(128).description('Value').label('@ Supplied key value fails to match the required format. @') + })).required().min(1).max(16).description('extension') + }).optional().description('Extension list') + }).description('Error information'), + extensionList: Joi.object().keys({ + extension: Joi.array().items(Joi.object().keys({ + key: Joi.string().required().min(1).max(32).description('Key').label('Supplied key fails to match the required format.'), + value: Joi.string().required().min(1).max(128).description('Value').label('Supplied key value fails to match the required format.') + })).required().min(1).max(16).description('extension') + }).optional().description('Extension list') + }), + extensionList: Joi.object().keys({ + extension: Joi.array().items(Joi.object().keys({ + key: Joi.string().required().min(1).max(32).description('Key').label('@ Supplied key fails to match the required format. @'), + value: Joi.string().required().min(1).max(128).description('Value').label('@ Supplied key value fails to match the required format. @') + })).required().min(1).max(16).description('extension') + }).optional().description('Extension list') + }) + } + } + }, + { + method: 'PUT', + path: '/bulkTransfersNegative/{id}/error', + handler: Handler.putBulkTransfersByIdError, + options: { + id: `simulator_${__dirname.split('/').pop()}_putBulkTransfersByIdError`, + tags: tags, + description: 'Abort a bulk transfer', + payload: { + failAction: 'error' + }, + validate: { + headers: Joi.object({ + 'content-type': Joi.string().required().regex(/application\/vnd.interoperability[.]/), + date: Joi.date().format('ddd, D MMM YYYY H:mm:ss [GMT]').required(), + 'x-forwarded-for': Joi.string().optional(), + 'fspiop-source': Joi.string().required(), + 'fspiop-destination': Joi.string().optional(), + 'fspiop-encryption': Joi.string().optional(), + 'fspiop-signature': Joi.string().optional(), + 'fspiop-uri': Joi.string().optional(), + 'fspiop-http-method': Joi.string().optional(), + traceparent: Joi.string().optional(), + tracestate: Joi.string().optional() + }).unknown(false).options({ stripUnknown: true }), + params: Joi.object({ + id: Joi.string().required().description('path') + }), + payload: Joi.object({ + bulkTransferState: Joi.string().required().valid('RECEIVED', 'PENDING', 'ACCEPTED', 'PROCESSING', 'COMPLETED', 'REJECTED').description('State of the bulk transfer').label('@ Invalid bulk transfer state given. @'), + completedTimestamp: Joi.string().regex(/^(?:[1-9]\d{3}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)-02-29)T(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:(\.\d{3}))(?:Z|[+-][01]\d:[0-5]\d)$/).description('When the transfer was completed').label('@ A valid transfer completion date must be supplied. @') + }) + } + } + }, + { + method: 'GET', + path: '/bulkTransfersNegative/correlationid/{id}', + handler: Handler.getCorrelationId, + options: { + id: `simulator_${__dirname.split('/').pop()}_getCorrelationId`, + tags: tags, + description: 'Get details based on correlationid' + } + }, + { + method: 'GET', + path: '/bulkTransfersNegative/requests/{id}', + handler: Handler.getRequestById, + options: { + id: `simulator_${__dirname.split('/').pop()}_getRequestById`, + tags: tags, + description: 'Get details based on request id' + } + }, + { + method: 'GET', + path: '/bulkTransfersNegative/callbacks/{id}', + handler: Handler.getCallbackById, + options: { + id: `simulator_${__dirname.split('/').pop()}_getCallbackById`, + tags: tags, + description: 'Get details based on callback id' + } + } +] From de9aed5eb0695703f484df7e1af473f11b220dde Mon Sep 17 00:00:00 2001 From: Steven Oderayi Date: Mon, 29 Jun 2020 10:40:12 +0100 Subject: [PATCH 2/6] Clean up --- src/bulkTransfers/routes.js | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/bulkTransfers/routes.js b/src/bulkTransfers/routes.js index 1e2392fb..96bd20a1 100644 --- a/src/bulkTransfers/routes.js +++ b/src/bulkTransfers/routes.js @@ -179,18 +179,6 @@ module.exports = [ params: Joi.object({ id: Joi.string().required().description('path') }), - // payload: Joi.object({ - // errorInformation: Joi.object().keys({ - // errorDescription: Joi.string().required(), - // errorCode: Joi.string().required().regex(/^[0-9]{4}/), - // extensionList: Joi.object().keys({ - // extension: Joi.array().items(Joi.object().keys({ - // key: Joi.string().required().min(1).max(32).description('Key').label('@ Supplied key fails to match the required format. @'), - // value: Joi.string().required().min(1).max(128).description('Value').label('@ Supplied key value fails to match the required format. @') - // })).required().min(1).max(16).description('extension') - // }).optional().description('Extension list') - // }).required().description('Error information') - // }) payload: Joi.object({ bulkTransferState: Joi.string().required().valid('RECEIVED', 'PENDING', 'ACCEPTED', 'PROCESSING', 'COMPLETED', 'REJECTED').description('State of the bulk transfer').label('@ Invalid bulk transfer state given. @'), completedTimestamp: Joi.string().regex(/^(?:[1-9]\d{3}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)-02-29)T(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:(\.\d{3}))(?:Z|[+-][01]\d:[0-5]\d)$/).description('When the transfer was completed').label('@ A valid transfer completion date must be supplied. @') From 8cc6af4c71335180ec410660252e61f6300239d2 Mon Sep 17 00:00:00 2001 From: Steven Oderayi Date: Mon, 29 Jun 2020 14:03:05 +0100 Subject: [PATCH 3/6] Bump version to work around gh error --- 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 9d263a19..6fae839c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "sims", - "version": "10.5.0", + "version": "10.5.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 1b04b5e0..dbbf475c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sims", - "version": "10.5.0", + "version": "10.5.1", "description": "A super-simple fsp simulator", "main": "src/index.js", "author": "ModusBox", From d0f54da60ff428b17e3d0d71fa1b2b41b6a60aa8 Mon Sep 17 00:00:00 2001 From: Steven Oderayi Date: Thu, 9 Jul 2020 13:38:40 +0100 Subject: [PATCH 4/6] Ensure requests and callbacks are stored for bulkTransfersNegative endpoint --- package-lock.json | 288 ++++++++++++++++++++------- package.json | 12 +- src/bulkTransfersNegative/handler.js | 7 + 3 files changed, 234 insertions(+), 73 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6fae839c..091bb295 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "sims", - "version": "10.5.1", + "version": "10.6.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -82,6 +82,16 @@ "js-tokens": "^4.0.0" } }, + "@dabh/diagnostics": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", + "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==", + "requires": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, "@grpc/proto-loader": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.5.4.tgz", @@ -461,22 +471,22 @@ "optional": true }, "@mojaloop/central-services-error-handling": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/@mojaloop/central-services-error-handling/-/central-services-error-handling-10.4.1.tgz", - "integrity": "sha512-WGhZC+L5va4XwA2jFi7+1S1DrnpRE7Vdefu6u676d2AH1SvMx2ZM8e5943+1Y1T/xlF1ngXYrP7HSMaQG4g+GA==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/@mojaloop/central-services-error-handling/-/central-services-error-handling-10.6.0.tgz", + "integrity": "sha512-93Jbz/CWNxMiA6/x+KmQezf7C/K3etIAwmXdeAjR9BBDM9xJt1nGfRDovXJZzqV5pTgh9ytGen7A3ub6oVqcQA==", "requires": { "@mojaloop/sdk-standard-components": "10.3.2", - "lodash": "4.17.15" + "lodash": "4.17.19" } }, "@mojaloop/central-services-logger": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/@mojaloop/central-services-logger/-/central-services-logger-10.4.0.tgz", - "integrity": "sha512-vndjDG6klX7cGF8+5KrlmwDtav+2rCL5Ntpfd5NG9FqxluFcUkj9d2BUUs99CzG+qkkJZNITvfL8uBooSdYiJg==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/@mojaloop/central-services-logger/-/central-services-logger-10.6.0.tgz", + "integrity": "sha512-fvZVCtquX+QR+kuKhx/jiyf+B5E7zXYi1HfgaLWR/5+wqdopMltxRGYyRZJyJ1uqdstm+/HOSFvWjqv3JXZ1hw==", "requires": { "parse-strings-in-object": "2.0.0", "rc": "1.2.8", - "winston": "3.2.1" + "winston": "3.3.3" } }, "@mojaloop/central-services-metrics": { @@ -488,9 +498,9 @@ } }, "@mojaloop/central-services-shared": { - "version": "10.5.2", - "resolved": "https://registry.npmjs.org/@mojaloop/central-services-shared/-/central-services-shared-10.5.2.tgz", - "integrity": "sha512-e8mLezEPFmUk3HTxxGnWn0IbHSHLuzgLukenB5iLYrbEc61340Y50peYH5Fmq/5KI8LVXFNVoUUm4GhOEdksuQ==", + "version": "10.5.3", + "resolved": "https://registry.npmjs.org/@mojaloop/central-services-shared/-/central-services-shared-10.5.3.tgz", + "integrity": "sha512-RG91BLBTgui51NAsEogtxY6Stq9ic2OmfRe5qpSgQze4HM6+ziEMBVyxeVSM+43FbwXE3RKCJFHe77akba+xew==", "requires": { "@hapi/catbox": "11.1.0", "@hapi/catbox-memory": "5.0.0", @@ -521,6 +531,74 @@ "@hapi/joi": "17.x.x", "@hapi/podium": "4.x.x" } + }, + "@mojaloop/central-services-error-handling": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@mojaloop/central-services-error-handling/-/central-services-error-handling-10.4.1.tgz", + "integrity": "sha512-WGhZC+L5va4XwA2jFi7+1S1DrnpRE7Vdefu6u676d2AH1SvMx2ZM8e5943+1Y1T/xlF1ngXYrP7HSMaQG4g+GA==", + "requires": { + "@mojaloop/sdk-standard-components": "10.3.2", + "lodash": "4.17.15" + } + }, + "@mojaloop/central-services-logger": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@mojaloop/central-services-logger/-/central-services-logger-10.4.0.tgz", + "integrity": "sha512-vndjDG6klX7cGF8+5KrlmwDtav+2rCL5Ntpfd5NG9FqxluFcUkj9d2BUUs99CzG+qkkJZNITvfL8uBooSdYiJg==", + "requires": { + "parse-strings-in-object": "2.0.0", + "rc": "1.2.8", + "winston": "3.2.1" + } + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "requires": { + "lodash": "^4.17.14" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "one-time": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz", + "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=" + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "winston": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.2.1.tgz", + "integrity": "sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw==", + "requires": { + "async": "^2.6.1", + "diagnostics": "^1.1.1", + "is-stream": "^1.1.0", + "logform": "^2.1.1", + "one-time": "0.0.4", + "readable-stream": "^3.1.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.3.0" + } } } }, @@ -547,15 +625,74 @@ "winston": "3.2.1" }, "dependencies": { + "@mojaloop/central-services-logger": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@mojaloop/central-services-logger/-/central-services-logger-10.4.0.tgz", + "integrity": "sha512-vndjDG6klX7cGF8+5KrlmwDtav+2rCL5Ntpfd5NG9FqxluFcUkj9d2BUUs99CzG+qkkJZNITvfL8uBooSdYiJg==", + "requires": { + "parse-strings-in-object": "2.0.0", + "rc": "1.2.8", + "winston": "3.2.1" + } + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "requires": { + "lodash": "^4.17.14" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, "moment": { "version": "2.26.0", "resolved": "https://registry.npmjs.org/moment/-/moment-2.26.0.tgz", "integrity": "sha512-oIixUO+OamkUkwjhAVE18rAMfRJNsNe/Stid/gwHSOfHrOtw9EhAY2AHvdKZ/k/MggcYELFCJz/Sn2pL8b8JMw==" }, + "one-time": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz", + "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=" + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, "tslib": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz", "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==" + }, + "winston": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.2.1.tgz", + "integrity": "sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw==", + "requires": { + "async": "^2.6.1", + "diagnostics": "^1.1.1", + "is-stream": "^1.1.0", + "logform": "^2.1.1", + "one-time": "0.0.4", + "readable-stream": "^3.1.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.3.0" + } } } }, @@ -780,9 +917,9 @@ "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" }, "@types/node": { - "version": "13.13.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.12.tgz", - "integrity": "sha512-zWz/8NEPxoXNT9YyF2osqyA9WjssZukYpgI4UYZpOjcyqwIUqWGkcCionaEb9Ki+FULyPyvNFpg/329Kd2/pbw==" + "version": "13.13.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.13.tgz", + "integrity": "sha512-UfvBE9oRCAJVzfR+3eWm/sdLFe/qroAPEXP3GPJ1SehQiEVgZT6NQZWYbPMiJ3UdcKM06v4j+S1lTcdWCmw+3g==" }, "abab": { "version": "2.0.3", @@ -1017,12 +1154,9 @@ "dev": true }, "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "requires": { - "lodash": "^4.17.14" - } + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" }, "asynckit": { "version": "0.4.0", @@ -1866,6 +2000,24 @@ "colorspace": "1.1.x", "enabled": "1.0.x", "kuler": "1.0.x" + }, + "dependencies": { + "enabled": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", + "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", + "requires": { + "env-variable": "0.0.x" + } + }, + "kuler": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz", + "integrity": "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==", + "requires": { + "colornames": "^1.1.1" + } + } } }, "diff": { @@ -1958,12 +2110,9 @@ "dev": true }, "enabled": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", - "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", - "requires": { - "env-variable": "0.0.x" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" }, "encoding": { "version": "0.1.12", @@ -2518,9 +2667,9 @@ "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" }, "fecha": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz", - "integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.0.tgz", + "integrity": "sha512-aN3pcx/DSmtyoovUudctc8+6Hl4T+hI9GBBHLjA76jdZl7+b1sgh5g4k+u/GL3dTy1/pnYzKp69FpJ0OicE3Wg==" }, "figgy-pudding": { "version": "3.5.2", @@ -2598,6 +2747,11 @@ "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, + "fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, "follow-redirects": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", @@ -3304,9 +3458,9 @@ } }, "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" }, "is-string": { "version": "1.0.5", @@ -3580,12 +3734,9 @@ "dev": true }, "kuler": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz", - "integrity": "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==", - "requires": { - "colornames": "^1.1.1" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" }, "latest-version": { "version": "5.1.0", @@ -3648,9 +3799,9 @@ } }, "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" }, "lodash.camelcase": { "version": "4.3.0", @@ -3713,13 +3864,13 @@ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" }, "logform": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.1.2.tgz", - "integrity": "sha512-+lZh4OpERDBLqjiwDLpAWNQu6KMjnlXH2ByZwCuSqVPJletw0kTWJf5CgSNAUKn1KUkv3m2cUz/LK8zyEy7wzQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", + "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==", "requires": { "colors": "^1.2.1", "fast-safe-stringify": "^2.0.4", - "fecha": "^2.3.3", + "fecha": "^4.2.0", "ms": "^2.1.1", "triple-beam": "^1.3.0" } @@ -4058,9 +4209,9 @@ } }, "node-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-5.1.1.tgz", - "integrity": "sha512-bJ9nH25Z51HG2QIu66K4dMVyMs6o8bNQpviDnXzG+O/gfNxPU9IpIig0j4pzlO707GcGZ6QA4rWhlRxjJsjnZw==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-5.1.2.tgz", + "integrity": "sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==", "requires": { "clone": "2.x" } @@ -4610,9 +4761,12 @@ } }, "one-time": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz", - "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "requires": { + "fn.name": "1.x.x" + } }, "onetime": { "version": "5.1.0", @@ -6471,19 +6625,19 @@ "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" }, "winston": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.2.1.tgz", - "integrity": "sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw==", - "requires": { - "async": "^2.6.1", - "diagnostics": "^1.1.1", - "is-stream": "^1.1.0", - "logform": "^2.1.1", - "one-time": "0.0.4", - "readable-stream": "^3.1.1", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.3.3.tgz", + "integrity": "sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw==", + "requires": { + "@dabh/diagnostics": "^2.0.2", + "async": "^3.1.0", + "is-stream": "^2.0.0", + "logform": "^2.2.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", "stack-trace": "0.0.x", "triple-beam": "^1.3.0", - "winston-transport": "^4.3.0" + "winston-transport": "^4.4.0" }, "dependencies": { "readable-stream": { @@ -6499,11 +6653,11 @@ } }, "winston-transport": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.3.0.tgz", - "integrity": "sha512-B2wPuwUi3vhzn/51Uukcao4dIduEiPOcOt9HJ3QeaXgkJ5Z7UwpBzxS4ZGNHtrxrUvTwemsQiSys0ihOf8Mp1A==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", + "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", "requires": { - "readable-stream": "^2.3.6", + "readable-stream": "^2.3.7", "triple-beam": "^1.2.0" } }, diff --git a/package.json b/package.json index dbbf475c..c150cad4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sims", - "version": "10.5.1", + "version": "10.6.0", "description": "A super-simple fsp simulator", "main": "src/index.js", "author": "ModusBox", @@ -39,10 +39,10 @@ "@hapi/joi": "17.1.1", "@hapi/joi-date": "2.0.1", "@hapi/vision": "6.0.0", - "@mojaloop/central-services-error-handling": "10.4.1", - "@mojaloop/central-services-logger": "10.4.0", + "@mojaloop/central-services-error-handling": "10.6.0", + "@mojaloop/central-services-logger": "10.6.0", "@mojaloop/central-services-metrics": "9.5.0", - "@mojaloop/central-services-shared": "10.5.2", + "@mojaloop/central-services-shared": "10.5.3", "@mojaloop/sdk-standard-components": "10.3.2", "axios": "0.19.2", "base64url": "3.0.1", @@ -50,8 +50,8 @@ "glob": "7.1.6", "hapi-swagger": "12.1.3", "joi-currency-code": "3.0.1", - "lodash": "4.17.15", - "node-cache": "5.1.1" + "lodash": "4.17.19", + "node-cache": "5.1.2" }, "devDependencies": { "pre-commit": "1.2.2", diff --git a/src/bulkTransfersNegative/handler.js b/src/bulkTransfersNegative/handler.js index f4b17d3b..70122715 100644 --- a/src/bulkTransfersNegative/handler.js +++ b/src/bulkTransfersNegative/handler.js @@ -39,6 +39,13 @@ exports.postBulkTransfers = async function (req, h) { Logger.isDebugEnabled && Logger.debug(`[cid=${req.payload.bulkTransferId}, fsp=${req.headers['fspiop-source']}, source=${req.headers['fspiop-source']}, dest=${req.headers['fspiop-destination']}] ~ Simulator::api::payee::postBulkTransfers - START`) const metadata = `${req.method} ${req.path} ${req.payload.bulkTransferId}` Logger.isInfoEnabled && Logger.info(`IN BulkTransfersNegative POST:: received: ${metadata}.`) + correlationCache.set(req.payload.bulkTransferId, req.payload) + // Saving Incoming request + const incomingRequest = { + headers: req.headers, + data: req.payload + } + requestCache.set(req.payload.bulkTransferId, incomingRequest) histTimerEnd({ success: true, fsp: req.headers['fspiop-source'], From 453b7ec28bcf87564d078e3c97a66f12a61be465 Mon Sep 17 00:00:00 2001 From: Steven Oderayi Date: Thu, 9 Jul 2020 13:49:16 +0100 Subject: [PATCH 5/6] Resolve audit issues --- audit-resolve.json | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/audit-resolve.json b/audit-resolve.json index 894ded52..65a2dd07 100644 --- a/audit-resolve.json +++ b/audit-resolve.json @@ -7,8 +7,8 @@ }, "1523|@mojaloop/central-services-shared>@mojaloop/central-services-error-handling>lodash": { "decision": "ignore", - "madeAt": 1593690805474, - "expiresAt": 1594295587401 + "madeAt": 1594298944661, + "expiresAt": 1594903731767 }, "1523|@mojaloop/central-services-logger>winston>async>lodash": { "decision": "ignore", @@ -16,29 +16,26 @@ "expiresAt": 1594295587401 }, "1523|@mojaloop/central-services-shared>@mojaloop/central-services-logger>winston>async>lodash": { - "decision": "ignore", - "madeAt": 1593690805474, - "expiresAt": 1594295587401 + "decision": "fix", + "madeAt": 1594298940628 }, "1523|@mojaloop/central-services-shared>@mojaloop/event-sdk>@mojaloop/central-services-logger>winston>async>lodash": { - "decision": "ignore", - "madeAt": 1593690805474, - "expiresAt": 1594295587401 + "decision": "fix", + "madeAt": 1594298940628 }, "1523|@mojaloop/central-services-shared>@mojaloop/event-sdk>winston>async>lodash": { - "decision": "ignore", - "madeAt": 1593690805474, - "expiresAt": 1594295587401 + "decision": "fix", + "madeAt": 1594298940628 }, "1523|@mojaloop/central-services-shared>@mojaloop/event-sdk>lodash": { "decision": "ignore", - "madeAt": 1593690805474, - "expiresAt": 1594295587401 + "madeAt": 1594298944661, + "expiresAt": 1594903731767 }, "1523|@mojaloop/central-services-shared>lodash": { "decision": "ignore", - "madeAt": 1593690805474, - "expiresAt": 1594295587401 + "madeAt": 1594298944661, + "expiresAt": 1594903731767 }, "1523|@mojaloop/central-services-shared>openapi-backend>lodash": { "decision": "ignore", From 14749737943e5a83ceadb98c71a8487ebec54c11 Mon Sep 17 00:00:00 2001 From: Steven Oderayi Date: Thu, 9 Jul 2020 13:52:51 +0100 Subject: [PATCH 6/6] Resolve audit issues --- audit-resolve.json | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/audit-resolve.json b/audit-resolve.json index 65a2dd07..14cf32b7 100644 --- a/audit-resolve.json +++ b/audit-resolve.json @@ -16,16 +16,19 @@ "expiresAt": 1594295587401 }, "1523|@mojaloop/central-services-shared>@mojaloop/central-services-logger>winston>async>lodash": { - "decision": "fix", - "madeAt": 1594298940628 + "decision": "ignore", + "madeAt": 1594299151022, + "expiresAt": 1594903942653 }, "1523|@mojaloop/central-services-shared>@mojaloop/event-sdk>@mojaloop/central-services-logger>winston>async>lodash": { - "decision": "fix", - "madeAt": 1594298940628 + "decision": "ignore", + "madeAt": 1594299151022, + "expiresAt": 1594903942653 }, "1523|@mojaloop/central-services-shared>@mojaloop/event-sdk>winston>async>lodash": { - "decision": "fix", - "madeAt": 1594298940628 + "decision": "ignore", + "madeAt": 1594299151022, + "expiresAt": 1594903942653 }, "1523|@mojaloop/central-services-shared>@mojaloop/event-sdk>lodash": { "decision": "ignore",