From c811b0fdccbe9738aca5f01ff9118a9b296ce9e0 Mon Sep 17 00:00:00 2001 From: Aalaa Hesham Date: Wed, 4 May 2022 22:30:35 +0200 Subject: [PATCH 01/12] MOD: sumsub hook --- package.json | 1 + runners/kycHook.js | 5 ++ src/services/api/middlewares/kycHook.js | 10 ++++ src/services/kycHook/Procfile | 1 + src/services/kycHook/app.js | 75 +++++++++++++++++++++++++ src/services/kycHook/index.js | 14 +++++ 6 files changed, 106 insertions(+) create mode 100644 runners/kycHook.js create mode 100644 src/services/api/middlewares/kycHook.js create mode 100644 src/services/kycHook/Procfile create mode 100644 src/services/kycHook/app.js create mode 100644 src/services/kycHook/index.js diff --git a/package.json b/package.json index fdb8321c4..ad7f74309 100755 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "service:exchange": "node runners/exchange", "service:investment": "node runners/investment", "service:kyc": "node runners/kyc", + "service:kyc-hook": "node runners/kycHook", "service:fixer": "node runners/fixer", "db:create": "node src/models/pg/utils/create", "db:migrate": "node src/models/pg/utils/migrate", diff --git a/runners/kycHook.js b/runners/kycHook.js new file mode 100644 index 000000000..4fb699a7b --- /dev/null +++ b/runners/kycHook.js @@ -0,0 +1,5 @@ +const Runner = require('../src/modules/runner'); + +const API = require('../src/services/kycHook'); + +Runner(API); diff --git a/src/services/api/middlewares/kycHook.js b/src/services/api/middlewares/kycHook.js new file mode 100644 index 000000000..779adea34 --- /dev/null +++ b/src/services/api/middlewares/kycHook.js @@ -0,0 +1,10 @@ +module.exports = () => (ctx, next) => { + + if (ctx.path === '/kyc/hook') { + ctx.headers['content-type'] = 'text/plain'; // TODO: check dis + } + + return next(); + +}; + \ No newline at end of file diff --git a/src/services/kycHook/Procfile b/src/services/kycHook/Procfile new file mode 100644 index 000000000..0125144de --- /dev/null +++ b/src/services/kycHook/Procfile @@ -0,0 +1 @@ +web: npm run service:kyc-hook diff --git a/src/services/kycHook/app.js b/src/services/kycHook/app.js new file mode 100644 index 000000000..396638a5e --- /dev/null +++ b/src/services/kycHook/app.js @@ -0,0 +1,75 @@ +const Koa = require('koa'); +const Router = require('@koa/router'); +const compose = require('koa-compose'); +const bodyParser = require('koa-bodyparser'); + +const utilsMiddleware = require('../api/middlewares/util'); +const securityMiddleware = require('../api/middlewares/security'); +const loggerMiddleware = require('../api/middlewares/logger'); +const errorMiddleware = require('../api/middlewares/error'); +const kycHookMiddleware = require('../api/middlewares/kycHook'); +const KycRouter = require('../api/routers/kyc'); + +const logger = require('../../modules/logger'); +const CONFIG = require('../../../config'); +const llo = logger.logMeta.bind(null, { service: 'kyc-hook-api' }); + +const mainRouter = new Router(); + +mainRouter.post( + '/kyc/hook', + KycRouter.hookReview, +); + +const MainMiddleware = compose([ + loggerMiddleware(), + errorMiddleware(), + + kycHookMiddleware(), + + bodyParser({ + enableTypes: ['json', 'form', 'text'], + jsonLimit: '4mb', + textLimit: '4mb', + formLimit: '4mb', + onerror: utilsMiddleware.onBodyParserError, + }), + + securityMiddleware(), + + mainRouter.routes(), + mainRouter.allowedMethods(), +]); + +const API = () => + new Promise((resolve, reject) => { + const app = new Koa(); + + app.proxy = CONFIG.REMOTE_EXECUTION; + + app.on('error', (error) => { + logger.error('Unexpected API error', { error }); + }); + + require('koa-ctx-cache-control')(app); + + app.use((ctx, next) => { + ctx.cacheControl(false); + return next(); + }); + + app.use(MainMiddleware); + + const server = app.listen(CONFIG.SERVICES.API.PORT, (err) => { + if (err) { + return reject(err); + } + + logger.info('Listening', llo({ port: CONFIG.SERVICES.API.PORT })); + resolve(app); + }); + + server.setTimeout(CONFIG.SERVICES.API.TIMEOUT * 1000); + }); + +module.exports = API; \ No newline at end of file diff --git a/src/services/kycHook/index.js b/src/services/kycHook/index.js new file mode 100644 index 000000000..ba9961ae7 --- /dev/null +++ b/src/services/kycHook/index.js @@ -0,0 +1,14 @@ +const app = require('./app'); +const Utils = require('../../helpers/utils'); + +const KycHookService = { + NEED_CONNECTIONS: ['postgre', 'redis'], + + start() { + return app(); + }, + + stop: Utils.noop, +}; + +module.exports = KycHookService; From aed8d664710c1a5a2c71c5d4b69cbac09329db34 Mon Sep 17 00:00:00 2001 From: Aalaa Hesham Date: Wed, 4 May 2022 22:52:38 +0200 Subject: [PATCH 02/12] FIX: format --- src/services/api/middlewares/kycHook.js | 17 ++- src/services/kycHook/app.js | 147 ++++++++++++------------ 2 files changed, 79 insertions(+), 85 deletions(-) diff --git a/src/services/api/middlewares/kycHook.js b/src/services/api/middlewares/kycHook.js index 779adea34..9059781b2 100644 --- a/src/services/api/middlewares/kycHook.js +++ b/src/services/api/middlewares/kycHook.js @@ -1,10 +1,7 @@ -module.exports = () => (ctx, next) => { - - if (ctx.path === '/kyc/hook') { - ctx.headers['content-type'] = 'text/plain'; // TODO: check dis - } - - return next(); - -}; - \ No newline at end of file +module.exports = () => (ctx, next) => { + if (ctx.path === '/kyc/hook') { + ctx.headers['content-type'] = 'text/plain'; // TODO: check dis + } + + return next(); +}; diff --git a/src/services/kycHook/app.js b/src/services/kycHook/app.js index 396638a5e..81a75c220 100644 --- a/src/services/kycHook/app.js +++ b/src/services/kycHook/app.js @@ -1,75 +1,72 @@ -const Koa = require('koa'); -const Router = require('@koa/router'); -const compose = require('koa-compose'); -const bodyParser = require('koa-bodyparser'); - -const utilsMiddleware = require('../api/middlewares/util'); -const securityMiddleware = require('../api/middlewares/security'); -const loggerMiddleware = require('../api/middlewares/logger'); -const errorMiddleware = require('../api/middlewares/error'); -const kycHookMiddleware = require('../api/middlewares/kycHook'); -const KycRouter = require('../api/routers/kyc'); - -const logger = require('../../modules/logger'); -const CONFIG = require('../../../config'); -const llo = logger.logMeta.bind(null, { service: 'kyc-hook-api' }); - -const mainRouter = new Router(); - -mainRouter.post( - '/kyc/hook', - KycRouter.hookReview, -); - -const MainMiddleware = compose([ - loggerMiddleware(), - errorMiddleware(), - - kycHookMiddleware(), - - bodyParser({ - enableTypes: ['json', 'form', 'text'], - jsonLimit: '4mb', - textLimit: '4mb', - formLimit: '4mb', - onerror: utilsMiddleware.onBodyParserError, - }), - - securityMiddleware(), - - mainRouter.routes(), - mainRouter.allowedMethods(), -]); - -const API = () => - new Promise((resolve, reject) => { - const app = new Koa(); - - app.proxy = CONFIG.REMOTE_EXECUTION; - - app.on('error', (error) => { - logger.error('Unexpected API error', { error }); - }); - - require('koa-ctx-cache-control')(app); - - app.use((ctx, next) => { - ctx.cacheControl(false); - return next(); - }); - - app.use(MainMiddleware); - - const server = app.listen(CONFIG.SERVICES.API.PORT, (err) => { - if (err) { - return reject(err); - } - - logger.info('Listening', llo({ port: CONFIG.SERVICES.API.PORT })); - resolve(app); - }); - - server.setTimeout(CONFIG.SERVICES.API.TIMEOUT * 1000); - }); - -module.exports = API; \ No newline at end of file +const Koa = require('koa'); +const Router = require('@koa/router'); +const compose = require('koa-compose'); +const bodyParser = require('koa-bodyparser'); + +const utilsMiddleware = require('../api/middlewares/util'); +const securityMiddleware = require('../api/middlewares/security'); +const loggerMiddleware = require('../api/middlewares/logger'); +const errorMiddleware = require('../api/middlewares/error'); +const kycHookMiddleware = require('../api/middlewares/kycHook'); +const KycRouter = require('../api/routers/kyc'); + +const logger = require('../../modules/logger'); +const CONFIG = require('../../../config'); +const llo = logger.logMeta.bind(null, { service: 'kyc-hook-api' }); + +const mainRouter = new Router(); + +mainRouter.post('/kyc/hook', KycRouter.hookReview); + +const MainMiddleware = compose([ + loggerMiddleware(), + errorMiddleware(), + + kycHookMiddleware(), + + bodyParser({ + enableTypes: ['json', 'form', 'text'], + jsonLimit: '4mb', + textLimit: '4mb', + formLimit: '4mb', + onerror: utilsMiddleware.onBodyParserError, + }), + + securityMiddleware(), + + mainRouter.routes(), + mainRouter.allowedMethods(), +]); + +const API = () => + new Promise((resolve, reject) => { + const app = new Koa(); + + app.proxy = CONFIG.REMOTE_EXECUTION; + + app.on('error', (error) => { + logger.error('Unexpected API error', { error }); + }); + + require('koa-ctx-cache-control')(app); + + app.use((ctx, next) => { + ctx.cacheControl(false); + return next(); + }); + + app.use(MainMiddleware); + + const server = app.listen(CONFIG.SERVICES.API.PORT, (err) => { + if (err) { + return reject(err); + } + + logger.info('Listening', llo({ port: CONFIG.SERVICES.API.PORT })); + resolve(app); + }); + + server.setTimeout(CONFIG.SERVICES.API.TIMEOUT * 1000); + }); + +module.exports = API; From e8048453383da9d2c74c3fc8e8207cbf7043dcc2 Mon Sep 17 00:00:00 2001 From: Aalaa Hesham Date: Wed, 4 May 2022 23:00:03 +0200 Subject: [PATCH 03/12] ADD: hook router --- src/services/api/routers/kyc.js | 12 ++++++++++++ src/services/kycHook/app.js | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/services/api/routers/kyc.js b/src/services/api/routers/kyc.js index 5b0a12b37..7d764a15b 100755 --- a/src/services/api/routers/kyc.js +++ b/src/services/api/routers/kyc.js @@ -64,6 +64,18 @@ const KycRouter = { ctx.body = await kycController.hookReview(formattedParams); }, + async hook(ctx, next) { + const params = { + externalId: ctx.request.body.applicantId, + reviewStatus: ctx.request.body.reviewStatus, + }; + + const formattedParams = await validateParams(KycRouter.schemaHookReview, params); + + ctx.body = await kycController.hookReview(formattedParams); + return next(); + }, + async getStatus(ctx) { ctx.body = await kycController.getStatus(ctx.state.user); }, diff --git a/src/services/kycHook/app.js b/src/services/kycHook/app.js index 81a75c220..df7e7ac3e 100644 --- a/src/services/kycHook/app.js +++ b/src/services/kycHook/app.js @@ -16,7 +16,7 @@ const llo = logger.logMeta.bind(null, { service: 'kyc-hook-api' }); const mainRouter = new Router(); -mainRouter.post('/kyc/hook', KycRouter.hookReview); +mainRouter.post('/kyc/hook', KycRouter.hook); const MainMiddleware = compose([ loggerMiddleware(), From 405596bcf5bf05910fb70bf5b832437f1f95dbe2 Mon Sep 17 00:00:00 2001 From: Aalaa Hesham Date: Wed, 4 May 2022 23:14:34 +0200 Subject: [PATCH 04/12] ADD: content-type and test cases --- src/services/api/middlewares/kycHook.js | 2 +- .../services/api/middlewares/kycHook.spec.js | 48 +++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 test/unit/services/api/middlewares/kycHook.spec.js diff --git a/src/services/api/middlewares/kycHook.js b/src/services/api/middlewares/kycHook.js index 9059781b2..163a4da4e 100644 --- a/src/services/api/middlewares/kycHook.js +++ b/src/services/api/middlewares/kycHook.js @@ -1,6 +1,6 @@ module.exports = () => (ctx, next) => { if (ctx.path === '/kyc/hook') { - ctx.headers['content-type'] = 'text/plain'; // TODO: check dis + ctx.headers['content-type'] = 'application/json'; } return next(); diff --git a/test/unit/services/api/middlewares/kycHook.spec.js b/test/unit/services/api/middlewares/kycHook.spec.js new file mode 100644 index 000000000..a24133047 --- /dev/null +++ b/test/unit/services/api/middlewares/kycHook.spec.js @@ -0,0 +1,48 @@ +const path = require('path'); +const sinon = require('sinon'); + +const kycHookMiddleware = require(path.join(srcDir, '/services/api/middlewares/kycHook')); + +describe.only('Middleware: kyc hook', () => { + let sandbox = null; + + beforeEach(async () => { + sandbox = sinon.createSandbox(); + }); + + afterEach(() => { + sandbox && sandbox.restore(); + }); + + it('Should add header for kyc route', async () => { + const middleware = kycHookMiddleware(); + + const ctx = { + path: '/kyc/hook', + headers: {}, + }; + + const next = sandbox.stub().returns('data'); + + const res = await middleware(ctx, next); + + expect(res).to.eq('data'); + expect(ctx.headers['content-type']).to.be.eq('application/json'); + }); + + it('Should not add header for other route', async () => { + const middleware = kycHookMiddleware(); + + const ctx = { + path: '/kyc/others', + headers: {}, + }; + + const next = sandbox.stub().returns('data'); + + const res = await middleware(ctx, next); + + expect(res).to.eq('data'); + expect(ctx.headers['content-type']).not.to.exist; + }); +}); From 5fa601b4018bf9fb176c255273f70f33d5513c8b Mon Sep 17 00:00:00 2001 From: Aalaa Hesham Date: Wed, 4 May 2022 23:22:05 +0200 Subject: [PATCH 05/12] FIX: endpoint --- src/services/api/routers/kyc.js | 11 +++++++++++ src/services/kycHook/app.js | 8 +++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/services/api/routers/kyc.js b/src/services/api/routers/kyc.js index 7d764a15b..ff836525e 100755 --- a/src/services/api/routers/kyc.js +++ b/src/services/api/routers/kyc.js @@ -95,6 +95,17 @@ const KycRouter = { */ router.post('/hookReview', AuthMiddleware.kycVerifyWebHook, KycRouter.hookReview); + /** + * @api {post} /kyc hook + * @apiName kyc_post_hook + * @apiGroup KYC + * @apiDescription KYC hook + * + * @apiSampleRequest /kyc/hook + * + */ + router.post('/hook', AuthMiddleware.kycVerifyWebHook, KycRouter.hook); + /** * @api {post} /kyc/upload Upload new document * @apiName kyc_upload_document diff --git a/src/services/kycHook/app.js b/src/services/kycHook/app.js index df7e7ac3e..0d77c7d64 100644 --- a/src/services/kycHook/app.js +++ b/src/services/kycHook/app.js @@ -8,6 +8,7 @@ const securityMiddleware = require('../api/middlewares/security'); const loggerMiddleware = require('../api/middlewares/logger'); const errorMiddleware = require('../api/middlewares/error'); const kycHookMiddleware = require('../api/middlewares/kycHook'); +const AuthMiddleware = require('../api/middlewares/auth'); const KycRouter = require('../api/routers/kyc'); const logger = require('../../modules/logger'); @@ -16,7 +17,12 @@ const llo = logger.logMeta.bind(null, { service: 'kyc-hook-api' }); const mainRouter = new Router(); -mainRouter.post('/kyc/hook', KycRouter.hook); +mainRouter.post( + '/kyc/hook', + AuthMiddleware.kycVerifyWebHook, + KycRouter.hook +); + const MainMiddleware = compose([ loggerMiddleware(), From 041b802c9c4f9dbe5810461f45b45f6176f797e8 Mon Sep 17 00:00:00 2001 From: Aalaa Hesham Date: Wed, 4 May 2022 23:39:09 +0200 Subject: [PATCH 06/12] ADD: test cases --- test/unit/services/api/routers/kyc.spec.js | 28 ++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/test/unit/services/api/routers/kyc.spec.js b/test/unit/services/api/routers/kyc.spec.js index ec0769cc6..dbd21f682 100644 --- a/test/unit/services/api/routers/kyc.spec.js +++ b/test/unit/services/api/routers/kyc.spec.js @@ -51,6 +51,7 @@ describe('Router: Kyc', () => { expect(router instanceof Router).to.be.true; expect(router.post.calledWith('/hookReview', kycVerifyWebHook, KycRouter.hookReview)).to.be.true; + expect(router.post.calledWith('/hook', kycVerifyWebHook, KycRouter.hook)).to.be.true; expect(router.post.calledWith('/questionnaire', authed, KycRouter.updateQuestionnaire)).to.be.true; expect(router.post.calledWith('/upload', authed, KycRouter.upload)).to.be.true; expect(router.get.calledWith('/', authed, KycRouter.getStatus)).to.be.true; @@ -178,6 +179,33 @@ describe('Router: Kyc', () => { ).to.be.true; }); + it('Should hook', async () => { + const ctx = { + state: { + user: this.user, + }, + request: { + body: { + applicantId: '8768094568049568045684095', + reviewStatus: 'completed', + }, + }, + }; + + const stubHookReview = sandbox.stub(KycController, 'hookReview').resolves('ok'); + const next = sandbox.stub(); + + await KycRouter.hook(ctx, next); + + expect(ctx.body).to.eq('ok'); + expect( + stubHookReview.calledWith({ + externalId: '8768094568049568045684095', + reviewStatus: 'completed', + }) + ).to.be.true; + }); + it('Should questionnaire', async () => { const ctx = { state: { From 0d0893536b68f823f78a9bc31493ba63d6a561d2 Mon Sep 17 00:00:00 2001 From: Aalaa Hesham Date: Wed, 4 May 2022 23:40:26 +0200 Subject: [PATCH 07/12] DEL: .only --- test/unit/services/api/middlewares/kycHook.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/services/api/middlewares/kycHook.spec.js b/test/unit/services/api/middlewares/kycHook.spec.js index a24133047..06c7cbab5 100644 --- a/test/unit/services/api/middlewares/kycHook.spec.js +++ b/test/unit/services/api/middlewares/kycHook.spec.js @@ -3,7 +3,7 @@ const sinon = require('sinon'); const kycHookMiddleware = require(path.join(srcDir, '/services/api/middlewares/kycHook')); -describe.only('Middleware: kyc hook', () => { +describe('Middleware: kyc hook', () => { let sandbox = null; beforeEach(async () => { From cdb373751df0677f07865f84293c2d031655707e Mon Sep 17 00:00:00 2001 From: Aalaa Hesham Date: Wed, 4 May 2022 23:51:26 +0200 Subject: [PATCH 08/12] FIX: format --- src/services/api/routers/kyc.js | 2 +- src/services/kycHook/app.js | 7 +------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/services/api/routers/kyc.js b/src/services/api/routers/kyc.js index ff836525e..f65449d48 100755 --- a/src/services/api/routers/kyc.js +++ b/src/services/api/routers/kyc.js @@ -104,7 +104,7 @@ const KycRouter = { * @apiSampleRequest /kyc/hook * */ - router.post('/hook', AuthMiddleware.kycVerifyWebHook, KycRouter.hook); + router.post('/hook', AuthMiddleware.kycVerifyWebHook, KycRouter.hook); /** * @api {post} /kyc/upload Upload new document diff --git a/src/services/kycHook/app.js b/src/services/kycHook/app.js index 0d77c7d64..8e8c6a6e5 100644 --- a/src/services/kycHook/app.js +++ b/src/services/kycHook/app.js @@ -17,12 +17,7 @@ const llo = logger.logMeta.bind(null, { service: 'kyc-hook-api' }); const mainRouter = new Router(); -mainRouter.post( - '/kyc/hook', - AuthMiddleware.kycVerifyWebHook, - KycRouter.hook -); - +mainRouter.post('/kyc/hook', AuthMiddleware.kycVerifyWebHook, KycRouter.hook); const MainMiddleware = compose([ loggerMiddleware(), From af3325faaf22d0eb9839100da7075a2aebae063c Mon Sep 17 00:00:00 2001 From: Aalaa Hesham Date: Tue, 10 May 2022 13:14:52 +0200 Subject: [PATCH 09/12] DEL: duplicated hook --- src/services/api/middlewares/kycHook.js | 2 +- src/services/api/routers/kyc.js | 26 ++-------------- src/services/kycHook/app.js | 2 +- .../services/api/middlewares/kycHook.spec.js | 2 +- test/unit/services/api/routers/kyc.spec.js | 30 +------------------ 5 files changed, 6 insertions(+), 56 deletions(-) diff --git a/src/services/api/middlewares/kycHook.js b/src/services/api/middlewares/kycHook.js index 163a4da4e..63dc5d0cc 100644 --- a/src/services/api/middlewares/kycHook.js +++ b/src/services/api/middlewares/kycHook.js @@ -1,5 +1,5 @@ module.exports = () => (ctx, next) => { - if (ctx.path === '/kyc/hook') { + if (ctx.path === '/kyc/hookReview') { ctx.headers['content-type'] = 'application/json'; } diff --git a/src/services/api/routers/kyc.js b/src/services/api/routers/kyc.js index f65449d48..4ddae5112 100755 --- a/src/services/api/routers/kyc.js +++ b/src/services/api/routers/kyc.js @@ -53,18 +53,7 @@ const KycRouter = { reviewStatus: Joi.string().max(128), }), - async hookReview(ctx) { - const params = { - externalId: ctx.request.body.applicantId, - reviewStatus: ctx.request.body.reviewStatus, - }; - - const formattedParams = await validateParams(KycRouter.schemaHookReview, params); - - ctx.body = await kycController.hookReview(formattedParams); - }, - - async hook(ctx, next) { + async hookReview(ctx, next) { const params = { externalId: ctx.request.body.applicantId, reviewStatus: ctx.request.body.reviewStatus, @@ -75,7 +64,7 @@ const KycRouter = { ctx.body = await kycController.hookReview(formattedParams); return next(); }, - + async getStatus(ctx) { ctx.body = await kycController.getStatus(ctx.state.user); }, @@ -95,17 +84,6 @@ const KycRouter = { */ router.post('/hookReview', AuthMiddleware.kycVerifyWebHook, KycRouter.hookReview); - /** - * @api {post} /kyc hook - * @apiName kyc_post_hook - * @apiGroup KYC - * @apiDescription KYC hook - * - * @apiSampleRequest /kyc/hook - * - */ - router.post('/hook', AuthMiddleware.kycVerifyWebHook, KycRouter.hook); - /** * @api {post} /kyc/upload Upload new document * @apiName kyc_upload_document diff --git a/src/services/kycHook/app.js b/src/services/kycHook/app.js index 8e8c6a6e5..7ad66c07d 100644 --- a/src/services/kycHook/app.js +++ b/src/services/kycHook/app.js @@ -17,7 +17,7 @@ const llo = logger.logMeta.bind(null, { service: 'kyc-hook-api' }); const mainRouter = new Router(); -mainRouter.post('/kyc/hook', AuthMiddleware.kycVerifyWebHook, KycRouter.hook); +mainRouter.post('/kyc/hookReview', AuthMiddleware.kycVerifyWebHook, KycRouter.hookReview); const MainMiddleware = compose([ loggerMiddleware(), diff --git a/test/unit/services/api/middlewares/kycHook.spec.js b/test/unit/services/api/middlewares/kycHook.spec.js index 06c7cbab5..c7700d54c 100644 --- a/test/unit/services/api/middlewares/kycHook.spec.js +++ b/test/unit/services/api/middlewares/kycHook.spec.js @@ -18,7 +18,7 @@ describe('Middleware: kyc hook', () => { const middleware = kycHookMiddleware(); const ctx = { - path: '/kyc/hook', + path: '/kyc/hookReview', headers: {}, }; diff --git a/test/unit/services/api/routers/kyc.spec.js b/test/unit/services/api/routers/kyc.spec.js index dbd21f682..8616fb559 100644 --- a/test/unit/services/api/routers/kyc.spec.js +++ b/test/unit/services/api/routers/kyc.spec.js @@ -51,7 +51,6 @@ describe('Router: Kyc', () => { expect(router instanceof Router).to.be.true; expect(router.post.calledWith('/hookReview', kycVerifyWebHook, KycRouter.hookReview)).to.be.true; - expect(router.post.calledWith('/hook', kycVerifyWebHook, KycRouter.hook)).to.be.true; expect(router.post.calledWith('/questionnaire', authed, KycRouter.updateQuestionnaire)).to.be.true; expect(router.post.calledWith('/upload', authed, KycRouter.upload)).to.be.true; expect(router.get.calledWith('/', authed, KycRouter.getStatus)).to.be.true; @@ -166,36 +165,9 @@ describe('Router: Kyc', () => { }, }; - const stubHookReview = sandbox.stub(KycController, 'hookReview').resolves('ok'); - - await KycRouter.hookReview(ctx); - - expect(ctx.body).to.eq('ok'); - expect( - stubHookReview.calledWith({ - externalId: '8768094568049568045684095', - reviewStatus: 'completed', - }) - ).to.be.true; - }); - - it('Should hook', async () => { - const ctx = { - state: { - user: this.user, - }, - request: { - body: { - applicantId: '8768094568049568045684095', - reviewStatus: 'completed', - }, - }, - }; - const stubHookReview = sandbox.stub(KycController, 'hookReview').resolves('ok'); const next = sandbox.stub(); - - await KycRouter.hook(ctx, next); + await KycRouter.hookReview(ctx, next); expect(ctx.body).to.eq('ok'); expect( From 0eaa58aa2b34ddbd1efbaaecd12da7c69b81433f Mon Sep 17 00:00:00 2001 From: Aalaa Hesham Date: Tue, 10 May 2022 13:21:12 +0200 Subject: [PATCH 10/12] FIX: format --- src/services/api/routers/kyc.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/api/routers/kyc.js b/src/services/api/routers/kyc.js index 4ddae5112..4896646f2 100755 --- a/src/services/api/routers/kyc.js +++ b/src/services/api/routers/kyc.js @@ -64,7 +64,7 @@ const KycRouter = { ctx.body = await kycController.hookReview(formattedParams); return next(); }, - + async getStatus(ctx) { ctx.body = await kycController.getStatus(ctx.state.user); }, From ac8dc7c93a38bf594223f15a29ef6db98a44bd5b Mon Sep 17 00:00:00 2001 From: Aalaa Hesham Date: Wed, 11 May 2022 21:14:29 +0200 Subject: [PATCH 11/12] DEL: next() --- src/services/api/routers/kyc.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/services/api/routers/kyc.js b/src/services/api/routers/kyc.js index 4896646f2..5b0a12b37 100755 --- a/src/services/api/routers/kyc.js +++ b/src/services/api/routers/kyc.js @@ -53,7 +53,7 @@ const KycRouter = { reviewStatus: Joi.string().max(128), }), - async hookReview(ctx, next) { + async hookReview(ctx) { const params = { externalId: ctx.request.body.applicantId, reviewStatus: ctx.request.body.reviewStatus, @@ -62,7 +62,6 @@ const KycRouter = { const formattedParams = await validateParams(KycRouter.schemaHookReview, params); ctx.body = await kycController.hookReview(formattedParams); - return next(); }, async getStatus(ctx) { From 5e3d60d006c053d92b36e7ef900ff7110558cbf1 Mon Sep 17 00:00:00 2001 From: cristianizzo Date: Tue, 17 May 2022 02:12:48 +0200 Subject: [PATCH 12/12] enable/disable hook --- config/services.js | 1 + src/services/api/routers/kyc.js | 23 ++++++++++++---------- test/unit/services/api/routers/kyc.spec.js | 21 ++++++++++++++++++-- 3 files changed, 33 insertions(+), 12 deletions(-) diff --git a/config/services.js b/config/services.js index d131c2475..f76152026 100755 --- a/config/services.js +++ b/config/services.js @@ -599,6 +599,7 @@ const getConfigObject = (sourceConfig) => ({ }, KYC: { + ENABLE_HOOK: configParser(sourceConfig, 'bool', 'SERVICES_KYC_ENABLE_HOOK', false), INTERVAL_CHECK: configParser(sourceConfig, 'number', 'SERVICES_KYC_INTERVAL_CHECK', 6 * 60 * 60 * 1000), // 6 hour RE_SYNC_DELAY: configParser(sourceConfig, 'number', 'SERVICES_KYC_RE_SYNC_DELAY', 12), // 12 hour S3: { diff --git a/src/services/api/routers/kyc.js b/src/services/api/routers/kyc.js index 5b0a12b37..474d889cb 100755 --- a/src/services/api/routers/kyc.js +++ b/src/services/api/routers/kyc.js @@ -4,6 +4,7 @@ const Models = require('../../../models/pg'); const kycController = require('../controllers/kyc'); const AuthMiddleware = require('../middlewares/auth'); const { validateParams } = require('../../../helpers/validation'); +const config = require('../../../../config'); const KycRouter = { schemaUpdateQuestionnaire: Joi.object({ @@ -72,16 +73,18 @@ const KycRouter = { const router = Router(); const authed = AuthMiddleware.authAssert({ active: true, verifyEmail: true }); - /** - * @api {post} /kyc hook Review - * @apiName kyc_post_hook_review - * @apiGroup KYC - * @apiDescription KYC hook Review - * - * @apiSampleRequest /kyc/hookReview - * - */ - router.post('/hookReview', AuthMiddleware.kycVerifyWebHook, KycRouter.hookReview); + if (config.SERVICES.KYC.ENABLE_HOOK) { + /** + * @api {post} /kyc hook Review + * @apiName kyc_post_hook_review + * @apiGroup KYC + * @apiDescription KYC hook Review + * + * @apiSampleRequest /kyc/hookReview + * + */ + router.post('/hookReview', AuthMiddleware.kycVerifyWebHook, KycRouter.hookReview); + } /** * @api {post} /kyc/upload Upload new document diff --git a/test/unit/services/api/routers/kyc.spec.js b/test/unit/services/api/routers/kyc.spec.js index 8616fb559..fad503122 100644 --- a/test/unit/services/api/routers/kyc.spec.js +++ b/test/unit/services/api/routers/kyc.spec.js @@ -3,6 +3,7 @@ const sinon = require('sinon'); const Router = require('@koa/router'); const sequelizeMockingMocha = require('sequelize-mocking').sequelizeMockingMocha; +const config = require(path.join(srcDir, '/../config')); const authMiddleware = require(path.join(srcDir, '/services/api/middlewares/auth')); const Models = require(path.join(srcDir, '/models/pg')); const KycRouter = require(path.join(srcDir, '/services/api/routers/kyc')); @@ -43,19 +44,35 @@ describe('Router: Kyc', () => { it('Should get router', async () => { const authed = (ctx, next) => next(); const authAssert = sandbox.stub(authMiddleware, 'authAssert').returns(authed); - const kycVerifyWebHook = sandbox.stub(authMiddleware, 'kycVerifyWebHook').returns(authed); const router = await KycRouter.router(); expect(authAssert.calledWith({ verifyEmail: true, active: true })); expect(router instanceof Router).to.be.true; - expect(router.post.calledWith('/hookReview', kycVerifyWebHook, KycRouter.hookReview)).to.be.true; expect(router.post.calledWith('/questionnaire', authed, KycRouter.updateQuestionnaire)).to.be.true; expect(router.post.calledWith('/upload', authed, KycRouter.upload)).to.be.true; expect(router.get.calledWith('/', authed, KycRouter.getStatus)).to.be.true; }); + it('Should get router when is hook enable', async () => { + const oldConfigKycEnableHook = config.SERVICES.KYC.ENABLE_HOOK; + config.SERVICES.KYC.ENABLE_HOOK = true; + + const authed = (ctx, next) => next(); + const authAssert = sandbox.stub(authMiddleware, 'authAssert').returns(authed); + const kycVerifyWebHook = sandbox.stub(authMiddleware, 'kycVerifyWebHook').returns(authed); + + const router = await KycRouter.router(); + + expect(authAssert.calledWith({ verifyEmail: true, active: true })); + + expect(router instanceof Router).to.be.true; + expect(router.post.calledWith('/hookReview', kycVerifyWebHook, KycRouter.hookReview)).to.be.true; + + config.SERVICES.KYC.ENABLE_HOOK = oldConfigKycEnableHook; + }); + it('Should upload with padding', async () => { const ctx = { state: {