From 0bb37c3db4c95f7d944add1cd2dab26d1b8d11fe Mon Sep 17 00:00:00 2001 From: Hage Yaapa Date: Mon, 22 Oct 2018 16:43:10 +0530 Subject: [PATCH] feat: add 'x-internal' extension property to OpenAPI spec Add `x-internal` extension property to OpenAPI spec. --- packages/rest/src/router/routing-table.ts | 16 +++-- .../rest.server.open-api-spec.unit.ts | 63 +++++++++++++++++++ 2 files changed, 74 insertions(+), 5 deletions(-) diff --git a/packages/rest/src/router/routing-table.ts b/packages/rest/src/router/routing-table.ts index cbc09ec926c8..f798d21d23ed 100644 --- a/packages/rest/src/router/routing-table.ts +++ b/packages/rest/src/router/routing-table.ts @@ -156,11 +156,13 @@ export class RoutingTable { const paths: PathObject = {}; for (const route of this._router.list()) { - if (!paths[route.path]) { - paths[route.path] = {}; - } + if (!route.spec['x-internal']) { + if (!paths[route.path]) { + paths[route.path] = {}; + } - paths[route.path][route.verb] = route.spec; + paths[route.path][route.verb] = route.spec; + } } return paths; @@ -187,6 +189,10 @@ export class RoutingTable { } } +export interface LB4OperationObject extends OperationObject { + readonly 'x-internal'?: boolean; +} + /** * An entry in the routing table */ @@ -202,7 +208,7 @@ export interface RouteEntry { /** * OpenAPI operation spec */ - readonly spec: OperationObject; + readonly spec: LB4OperationObject; /** * Update bindings for the request context diff --git a/packages/rest/test/unit/rest.server/rest.server.open-api-spec.unit.ts b/packages/rest/test/unit/rest.server/rest.server.open-api-spec.unit.ts index 1a6b90065314..1bf2b1c1b890 100644 --- a/packages/rest/test/unit/rest.server/rest.server.open-api-spec.unit.ts +++ b/packages/rest/test/unit/rest.server/rest.server.open-api-spec.unit.ts @@ -89,6 +89,29 @@ describe('RestServer.getApiSpec()', () => { }); }); + it('ignores routes marked as "x-internal" via app.route(route)', () => { + function greet() {} + function meet() {} + server.route( + new Route( + 'get', + '/greet', + {'x-internal': true, responses: {}, spec: {}}, + greet, + ), + ); + server.route(new Route('get', '/meet', {responses: {}, spec: {}}, meet)); + const spec = server.getApiSpec(); + expect(spec.paths).to.eql({ + '/meet': { + get: { + responses: {}, + spec: {}, + }, + }, + }); + }); + it('returns routes registered via app.route(..., Controller, method)', () => { class MyController { greet() {} @@ -116,6 +139,46 @@ describe('RestServer.getApiSpec()', () => { }); }); + it('ignores routes marked as "x-internal" via app.route(..., Controller, method)', () => { + class GreetController { + greet() {} + } + + class MeetController { + meet() {} + } + + server.route( + 'get', + '/greet', + {'x-internal': true, responses: {}}, + GreetController, + createControllerFactoryForClass(GreetController), + 'greet', + ); + + server.route( + 'get', + '/meet', + {responses: {}}, + MeetController, + createControllerFactoryForClass(MeetController), + 'meet', + ); + + const spec = server.getApiSpec(); + expect(spec.paths).to.eql({ + '/meet': { + get: { + responses: {}, + 'x-controller-name': 'MeetController', + 'x-operation-name': 'meet', + tags: ['MeetController'], + }, + }, + }); + }); + it('honors tags in the operation spec', () => { class MyController { @get('/greet', {responses: {'200': {description: ''}}, tags: ['MyTag']})