diff --git a/packages/koa/package.json b/packages/koa/package.json index d89bcf94addf08cfda225f8eb211a8df89f9dcca..4058d35279e922554d1bbbc4248c0c15ba4b43ab 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 a1929d109c8cd033513d947f294a5fddbabd66eb..5f65e5f1d929c2cea7efce13d59d793f316a85f5 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, @@ -19,6 +20,31 @@ 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) => { + debug('removeDesc', desc) + if (desc) { + return contract; + } + 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 c; +} + /** * get the contract data @TODO might require some sort of security here * @param {object} opts options @@ -26,8 +52,14 @@ const debug = getDebug('contract-middleware') * @return {undefined} */ 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 === '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 5c57608893c3268ed029ce987e4192014bcfb302..e00351539b87bed6875fb22e4449d3395bba5ad7 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/src/lib/contract-generator/index.js b/packages/koa/src/lib/contract-generator/index.js index 56f2459825fb8564332aec297d8844870c7e3a91..cc53e5d2835d7eebf1187a7c7a2df5fc22ada8cc 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 8e6de771c33e0a841427020fde543542fa5826ec..7fa9f34acfa12a274b217c05cba76985ac6ea59c 100755 --- a/packages/koa/tests/koa.test.js +++ b/packages/koa/tests/koa.test.js @@ -41,9 +41,12 @@ test("It should return a public contract with helloWorld", async (t) => { .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 @@ -83,5 +86,15 @@ 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 => { + let res = await superkoa(t.context.app) + .get('/jsonql') + .query({ desc: 'y' }) + .set(headers) + let contract = res.body.data; + + t.truthy(contract.query.helloWorld.description) })