From 04ddc513a423c178d7c348200be09fd44eceeee8 Mon Sep 17 00:00:00 2001 From: Joel Chu Date: Sun, 21 Jul 2019 17:39:17 +0800 Subject: [PATCH 1/5] Add new clean description handler to contract-middleware --- packages/koa/package.json | 4 ++-- packages/koa/src/contract-middleware.js | 29 ++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/packages/koa/package.json b/packages/koa/package.json index d89bcf94..4058d352 100755 --- a/packages/koa/package.json +++ b/packages/koa/package.json @@ -1,6 +1,6 @@ { "name": "jsonql-koa", - "version": "1.3.1", + "version": "1.3.2", "description": "json:ql Koa middleware", "main": "index.js", "files": [ @@ -39,7 +39,7 @@ "esm": "^3.2.25", "fs-extra": "^8.1.0", "jsonql-constants": "^1.7.8", - "jsonql-contract": "^1.7.5", + "jsonql-contract": "^1.7.6", "jsonql-errors": "^1.0.9", "jsonql-jwt": "^1.2.1", "jsonql-node-client": "^1.1.3", diff --git a/packages/koa/src/contract-middleware.js b/packages/koa/src/contract-middleware.js index a1929d10..bfa33fd7 100755 --- a/packages/koa/src/contract-middleware.js +++ b/packages/koa/src/contract-middleware.js @@ -19,6 +19,26 @@ const { const debug = getDebug('contract-middleware') +/** + * remove the description field + * @param {boolean} desc true to keep + * @param {object} contract json + * @return {object} clean contract + */ +const removeDesc = (desc, contract) => { + if (desc) { + return contract; + } + for (let type in contract) { + for (let fn in contract[type]) { + if (contract[type][fn].description) { + delete contract[type][fn].description + } + } + } + return contract; +} + /** * get the contract data @TODO might require some sort of security here * @param {object} opts options @@ -27,7 +47,14 @@ const debug = getDebug('contract-middleware') */ const handleContract = (opts, ctx, contract) => { debug('serving up contract', contract); - handleOutput(opts)(ctx, packResult(contract)) + // @1.3.2 add a filter here to exclude the description field + // just to reduce the size, but we serve it up if this is request with + // desc=1 param - useful for the jsonql-web-console + debug('handleContract', ctx.query.desc) + let desc = (ctx.query.desc && ctx.query.desc === 1) + handleOutput(opts)(ctx, packResult( + removeDesc(desc, contract) + )) } /** -- Gitee From 9840a5ae09e19433a16a0ed1723f627f1092318b Mon Sep 17 00:00:00 2001 From: Joel Chu Date: Sun, 21 Jul 2019 18:00:37 +0800 Subject: [PATCH 2/5] remove the contract and cache key when return from cache it breaks the front end --- packages/koa/src/lib/contract-generator/index.js | 6 +++++- packages/koa/tests/koa.test.js | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/koa/src/lib/contract-generator/index.js b/packages/koa/src/lib/contract-generator/index.js index 56f24598..cc53e5d2 100644 --- a/packages/koa/src/lib/contract-generator/index.js +++ b/packages/koa/src/lib/contract-generator/index.js @@ -16,9 +16,13 @@ module.exports = function(config, pub = false) { const key = pub ? 'public' : 'private'; if (contractCache[key]) { debug(`return ${key} contract from cache`) - return Promise.resolve({ contract: contractCache[key], cache: true }) + // this is the problem - if we want to keep it consistent then + // we should always provide the contract key --> cache is optional! + // { contract: contractCache[key], cache: true } + return Promise.resolve(contractCache[key]) } ps.send({ config, pub }) + // return return new Promise((resolver, rejecter) => { ps.on('message', msg => { if (msg.contract) { diff --git a/packages/koa/tests/koa.test.js b/packages/koa/tests/koa.test.js index 8e6de771..e9f6e917 100755 --- a/packages/koa/tests/koa.test.js +++ b/packages/koa/tests/koa.test.js @@ -83,5 +83,8 @@ test("It should able see a dummy web console page", async t => { let res = await superkoa(t.context.app) .get('/jsonql') t.is(200, res.status) +}) +test("It should return a contract file without the description field", async t => { + }) -- Gitee From 59f947a4063e71dfe9d54e420b9885ae098485e4 Mon Sep 17 00:00:00 2001 From: Joel Chu Date: Sun, 21 Jul 2019 20:12:03 +0800 Subject: [PATCH 3/5] resolve that remove description problem --- packages/koa/src/contract-middleware.js | 18 ++++++++++++------ packages/koa/tests/koa.test.js | 18 ++++++++++++++---- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/packages/koa/src/contract-middleware.js b/packages/koa/src/contract-middleware.js index bfa33fd7..2b98d971 100755 --- a/packages/koa/src/contract-middleware.js +++ b/packages/koa/src/contract-middleware.js @@ -8,6 +8,7 @@ const { join } = require('path') const { trim } = require('lodash') const { CONTRACT_NAME } = require('jsonql-constants') const { JsonqlContractAuthError } = require('jsonql-errors') +const { isKeyInObject } = require('jsonql-params-validator') const { getDebug, getContract, @@ -26,17 +27,23 @@ const debug = getDebug('contract-middleware') * @return {object} clean contract */ const removeDesc = (desc, contract) => { + debug('removeDesc', desc) if (desc) { return contract; } - for (let type in contract) { - for (let fn in contract[type]) { - if (contract[type][fn].description) { - delete contract[type][fn].description + let c = contract; + for (let type in c) { + for (let fn in c[type]) { + if (isKeyInObject(c[type][fn], 'description')) { + delete c[type][fn].description; + if (c[type][fn].returns && isKeyInObject(c[type][fn].returns, 'description')) { + delete c[type][fn].returns.description; + } } } } - return contract; + debug(c) + return c; } /** @@ -46,7 +53,6 @@ const removeDesc = (desc, contract) => { * @return {undefined} */ const handleContract = (opts, ctx, contract) => { - debug('serving up contract', contract); // @1.3.2 add a filter here to exclude the description field // just to reduce the size, but we serve it up if this is request with // desc=1 param - useful for the jsonql-web-console diff --git a/packages/koa/tests/koa.test.js b/packages/koa/tests/koa.test.js index e9f6e917..8b4336a3 100755 --- a/packages/koa/tests/koa.test.js +++ b/packages/koa/tests/koa.test.js @@ -36,14 +36,17 @@ test("Hello world test", async t => { t.is('Hello world!', res.body.data) }) -test("It should return a public contract with helloWorld", async (t) => { +test.only("It should return a public contract with helloWorld", async (t) => { let res = await superkoa(t.context.app) .get('/jsonql') .set(headers) let contract = res.body.data; - // debug('public contract', contract) - t.is(200, res.status); + + t.is(200, res.status) + t.deepEqual(returns, contract.query.helloWorld.returns) + // it should not have a description field + t.falsy(contract.query.helloWorld.description) }) // start test @@ -86,5 +89,12 @@ test("It should able see a dummy web console page", async t => { }) test("It should return a contract file without the description field", async t => { - + let res = await superkoa(t.context.app) + .get('/jsonql') + .query({ desc: 1 }) + .set(headers) + let contract = res.body.data; + + t.truthy(contract.query.helloWorld.description) + }) -- Gitee From 84bbb3d0a1a636753af8a22a0d42b1a886db6b99 Mon Sep 17 00:00:00 2001 From: Joel Chu Date: Sun, 21 Jul 2019 20:12:18 +0800 Subject: [PATCH 4/5] resolve that remove description problem --- packages/koa/src/contract-middleware.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/koa/src/contract-middleware.js b/packages/koa/src/contract-middleware.js index 2b98d971..062656de 100755 --- a/packages/koa/src/contract-middleware.js +++ b/packages/koa/src/contract-middleware.js @@ -42,7 +42,7 @@ const removeDesc = (desc, contract) => { } } } - debug(c) + debug('%O', c) return c; } -- Gitee From c7bcccc128ff17e765e148c621f6487c75eabf63 Mon Sep 17 00:00:00 2001 From: Joel Chu Date: Sun, 21 Jul 2019 21:11:13 +0800 Subject: [PATCH 5/5] finalize on the keep contract query --- packages/koa/src/contract-middleware.js | 3 +-- packages/koa/src/init-middleware.js | 2 +- packages/koa/tests/koa.test.js | 4 ++-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/koa/src/contract-middleware.js b/packages/koa/src/contract-middleware.js index 062656de..5f65e5f1 100755 --- a/packages/koa/src/contract-middleware.js +++ b/packages/koa/src/contract-middleware.js @@ -42,7 +42,6 @@ const removeDesc = (desc, contract) => { } } } - debug('%O', c) return c; } @@ -57,7 +56,7 @@ const handleContract = (opts, ctx, contract) => { // just to reduce the size, but we serve it up if this is request with // desc=1 param - useful for the jsonql-web-console debug('handleContract', ctx.query.desc) - let desc = (ctx.query.desc && ctx.query.desc === 1) + let desc = !!(ctx.query.desc && ctx.query.desc === 'y') handleOutput(opts)(ctx, packResult( removeDesc(desc, contract) )) diff --git a/packages/koa/src/init-middleware.js b/packages/koa/src/init-middleware.js index 5c576088..e0035153 100644 --- a/packages/koa/src/init-middleware.js +++ b/packages/koa/src/init-middleware.js @@ -94,7 +94,7 @@ module.exports = function(opts, setter, getter) { ctx.state.jsonql.contract = await processContract(ctx, opts) // v1.2.0 grabbing the public / private keys opts = await processJwtKeys(ctx, opts) - debug('processJwtKeys', opts) + // debug('processJwtKeys', opts) // get what is calling let payload = ctx.request.body; // new in v1.3.0 - test for jsonp type diff --git a/packages/koa/tests/koa.test.js b/packages/koa/tests/koa.test.js index 8b4336a3..7fa9f34a 100755 --- a/packages/koa/tests/koa.test.js +++ b/packages/koa/tests/koa.test.js @@ -36,7 +36,7 @@ test("Hello world test", async t => { t.is('Hello world!', res.body.data) }) -test.only("It should return a public contract with helloWorld", async (t) => { +test("It should return a public contract with helloWorld", async (t) => { let res = await superkoa(t.context.app) .get('/jsonql') .set(headers) @@ -91,7 +91,7 @@ test("It should able see a dummy web console page", async t => { test("It should return a contract file without the description field", async t => { let res = await superkoa(t.context.app) .get('/jsonql') - .query({ desc: 1 }) + .query({ desc: 'y' }) .set(headers) let contract = res.body.data; -- Gitee