diff --git a/package-lock.json b/package-lock.json index 9aefc2f6..c8ced466 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,18 +17,18 @@ "@mojaloop/central-services-health": "15.0.0", "@mojaloop/central-services-logger": "11.5.1", "@mojaloop/central-services-metrics": "12.4.2", - "@mojaloop/central-services-shared": "18.14.1", + "@mojaloop/central-services-shared": "18.15.0", "@mojaloop/central-services-stream": "11.4.1", "@mojaloop/event-sdk": "14.1.1", "@mojaloop/inter-scheme-proxy-cache-lib": "2.3.1", "@mojaloop/ml-number": "11.2.4", - "@mojaloop/ml-schema-transformer-lib": "2.4.2", + "@mojaloop/ml-schema-transformer-lib": "2.5.1", "@mojaloop/sdk-standard-components": "18.1.0", "ajv": "8.17.1", "ajv-keywords": "5.1.0", "axios": "1.7.9", "blipp": "4.0.2", - "commander": "12.1.0", + "commander": "13.0.0", "event-stream": "4.0.1", "fast-safe-stringify": "^2.1.1", "good-console": "8.0.0", @@ -51,7 +51,7 @@ "ioredis-mock": "8.9.0", "jest": "29.7.0", "jest-junit": "16.0.0", - "npm-check-updates": "17.1.11", + "npm-check-updates": "17.1.13", "nyc": "17.1.0", "pre-commit": "1.2.2", "proxyquire": "2.1.3", @@ -1840,9 +1840,9 @@ } }, "node_modules/@mojaloop/central-services-shared": { - "version": "18.14.1", - "resolved": "https://registry.npmjs.org/@mojaloop/central-services-shared/-/central-services-shared-18.14.1.tgz", - "integrity": "sha512-m04gmTfm7WBqdFgZBPljgUWRQ+htCTQJQ9jjblvj4b5Rbw0YI4gntsjyBxFKcVIIqluCeSmhzb9GPTIP/6Simg==", + "version": "18.15.0", + "resolved": "https://registry.npmjs.org/@mojaloop/central-services-shared/-/central-services-shared-18.15.0.tgz", + "integrity": "sha512-2pjGva6DuXtHRUjhh9zEzkkEdNMH/WQdL8cmh/NqiI7XlL9YJOK6Dvw6PhnTgAOP1WTrhYffVKi1ypF0Eywi+Q==", "dependencies": { "@hapi/catbox": "12.1.1", "@hapi/catbox-memory": "5.0.1", @@ -1854,7 +1854,7 @@ "event-stream": "4.0.1", "fast-safe-stringify": "^2.1.1", "immutable": "5.0.3", - "ioredis": "^5.4.1", + "ioredis": "^5.4.2", "lodash": "4.17.21", "mustache": "4.2.0", "openapi-backend": "5.11.1", @@ -1864,7 +1864,7 @@ "ulidx": "2.4.1", "uuid4": "2.0.3", "widdershins": "^4.0.1", - "yaml": "2.6.1" + "yaml": "2.7.0" }, "peerDependencies": { "@mojaloop/central-services-error-handling": ">=13.x.x", @@ -2031,13 +2031,13 @@ } }, "node_modules/@mojaloop/ml-schema-transformer-lib": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@mojaloop/ml-schema-transformer-lib/-/ml-schema-transformer-lib-2.4.2.tgz", - "integrity": "sha512-joBig2u3LeNwQhrT6Dg1LH6lQb4W/NmnPpQHCIloUQ3o3Qk2sZ2a33FMIT/b0nangmxtzGL5YUmR5x4jkfKYiQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@mojaloop/ml-schema-transformer-lib/-/ml-schema-transformer-lib-2.5.1.tgz", + "integrity": "sha512-j4/HRlyNKJtvU2Ci9olWXVfpzVfvoGUr6eRmDzY/2RAf3X3Agfj11AB9nctE74lg8E+TOme8sWXP+fSX8kt4lQ==", "dependencies": { "@mojaloop/central-services-error-handling": "^13.0.2", "@mojaloop/central-services-logger": "^11.5.1", - "@mojaloop/central-services-shared": "^18.14.1", + "@mojaloop/central-services-shared": "^18.14.2", "ilp-packet": "2.2.0", "map-transform-cjs": "^0.2.0" }, @@ -3684,9 +3684,9 @@ } }, "node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.0.0.tgz", + "integrity": "sha512-oPYleIY8wmTVzkvQq10AEok6YcTC4sRUBl8F9gVuwchGVUCTbl/vhLTaQqutuuySYOsu8YTgV+OxKc/8Yvx+mQ==", "engines": { "node": ">=18" } @@ -7385,9 +7385,9 @@ } }, "node_modules/ioredis": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.4.1.tgz", - "integrity": "sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.4.2.tgz", + "integrity": "sha512-0SZXGNGZ+WzISQ67QDyZ2x0+wVxjjUndtD8oSeik/4ajifeiRufed8fCb8QW8VMyi4MXcS+UO1k/0NGhvq1PAg==", "dependencies": { "@ioredis/commands": "^1.1.1", "cluster-key-slot": "^1.1.0", @@ -9983,9 +9983,9 @@ } }, "node_modules/npm-check-updates": { - "version": "17.1.11", - "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-17.1.11.tgz", - "integrity": "sha512-TR2RuGIH7P3Qrb0jfdC/nT7JWqXPKjDlxuNQt3kx4oNVf1Pn5SBRB7KLypgYZhruivJthgTtfkkyK4mz342VjA==", + "version": "17.1.13", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-17.1.13.tgz", + "integrity": "sha512-m9Woo2J5XVab0VcQpYvrQ0hx3ySI1mGbiHR595mc6Lr1/FIaTWvv+oU+T1WKSfXRiluKC/V5P6Bdk5agaYpqqg==", "dev": true, "bin": { "ncu": "build/cli.js", @@ -14798,9 +14798,9 @@ "dev": true }, "node_modules/yaml": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", - "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", "bin": { "yaml": "bin.mjs" }, diff --git a/package.json b/package.json index ca24290c..79a740e8 100644 --- a/package.json +++ b/package.json @@ -111,18 +111,18 @@ "@mojaloop/central-services-health": "15.0.0", "@mojaloop/central-services-logger": "11.5.1", "@mojaloop/central-services-metrics": "12.4.2", - "@mojaloop/central-services-shared": "18.14.1", + "@mojaloop/central-services-shared": "18.15.0", "@mojaloop/central-services-stream": "11.4.1", "@mojaloop/event-sdk": "14.1.1", "@mojaloop/inter-scheme-proxy-cache-lib": "2.3.1", "@mojaloop/ml-number": "11.2.4", - "@mojaloop/ml-schema-transformer-lib": "2.4.2", + "@mojaloop/ml-schema-transformer-lib": "2.5.1", "@mojaloop/sdk-standard-components": "18.1.0", "ajv": "8.17.1", "ajv-keywords": "5.1.0", "axios": "1.7.9", "blipp": "4.0.2", - "commander": "12.1.0", + "commander": "13.0.0", "event-stream": "4.0.1", "fast-safe-stringify": "^2.1.1", "good-console": "8.0.0", @@ -145,7 +145,7 @@ "ioredis-mock": "8.9.0", "jest": "29.7.0", "jest-junit": "16.0.0", - "npm-check-updates": "17.1.11", + "npm-check-updates": "17.1.13", "nyc": "17.1.0", "pre-commit": "1.2.2", "proxyquire": "2.1.3", diff --git a/src/api/bulkQuotes.js b/src/api/bulkQuotes.js index 525dba9a..a0e94d5e 100644 --- a/src/api/bulkQuotes.js +++ b/src/api/bulkQuotes.js @@ -34,7 +34,6 @@ const Metrics = require('@mojaloop/central-services-metrics') const { Producer } = require('@mojaloop/central-services-stream').Util const { Http, Events } = require('@mojaloop/central-services-shared').Enum -const { reformatFSPIOPError } = require('@mojaloop/central-services-error-handling').Factory const util = require('../lib/util') const Config = require('../lib/config') @@ -59,7 +58,6 @@ module.exports = { 'Publish HTTP POST bulkQuotes request', ['success'] ).startTimer() - const errorCounter = Metrics.getCounter('errorCount') let step try { @@ -80,14 +78,7 @@ module.exports = { return h.response().code(Http.ReturnCodes.ACCEPTED.CODE) } catch (err) { histTimerEnd({ success: false }) - const fspiopError = reformatFSPIOPError(err) - errorCounter.inc({ - code: fspiopError?.apiErrorCode.code, - system: undefined, - operation: 'postBulkQuotes', - step - }) - util.rethrowFspiopError(err) + util.rethrowAndCountFspiopError(err, { operation: 'postBulkQuotes', step }) } } } diff --git a/src/api/bulkQuotes/{id}.js b/src/api/bulkQuotes/{id}.js index 140df63b..d4c0d9ff 100644 --- a/src/api/bulkQuotes/{id}.js +++ b/src/api/bulkQuotes/{id}.js @@ -33,7 +33,6 @@ const Metrics = require('@mojaloop/central-services-metrics') const { Producer } = require('@mojaloop/central-services-stream').Util const { Http, Events } = require('@mojaloop/central-services-shared').Enum -const { reformatFSPIOPError } = require('@mojaloop/central-services-error-handling').Factory const util = require('../../lib/util') const Config = require('../../lib/config') @@ -58,7 +57,6 @@ module.exports = { 'Publish HTTP GET /bulkQuotes/{id} request', ['success'] ).startTimer() - const errorCounter = Metrics.getCounter('errorCount') let step try { @@ -79,14 +77,7 @@ module.exports = { return h.response().code(Http.ReturnCodes.ACCEPTED.CODE) } catch (err) { histTimerEnd({ success: false }) - const fspiopError = reformatFSPIOPError(err) - errorCounter.inc({ - code: fspiopError?.apiErrorCode.code, - system: undefined, - operation: 'getBulkQuotesById', - step - }) - util.rethrowFspiopError(err) + util.rethrowAndCountFspiopError(err, { operation: 'getBulkQuotesById', step }) } }, /** @@ -102,7 +93,6 @@ module.exports = { 'Publish HTTP PUT /bulkQuotes/{id} request', ['success'] ).startTimer() - const errorCounter = Metrics.getCounter('errorCount') let step try { @@ -123,14 +113,7 @@ module.exports = { return h.response().code(Http.ReturnCodes.OK.CODE) } catch (err) { histTimerEnd({ success: false }) - const fspiopError = reformatFSPIOPError(err) - errorCounter.inc({ - code: fspiopError?.apiErrorCode.code, - system: undefined, - operation: 'putBulkQuotesById', - step - }) - util.rethrowFspiopError(err) + util.rethrowAndCountFspiopError(err, { operation: 'putBulkQuotesById', step }) } } } diff --git a/src/api/bulkQuotes/{id}/error.js b/src/api/bulkQuotes/{id}/error.js index f7a836d8..5ede801b 100644 --- a/src/api/bulkQuotes/{id}/error.js +++ b/src/api/bulkQuotes/{id}/error.js @@ -33,11 +33,10 @@ const Metrics = require('@mojaloop/central-services-metrics') const { Producer } = require('@mojaloop/central-services-stream').Util const { Http, Events } = require('@mojaloop/central-services-shared').Enum -const { reformatFSPIOPError } = require('@mojaloop/central-services-error-handling').Factory -const util = require('../../../lib/util') const Config = require('../../../lib/config') const dto = require('../../../lib/dto') +const util = require('../../../lib/util') const { kafkaConfig } = new Config() @@ -59,7 +58,6 @@ module.exports = { 'Process HTTP PUT /bulkQuotes/{id}/error request', ['success'] ).startTimer() - const errorCounter = Metrics.getCounter('errorCount') let step try { @@ -80,14 +78,7 @@ module.exports = { return h.response().code(Http.ReturnCodes.OK.CODE) } catch (err) { histTimerEnd({ success: false }) - const fspiopError = reformatFSPIOPError(err) - errorCounter.inc({ - code: fspiopError?.apiErrorCode.code, - system: undefined, - operation: 'putBulkQuotesByIdError', - step - }) - util.rethrowFspiopError(err) + util.rethrowAndCountFspiopError(err, { operation: 'putBulkQuotesByIdError', step }) } } } diff --git a/src/api/quotes.js b/src/api/quotes.js index c340724d..5ddf22ca 100644 --- a/src/api/quotes.js +++ b/src/api/quotes.js @@ -34,7 +34,6 @@ const Metrics = require('@mojaloop/central-services-metrics') const { Producer } = require('@mojaloop/central-services-stream').Util const { Http, Events } = require('@mojaloop/central-services-shared').Enum -const { reformatFSPIOPError } = require('@mojaloop/central-services-error-handling').Factory const util = require('../lib/util') const dto = require('../lib/dto') @@ -62,7 +61,6 @@ module.exports = { isFX ? 'Publish HTTP POST fxQuotes request' : 'Publish HTTP POST quotes request', ['success'] ).startTimer() - const errorCounter = Metrics.getCounter('errorCount') let step try { @@ -88,14 +86,7 @@ module.exports = { return h.response().code(Http.ReturnCodes.ACCEPTED.CODE) } catch (err) { histTimerEnd({ success: false }) - const fspiopError = reformatFSPIOPError(err) - errorCounter.inc({ - code: fspiopError?.apiErrorCode.code, - system: undefined, - operation: 'postQuotes', - step - }) - util.rethrowFspiopError(err) + util.rethrowAndCountFspiopError(err, { operation: 'postQuotes', step }) } } } diff --git a/src/api/quotes/{id}.js b/src/api/quotes/{id}.js index b0b67d34..69972c75 100644 --- a/src/api/quotes/{id}.js +++ b/src/api/quotes/{id}.js @@ -34,7 +34,6 @@ const Metrics = require('@mojaloop/central-services-metrics') const { Producer } = require('@mojaloop/central-services-stream').Util const { Http, Events } = require('@mojaloop/central-services-shared').Enum -const { reformatFSPIOPError } = require('@mojaloop/central-services-error-handling').Factory const util = require('../../lib/util') const dto = require('../../lib/dto') @@ -62,7 +61,6 @@ module.exports = { isFX ? 'Publish HTTP GET /fxQuotes/{ID} request' : 'Publish HTTP GET /quotes/{id} request', ['success'] ).startTimer() - const errorCounter = Metrics.getCounter('errorCount') let step try { @@ -88,14 +86,7 @@ module.exports = { return h.response().code(Http.ReturnCodes.ACCEPTED.CODE) } catch (err) { histTimerEnd({ success: false }) - const fspiopError = reformatFSPIOPError(err) - errorCounter.inc({ - code: fspiopError?.apiErrorCode.code, - system: undefined, - operation: 'getQuotesById', - step - }) - util.rethrowFspiopError(err) + util.rethrowAndCountFspiopError(err, { operation: 'getQuotesById', step }) } }, @@ -127,7 +118,6 @@ module.exports = { isFX ? `Publish HTTP PUT /fxQuotes/{id}${pathSuffix} request` : `Publish HTTP PUT /quotes/{id}${pathSuffix} request`, ['success'] ).startTimer() - const errorCounter = Metrics.getCounter('errorCount') let step try { @@ -151,14 +141,7 @@ module.exports = { return h.response().code(Http.ReturnCodes.OK.CODE) } catch (err) { histTimerEnd({ success: false }) - const fspiopError = reformatFSPIOPError(err) - errorCounter.inc({ - code: fspiopError?.apiErrorCode.code, - system: undefined, - operation: 'putQuotesById', - step - }) - util.rethrowFspiopError(err) + util.rethrowAndCountFspiopError(err, { operation: 'putQuotesById', step }) } } } diff --git a/src/data/cachedDatabase.js b/src/data/cachedDatabase.js index adc7fc0e..cec1aa49 100644 --- a/src/data/cachedDatabase.js +++ b/src/data/cachedDatabase.js @@ -32,9 +32,9 @@ const Database = require('./database.js') const Cache = require('memory-cache').Cache -const ErrorHandler = require('@mojaloop/central-services-error-handling') const Metrics = require('@mojaloop/central-services-metrics') +const util = require('../lib/util') const { logger } = require('../lib/') /** @@ -135,16 +135,7 @@ class CachedDatabase extends Database { } catch (err) { this.log.error('Error in getCacheValue: ', err) histTimer({ success: false, queryName: type, hit: false }) - const extensions = [{ - key: 'system', - value: '["cachedDb"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + util.rethrowCachedDatabaseError(err) } } diff --git a/src/data/database.js b/src/data/database.js index 5b37f9ed..dfad14eb 100644 --- a/src/data/database.js +++ b/src/data/database.js @@ -40,7 +40,7 @@ const ErrorHandler = require('@mojaloop/central-services-error-handling') const MLNumber = require('@mojaloop/ml-number') const Enum = require('@mojaloop/central-services-shared').Enum const { logger } = require('../lib/') - +const libUtil = require('../lib/util') const LOCAL_ENUM = require('../lib/enum') /** @@ -121,16 +121,7 @@ class Database { return rows[0].transactionInitiatorTypeId } catch (err) { this.log.error('Error in getInitiatorType:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -152,16 +143,7 @@ class Database { return rows[0].transactionInitiatorId } catch (err) { this.log.error('Error in getInitiator:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -183,16 +165,7 @@ class Database { return rows[0].transactionScenarioId } catch (err) { this.log.error('Error in getScenario:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -214,16 +187,7 @@ class Database { return rows[0].transactionSubScenarioId } catch (err) { this.log.error('Error in getSubScenario:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -245,16 +209,7 @@ class Database { return rows[0].amountTypeId } catch (err) { this.log.error('Error in getAmountType:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -276,16 +231,7 @@ class Database { return transactionReferenceId } catch (err) { this.log.error('Error in createTransactionReference:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -307,16 +253,7 @@ class Database { return quoteId } catch (err) { this.log.error('Error in createQuoteDuplicateCheck:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -339,16 +276,7 @@ class Database { return quoteId } catch (err) { this.log.error('Error in createQuoteUpdateDuplicateCheck:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -371,16 +299,7 @@ class Database { return rows[0].partyTypeId } catch (err) { this.log.error('Error in getPartyType:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -403,16 +322,7 @@ class Database { return rows[0].partyIdentifierTypeId } catch (err) { this.log.error('Error in getPartyIdentifierType:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -449,16 +359,7 @@ class Database { return rows[0].participantId } catch (err) { this.log.error('Error in getParticipant:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -490,16 +391,7 @@ class Database { return rows[0].participantId } catch (err) { this.log.error('Error in getParticipantByName:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -525,16 +417,7 @@ class Database { return rows[0].transferParticipantRoleTypeId } catch (err) { this.log.error('Error in getTransferParticipantRoleType:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -560,16 +443,7 @@ class Database { return rows[0].ledgerEntryTypeId } catch (err) { this.log.error('Error in getLedgerEntryType:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -661,16 +535,7 @@ class Database { return quotePartyId } catch (err) { this.log.error('Error in createQuoteParty:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -694,16 +559,7 @@ class Database { return newParty } catch (err) { this.log.error('Error in createParty:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -736,16 +592,7 @@ class Database { return quote.quoteId } catch (err) { this.log.error('Error in createQuote:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -763,16 +610,7 @@ class Database { return true } catch (err) { this.log.error('Error in createQuotePartyIdInfoExtensions:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -800,16 +638,7 @@ class Database { return rows[0] } catch (err) { this.log.error('Error in getQuoteParty:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -833,16 +662,7 @@ class Database { return rows[0] } catch (err) { this.log.error('Error in getQuoteParty:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -868,16 +688,7 @@ class Database { return rows[0].value } catch (err) { this.log.error('Error in getParticipantEndpoint:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -901,16 +712,7 @@ class Database { return rows[0] } catch (err) { this.log.error('Error in getQuoteDuplicateCheck:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -934,16 +736,7 @@ class Database { return rows[0] } catch (err) { this.log.error('Error in getQuoteResponseDuplicateCheck:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -979,16 +772,7 @@ class Database { return newQuoteResponse } catch (err) { this.log.error('Error in createQuoteResponse:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -1012,16 +796,7 @@ class Database { return res } catch (err) { this.log.error('Error in createIlpPacket:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -1048,16 +823,7 @@ class Database { return res } catch (err) { this.log.error('Error in createGeoCode:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -1084,16 +850,7 @@ class Database { return res } catch (err) { this.log.error('Error in createQuoteError:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -1121,16 +878,7 @@ class Database { return res } catch (err) { this.log.error('Error in createQuoteExtensions:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -1150,16 +898,7 @@ class Database { return newFxQuote } catch (err) { this.log.error('Error in createFxQuote:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -1180,16 +919,7 @@ class Database { return newFxQuoteResponse } catch (err) { this.log.error('Error in createFxQuoteResponse:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -1211,16 +941,7 @@ class Database { return newFxQuoteError } catch (err) { this.log.error('Error in createFxQuoteError:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -1241,16 +962,7 @@ class Database { return newFxQuoteDuplicateCheck } catch (err) { this.log.error('Error in createFxQuoteDuplicateCheck:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -1272,16 +984,7 @@ class Database { return newFxQuoteResponseDuplicateCheck } catch (err) { this.log.error('Error in createFxQuoteResponseDuplicateCheck:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -1311,16 +1014,7 @@ class Database { return newFxQuoteConversionTerms } catch (err) { this.log.error('Error in createFxQuoteConversionTerms:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -1343,16 +1037,7 @@ class Database { return res } catch (err) { this.log.error('Error in fxCharge:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -1372,16 +1057,7 @@ class Database { return res } catch (err) { this.log.error('Error in createFxQuoteConversionTermsExtension:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -1414,16 +1090,7 @@ class Database { return newFxQuoteResponseConversionTerms } catch (err) { this.log.error('Error in createFxQuoteResponseConversionTerms:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -1443,16 +1110,7 @@ class Database { return res } catch (err) { this.log.error('Error in createFxQuoteResponseConversionTermsExtension:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -1464,16 +1122,7 @@ class Database { return result } catch (err) { this.log.error('Error in getFxQuoteDuplicateCheck:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -1485,16 +1134,7 @@ class Database { return result } catch (err) { this.log.error('Error in getFxQuoteResponseDuplicateCheck:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -1519,16 +1159,7 @@ class Database { return result } catch (err) { this.log.error('Error in _getFxQuoteDetails:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -1557,16 +1188,7 @@ class Database { return result } catch (err) { this.log.error('Error in _getFxQuoteDetails:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } @@ -1578,16 +1200,7 @@ class Database { return result } catch (err) { this.log.error('Error in _getFxQuoteErrorDetails:', err) - const extensions = [{ - key: 'system', - value: '["db"]' - }] - throw ErrorHandler.Factory.reformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) + libUtil.rethrowDatabaseError(err) } } diff --git a/src/handlers/init.js b/src/handlers/init.js index 3e5077b1..0f7fb46d 100644 --- a/src/handlers/init.js +++ b/src/handlers/init.js @@ -17,7 +17,6 @@ let monitoringServer const startFn = async (handlerList, appConfig = undefined) => { const config = appConfig || new Config() - monitoringServer = await createMonitoringServer(config.monitoringPort, consumersMap, db) db = new Database(config) await db.connect() @@ -45,6 +44,7 @@ const startFn = async (handlerList, appConfig = undefined) => { }) consumersMap = await createConsumers(handler.handleMessages, handlerList) + monitoringServer = await createMonitoringServer(config.monitoringPort, consumersMap, db) return handler } diff --git a/src/lib/util.js b/src/lib/util.js index cbd988e1..b906c2c8 100644 --- a/src/lib/util.js +++ b/src/lib/util.js @@ -44,6 +44,7 @@ const { RESOURCES, HEADERS, ISO_HEADER_PART } = require('../constants') const { logger } = require('../lib') const Config = require('./config') +const { rethrow } = require('@mojaloop/central-services-shared').Util const config = new Config() const failActionHandler = async (request, h, err) => { @@ -311,10 +312,17 @@ const auditSpan = async (request) => { }, AuditEventAction.start) } -const rethrowFspiopError = (error) => { - const fspiopError = ErrorHandler.Factory.reformatFSPIOPError(error) - logger.error(`rethrowFspiopError: ${error?.message}`, { fspiopError }) - throw fspiopError +const rethrowAndCountFspiopError = (error, options) => { + options.loggerOverride = logger + rethrow.rethrowAndCountFspiopError(error, options) +} + +const rethrowDatabaseError = (error) => { + rethrow.rethrowDatabaseError(error, { loggerOverride: logger }) +} + +const rethrowCachedDatabaseError = (error) => { + rethrow.rethrowCachedDatabaseError(error, { loggerOverride: logger }) } const resolveOpenApiSpecPath = (isIsoApi) => { @@ -336,7 +344,9 @@ module.exports = { generateRequestHeadersForJWS, calculateRequestHash, removeEmptyKeys, - rethrowFspiopError, + rethrowAndCountFspiopError, + rethrowDatabaseError, + rethrowCachedDatabaseError, fetchParticipantInfo, getParticipantEndpoint, makeAppInteroperabilityHeader, diff --git a/src/model/bulkQuotes.js b/src/model/bulkQuotes.js index 6a18b52c..c62b58b7 100644 --- a/src/model/bulkQuotes.js +++ b/src/model/bulkQuotes.js @@ -45,6 +45,7 @@ const Config = require('../lib/config') const { httpRequest } = require('../lib/http') const { getStackOrInspect, generateRequestHeadersForJWS, generateRequestHeaders, getParticipantEndpoint } = require('../lib/util') const LOCAL_ENUM = require('../lib/enum') +const libUtil = require('../lib/util') delete axios.defaults.headers.common.Accept delete axios.defaults.headers.common['Content-Type'] @@ -146,13 +147,7 @@ class BulkQuotesModel { null, fspiopSource ) - this.errorCounter.inc({ - code: fspiopError?.apiErrorCode.code, - system: undefined, - operation: 'forwardBulkQuoteRequest', - step - }) - throw fspiopError + libUtil.rethrowAndCountFspiopError(fspiopError, { operation: 'forwardBulkQuoteRequest', step }) } const fullCallbackUrl = `${endpoint}${ENUM.EndPoints.FspEndpointTemplates.BULK_QUOTES_POST}` @@ -181,21 +176,7 @@ class BulkQuotesModel { } catch (err) { // any-error this.writeLog(`Error forwarding bulkQuote request to endpoint ${endpoint}: ${getStackOrInspect(err)}`) - const extensions = err.extensions || [] - const system = extensions.find((element) => element.key === 'system')?.value || '' - const fspiopError = ErrorHandler.ReformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) - this.errorCounter.inc({ - code: fspiopError?.apiErrorCode.code, - system, - operation: 'forwardBulkQuoteRequest', - step - }) - throw fspiopError + libUtil.rethrowAndCountFspiopError(err, { operation: 'forwardBulkQuoteRequest', step }) } } @@ -282,21 +263,7 @@ class BulkQuotesModel { } catch (err) { // any-error this.writeLog(`Error forwarding bulk quote response to endpoint ${endpoint}: ${getStackOrInspect(err)}`) - const extensions = err.extensions || [] - const system = extensions.find((element) => element.key === 'system')?.value || '' - const fspiopError = ErrorHandler.ReformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) - this.errorCounter.inc({ - code: fspiopError?.apiErrorCode.code, - system, - operation: 'forwardBulkQuoteUpdate', - step - }) - throw fspiopError + libUtil.rethrowAndCountFspiopError(err, { operation: 'forwardBulkQuoteUpdate', step }) } } @@ -352,13 +319,7 @@ class BulkQuotesModel { null, fspiopSource ) - this.errorCounter.inc({ - code: fspiopError?.apiErrorCode.code, - system: undefined, - operation: 'forwardBulkQuoteGet', - step - }) - throw fspiopError + libUtil.rethrowAndCountFspiopError(fspiopError, { operation: 'forwardBulkQuoteGet', step }) } const fullCallbackUrl = `${endpoint}/bulkQuotes/${bulkQuoteId}` @@ -381,21 +342,7 @@ class BulkQuotesModel { } catch (err) { // any-error this.writeLog(`Error forwarding quote get request: ${getStackOrInspect(err)}`) - const extensions = err.extensions || [] - const system = extensions.find((element) => element.key === 'system')?.value || '' - const fspiopError = ErrorHandler.ReformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) - this.errorCounter.inc({ - code: fspiopError?.apiErrorCode.code, - system, - operation: 'forwardBulkQuoteGet', - step - }) - throw fspiopError + libUtil.rethrowAndCountFspiopError(err, { operation: 'forwardBulkQuoteGet', step }) } } @@ -477,13 +424,7 @@ class BulkQuotesModel { null, fspiopSource ) - this.errorCounter.inc({ - code: fspiopError?.apiErrorCode.code, - system: undefined, - operation: 'sendErrorCallback', - step - }) - throw fspiopError + libUtil.rethrowAndCountFspiopError(fspiopError, { operation: 'sendErrorCallback', step }) } const fspiopUri = `/bulkQuotes/${bulkQuoteId}/error` @@ -552,7 +493,6 @@ class BulkQuotesModel { } catch (err) { // external-error const extensions = err.extensions || [] - const system = extensions.find((element) => element.key === 'system')?.value || '' const fspiopError = ErrorHandler.CreateFSPIOPError( ErrorHandler.Enums.FSPIOPErrorCodes.DESTINATION_COMMUNICATION_ERROR, `network error in sendErrorCallback: ${err.message}`, @@ -567,13 +507,7 @@ class BulkQuotesModel { fspiopSource, extensions ) - this.errorCounter.inc({ - code: fspiopError?.apiErrorCode.code, - system, - operation: 'sendErrorCallback', - step - }) - throw fspiopError + libUtil.rethrowAndCountFspiopError(fspiopError, { operation: 'sendErrorCallback', step }) } this.writeLog(`Error callback got response ${res.status} ${res.statusText}`) @@ -591,37 +525,18 @@ class BulkQuotesModel { }, fspiopSource ) - this.errorCounter.inc({ - code: fspiopError?.apiErrorCode.code, - system: undefined, - operation: 'sendErrorCallback', - step - }) - throw fspiopError + libUtil.rethrowAndCountFspiopError(fspiopError, { operation: 'sendErrorCallback', step }) } } catch (err) { // any-error this.writeLog(`Error in sendErrorCallback: ${getStackOrInspect(err)}`) - const extensions = err.extensions || [] - const system = extensions.find((element) => element.key === 'system')?.value || '' - const fspiopError = ErrorHandler.ReformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) - this.errorCounter.inc({ - code: fspiopError?.apiErrorCode.code, - system, - operation: 'sendErrorCallback', - step - }) + const fspiopError = ErrorHandler.ReformatFSPIOPError(err) const state = new EventSdk.EventStateMetadata(EventSdk.EventStatusType.failed, fspiopError.apiErrorCode.code, fspiopError.apiErrorCode.message) if (span) { await span.error(fspiopError, state) await span.finish(fspiopError.message, state) } - throw fspiopError + libUtil.rethrowAndCountFspiopError(fspiopError, { operation: 'sendErrorCallback', step }) } } diff --git a/src/model/fxQuotes.js b/src/model/fxQuotes.js index a4865ac0..bc4bd43c 100644 --- a/src/model/fxQuotes.js +++ b/src/model/fxQuotes.js @@ -29,6 +29,8 @@ const Metrics = require('@mojaloop/central-services-metrics') const Config = require('../lib/config') const LOCAL_ENUM = require('../lib/enum') const dto = require('../lib/dto') +const util = require('../lib/util') + const { logger } = require('../lib') const { httpRequest } = require('../lib/http') const { getStackOrInspect, generateRequestHeadersForJWS, generateRequestHeaders, getParticipantEndpoint, calculateRequestHash, fetchParticipantInfo } = require('../lib/util') @@ -120,21 +122,7 @@ class FxQuotesModel { } catch (err) { // internal-error this.log.error('Error in checkDuplicateFxQuoteRequest: ', err) - const extensions = err.extensions || [] - const system = extensions.find((element) => element.key === 'system')?.value || '' - const fspiopError = ErrorHandler.ReformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) - this.errorCounter.inc({ - code: fspiopError?.apiErrorCode.code, - system, - operation: 'checkDuplicateFxQuoteRequest', - step - }) - throw fspiopError + util.rethrowAndCountFspiopError(err, { operation: 'checkDuplicateFxQuoteRequest', step }) } } @@ -173,21 +161,7 @@ class FxQuotesModel { } catch (err) { // internal-error log.error('Error in checkDuplicateFxQuoteResponse: ', err) - const extensions = err.extensions || [] - const system = extensions.find((element) => element.key === 'system')?.value || '' - const fspiopError = ErrorHandler.ReformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) - this.errorCounter.inc({ - code: fspiopError?.apiErrorCode.code, - system, - operation: '', - step - }) - throw fspiopError + util.rethrowAndCountFspiopError(err, { operation: 'checkDuplicateFxQuoteResponse', step }) } } @@ -492,21 +466,7 @@ class FxQuotesModel { } catch (err) { histTimer({ success: false, queryName: 'forwardFxQuoteUpdate' }) log.error('error in forwardFxQuoteUpdate', err) - const extensions = err.extensions || [] - const system = extensions.find((element) => element.key === 'system')?.value || '' - const fspiopError = ErrorHandler.ReformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) - this.errorCounter.inc({ - code: fspiopError?.apiErrorCode.code, - system, - operation: '', - step - }) - throw fspiopError + util.rethrowAndCountFspiopError(err, { operation: 'forwardFxQuoteUpdate', step }) } } @@ -578,21 +538,7 @@ class FxQuotesModel { } catch (err) { histTimer({ success: false, queryName: 'forwardFxQuoteGet' }) this.log.error('error in forwardFxQuoteGet', err) - const extensions = err.extensions || [] - const system = extensions.find((element) => element.key === 'system')?.value || '' - const fspiopError = ErrorHandler.ReformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) - this.errorCounter.inc({ - code: fspiopError?.apiErrorCode.code, - system, - operation: '', - step - }) - throw fspiopError + util.rethrowAndCountFspiopError(err, { operation: 'forwardFxQuoteGet', step }) } } @@ -837,26 +783,13 @@ class FxQuotesModel { } catch (err) { histTimer({ success: false, queryName: 'sendErrorCallback' }) log.error('Error in sendErrorCallback', err) - const extensions = err.extensions || [] - const system = extensions.find((element) => element.key === 'system')?.value || '' - const fspiopError = ErrorHandler.ReformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) - this.errorCounter.inc({ - code: fspiopError?.apiErrorCode.code, - system, - operation: '', - step - }) + const fspiopError = ErrorHandler.ReformatFSPIOPError(err) const state = new EventSdk.EventStateMetadata(EventSdk.EventStatusType.failed, fspiopError.apiErrorCode.code, fspiopError.apiErrorCode.message) if (span) { await span.error(fspiopError, state) await span.finish(fspiopError.message, state) } - throw fspiopError + util.rethrowAndCountFspiopError(fspiopError, { operation: 'sendErrorCallback', step }) } } @@ -888,7 +821,6 @@ class FxQuotesModel { } catch (err) { this.log.warn('error in sendHttpRequest', err) const extensions = err.extensions || [] - const system = extensions.find((element) => element.key === 'system')?.value || '' const fspiopError = ErrorHandler.CreateFSPIOPError( ErrorHandler.Enums.FSPIOPErrorCodes.DESTINATION_COMMUNICATION_ERROR, `network error in sendErrorCallback: ${err.message}`, @@ -903,13 +835,7 @@ class FxQuotesModel { fspiopSource, extensions ) - this.errorCounter.inc({ - code: fspiopError?.apiErrorCode.code, - system, - operation: '', - step - }) - throw fspiopError + util.rethrowAndCountFspiopError(fspiopError, { operation: 'sendHttpRequest', step }) } } diff --git a/src/model/quotes.js b/src/model/quotes.js index f91a03fc..b3ef6484 100644 --- a/src/model/quotes.js +++ b/src/model/quotes.js @@ -48,6 +48,7 @@ const Config = require('../lib/config') const LOCAL_ENUM = require('../lib/enum') const dto = require('../lib/dto') const util = require('../lib/util') + const { logger } = require('../lib') const { httpRequest } = require('../lib/http') const { RESOURCES } = require('../constants') @@ -165,21 +166,7 @@ class QuotesModel { } catch (err) { log.warn('validateQuoteRequest is failed with error', err) histTimer({ success: false, queryName: 'quote_validateQuoteRequest' }) - const extensions = err.extensions || [] - const system = extensions.find((element) => element.key === 'system')?.value || '' - const fspiopError = ErrorHandler.ReformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) - this.errorCounter.inc({ - code: fspiopError?.apiErrorCode.code, - system, - operation: 'validateQuoteRequest', - step - }) - throw fspiopError + util.rethrowAndCountFspiopError(err, { operation: 'validateQuoteRequest', step }) } } @@ -393,27 +380,14 @@ class QuotesModel { if (txn) { await txn.rollback().catch(() => {}) } - const extensions = err.extensions || [] - const system = extensions.find((element) => element.key === 'system')?.value || '' - const fspiopError = ErrorHandler.ReformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) - this.errorCounter.inc({ - code: fspiopError?.apiErrorCode.code, - system, - operation: 'handleQuoteRequest', - step - }) + const fspiopError = ErrorHandler.ReformatFSPIOPError(err) const state = new EventSdk.EventStateMetadata(EventSdk.EventStatusType.failed, fspiopError.apiErrorCode.code, fspiopError.apiErrorCode.message) if (handleQuoteRequestSpan) { await handleQuoteRequestSpan.error(fspiopError, state) await handleQuoteRequestSpan.finish(fspiopError.message, state) } histTimer({ success: false, queryName: 'quote_handleQuoteRequest' }) - throw fspiopError + util.rethrowAndCountFspiopError(fspiopError, { operation: 'handleQuoteRequest', step }) } let forwardQuoteRequestSpan @@ -508,21 +482,7 @@ class QuotesModel { } catch (err) { log.error('forwardQuoteRequest is failed with error:', err) histTimer({ success: false, queryName: 'quote_forwardQuoteRequest' }) - const extensions = err.extensions || [] - const system = extensions.find((element) => element.key === 'system')?.value || '' - const fspiopError = ErrorHandler.ReformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) - this.errorCounter.inc({ - code: fspiopError?.apiErrorCode.code, - system, - operation: 'forwardQuoteRequest', - step - }) - throw fspiopError + util.rethrowAndCountFspiopError(err, { operation: 'forwardQuoteRequest', step }) } } @@ -729,27 +689,14 @@ class QuotesModel { if (txn) { await txn.rollback().catch(() => {}) } - const extensions = err.extensions || [] - const system = extensions.find((element) => element.key === 'system')?.value || '' - const fspiopError = ErrorHandler.ReformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) - this.errorCounter.inc({ - code: fspiopError?.apiErrorCode.code, - system, - operation: 'handleQuoteUpdate', - step - }) + const fspiopError = ErrorHandler.ReformatFSPIOPError(err) const state = new EventSdk.EventStateMetadata(EventSdk.EventStatusType.failed, fspiopError.apiErrorCode.code, fspiopError.apiErrorCode.message) if (handleQuoteUpdateSpan) { await handleQuoteUpdateSpan.error(fspiopError, state) await handleQuoteUpdateSpan.finish(fspiopError.message, state) } histTimer({ success: false, queryName: 'quote_handleQuoteUpdate' }) - throw fspiopError + util.rethrowAndCountFspiopError(fspiopError, { operation: 'handleQuoteUpdate', step }) } } @@ -912,27 +859,14 @@ class QuotesModel { if (txn) { await txn.rollback().catch(() => {}) } - const extensions = err.extensions || [] - const system = extensions.find((element) => element.key === 'system')?.value || '' - const fspiopError = ErrorHandler.ReformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) - this.errorCounter.inc({ - code: fspiopError?.apiErrorCode.code, - system, - operation: 'handleQuoteError', - step - }) + const fspiopError = ErrorHandler.ReformatFSPIOPError(err) const state = new EventSdk.EventStateMetadata(EventSdk.EventStatusType.failed, fspiopError.apiErrorCode.code, fspiopError.apiErrorCode.message) if (childSpan) { await childSpan.error(fspiopError, state) await childSpan.finish(fspiopError.message, state) } histTimer({ success: false, queryName: 'quote_handleQuoteError' }) - throw fspiopError + util.rethrowAndCountFspiopError(fspiopError, { operation: 'handleQuoteError', step }) } } @@ -973,21 +907,7 @@ class QuotesModel { } catch (err) { log.error('error in handleQuoteGet:', err) histTimer({ success: false, queryName: 'quote_handleQuoteGet' }) - const extensions = err.extensions || [] - const system = extensions.find((element) => element.key === 'system')?.value || '' - const fspiopError = ErrorHandler.ReformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) - this.errorCounter.inc({ - code: fspiopError?.apiErrorCode.code, - system, - operation: 'handleQuoteGet', - step - }) - throw fspiopError + util.rethrowAndCountFspiopError(err, { operation: 'handleQuoteGet', step }) } } @@ -1045,21 +965,7 @@ class QuotesModel { } catch (err) { log.error('error in forwardQuoteGet:', err) histTimer({ success: false, queryName: 'quote_forwardQuoteGet' }) - const extensions = err.extensions || [] - const system = extensions.find((element) => element.key === 'system')?.value || '' - const fspiopError = ErrorHandler.ReformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) - this.errorCounter.inc({ - code: fspiopError?.apiErrorCode.code, - system, - operation: 'validateQuoteRequest', - step - }) - throw fspiopError + util.rethrowAndCountFspiopError(err, { operation: 'forwardQuoteGet', step }) } } @@ -1217,27 +1123,14 @@ class QuotesModel { } } catch (err) { log.error('error in sendErrorCallback:', err) - const extensions = err.extensions || [] - const system = extensions.find((element) => element.key === 'system')?.value || '' - const fspiopError = ErrorHandler.ReformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) - this.errorCounter.inc({ - code: fspiopError?.apiErrorCode.code, - system, - operation: 'validateQuoteRequest', - step - }) + const fspiopError = ErrorHandler.ReformatFSPIOPError(err) const state = new EventSdk.EventStateMetadata(EventSdk.EventStatusType.failed, fspiopError.apiErrorCode.code, fspiopError.apiErrorCode.message) if (span) { await span.error(fspiopError, state) await span.finish(fspiopError.message, state) } histTimer({ success: false, queryName: 'quote_sendErrorCallback' }) - throw fspiopError + util.rethrowAndCountFspiopError(fspiopError, { operation: 'sendErrorCallback', step }) } } @@ -1290,21 +1183,7 @@ class QuotesModel { } catch (err) { log.error('error in checkDuplicateQuoteRequest: ', err) histTimer({ success: false, queryName: 'quote_checkDuplicateQuoteRequest', duplicateResult: 'error' }) - const extensions = err.extensions || [] - const system = extensions.find((element) => element.key === 'system')?.value || '' - const fspiopError = ErrorHandler.ReformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) - this.errorCounter.inc({ - code: fspiopError?.apiErrorCode.code, - system, - operation: 'validateQuoteRequest', - step - }) - throw fspiopError + util.rethrowAndCountFspiopError(err, { operation: 'validateQuoteRequest', step }) } } @@ -1357,21 +1236,7 @@ class QuotesModel { } catch (err) { log.error('error in checkDuplicateQuoteResponse: ', err) histTimer({ success: false, queryName: 'quote_checkDuplicateQuoteResponse', duplicateResult: 'error' }) - const extensions = err.extensions || [] - const system = extensions.find((element) => element.key === 'system')?.value || '' - const fspiopError = ErrorHandler.ReformatFSPIOPError( - err, - undefined, - undefined, - extensions - ) - this.errorCounter.inc({ - code: fspiopError?.apiErrorCode.code, - system, - operation: 'validateQuoteRequest', - step - }) - throw fspiopError + util.rethrowAndCountFspiopError(err, { operation: 'validateQuoteRequest', step }) } } diff --git a/test/unit/model/bulkQuotes.test.js b/test/unit/model/bulkQuotes.test.js index 5a2f78b8..2c1774b1 100644 --- a/test/unit/model/bulkQuotes.test.js +++ b/test/unit/model/bulkQuotes.test.js @@ -41,7 +41,17 @@ jest.mock('../../../src/data/database') jest.mock('../../../src/lib/config', () => { return jest.fn().mockImplementation(() => mockConfig) }) -jest.mock('../../../src/lib/util') +jest.mock('../../../src/lib/util', () => { + const originalUtil = jest.requireActual('../../../src/lib/util') + const partialMock = Object.keys(originalUtil).reduce((pre, methodName) => { + pre[methodName] = jest.fn() + return pre + }, {}) + return { + ...partialMock, + rethrowAndCountFspiopError: originalUtil.rethrowAndCountFspiopError + } +}) jest.mock('../../../src/lib/http') const axios = require('axios') diff --git a/test/unit/model/quotes.test.js b/test/unit/model/quotes.test.js index 04a7349e..5de6de4a 100644 --- a/test/unit/model/quotes.test.js +++ b/test/unit/model/quotes.test.js @@ -47,7 +47,17 @@ jest.mock('../../../src/model/rules') jest.mock('../../../src/lib/config', () => { return jest.fn().mockImplementation(() => mockConfig) }) -jest.mock('../../../src/lib/util') +jest.mock('../../../src/lib/util', () => { + const originalUtil = jest.requireActual('../../../src/lib/util') + const partialMock = Object.keys(originalUtil).reduce((pre, methodName) => { + pre[methodName] = jest.fn() + return pre + }, {}) + return { + ...partialMock, + rethrowAndCountFspiopError: originalUtil.rethrowAndCountFspiopError + } +}) jest.mock('../../../src/lib/http') const axios = require('axios')