diff --git a/index.js b/index.js index a072077..2514c22 100644 --- a/index.js +++ b/index.js @@ -39,7 +39,7 @@ module.exports = function ExpressOpenApi (_routePrefix, _doc, _opts) { // Where the magic happens const middleware = function OpenApiMiddleware (req, res, next) { if (isFirstRequest) { - middleware.document = generateDocument(middleware.document, req.app._router || req.app.router, opts.basePath) + middleware.document = generateDocument(middleware.document, req.app._router || req.app.router, opts.basePath, middleware) isFirstRequest = false } @@ -48,8 +48,8 @@ module.exports = function ExpressOpenApi (_routePrefix, _doc, _opts) { // Expose the current document and prefix middleware.routePrefix = routePrefix - middleware.document = generateDocument(doc, undefined, opts.basePath) - middleware.generateDocument = generateDocument + middleware.document = generateDocument(doc, undefined, opts.basePath, middleware) + middleware.generateDocument = (doc, router, basePath) => generateDocument(doc, router, basePath, middleware) middleware.options = opts // Add a path schema to the document @@ -59,6 +59,7 @@ module.exports = function ExpressOpenApi (_routePrefix, _doc, _opts) { } setSchema(schemaMiddleware, schema) + schemaMiddleware._ownerMiddleware = middleware return schemaMiddleware } @@ -73,6 +74,7 @@ module.exports = function ExpressOpenApi (_routePrefix, _doc, _opts) { } setSchema(validSchemaMiddleware, schema) + validSchemaMiddleware._ownerMiddleware = middleware return validSchemaMiddleware } @@ -131,13 +133,13 @@ module.exports = function ExpressOpenApi (_routePrefix, _doc, _opts) { // OpenAPI document as json router.get(`${routePrefix}.json`, (req, res) => { - middleware.document = generateDocument(middleware.document, req.app._router || req.app.router, opts.basePath) + middleware.document = generateDocument(middleware.document, req.app._router || req.app.router, opts.basePath, middleware) res.json(middleware.document) }) // OpenAPI document as yaml router.get([`${routePrefix}.yaml`, `${routePrefix}.yml`], (req, res) => { - const jsonSpec = generateDocument(middleware.document, req.app._router || req.app.router, opts.basePath) + const jsonSpec = generateDocument(middleware.document, req.app._router || req.app.router, opts.basePath, middleware) const yamlSpec = YAML.stringify(jsonSpec) res.type('yaml') @@ -146,7 +148,7 @@ module.exports = function ExpressOpenApi (_routePrefix, _doc, _opts) { router.get(`${routePrefix}/components/:type/:name.json`, (req, res, next) => { const { type, name } = req.params - middleware.document = generateDocument(middleware.document, req.app._router || req.app.router, opts.basePath) + middleware.document = generateDocument(middleware.document, req.app._router || req.app.router, opts.basePath, middleware) // No component by that identifer if (!middleware.document.components[type] || !middleware.document.components[type][name]) { @@ -159,7 +161,7 @@ module.exports = function ExpressOpenApi (_routePrefix, _doc, _opts) { // Validate full open api document router.get(`${routePrefix}/validate`, (req, res) => { - middleware.document = generateDocument(middleware.document, req.app._router || req.app.router, opts.basePath) + middleware.document = generateDocument(middleware.document, req.app._router || req.app.router, opts.basePath, middleware) SwaggerParser.validate(middleware.document, (err, api) => { if (err) { return res.json({ diff --git a/lib/generate-doc.js b/lib/generate-doc.js index cb59904..a4b6950 100644 --- a/lib/generate-doc.js +++ b/lib/generate-doc.js @@ -3,7 +3,7 @@ const pathToRegexp = require('path-to-regexp') const minimumViableDocument = require('./minimum-doc') const { get: getSchema, set: setSchema } = require('./layer-schema') -module.exports = function generateDocument (baseDocument, router, basePath) { +module.exports = function generateDocument (baseDocument, router, basePath, ownerMiddleware) { // Merge document with select minimum defaults const doc = Object.assign({ openapi: minimumViableDocument.openapi @@ -23,6 +23,11 @@ module.exports = function generateDocument (baseDocument, router, basePath) { return } + // If ownerMiddleware is provided, only exclude routes owned by other OpenAPI middlewares + if (ownerMiddleware && layer.handle._ownerMiddleware && layer.handle._ownerMiddleware !== ownerMiddleware) { + return + } + const operation = Object.assign({}, schema) // Add route params to schema