UNPKG

@coorpacademy/baucis-swagger

Version:

Generate customizable swagger definitions for your Baucis REST API.

62 lines (53 loc) 1.85 kB
const _ = require('lodash/fp'); // Figure out the basePath for Swagger API definition function getBase(request, extra) { const parts = request.originalUrl.split('/'); // Remove extra path parts. parts.splice(-extra, extra); return `${request.protocol}://${request.headers.host}${parts.join('/')}`; } // A method for generating a Swagger resource listing function generateResourceListing(options) { const plurals = options.controllers.map(function(controller) { return controller.model().plural(); }); const listing = { apiVersion: options.version, swaggerVersion: '1.1', basePath: options.basePath, apis: plurals.map(function(plural) { return {path: `/documentation/${plural}`, description: `Operations about ${plural}.`}; }) }; return listing; } module.exports = (pluginOptions = {}) => function extendApi(api) { // Middleware for the documentation index. api.get('/documentation', function(request, response) { response.json( generateResourceListing({ version: request.baucis.release, controllers: api.controllers(request.baucis.release), basePath: getBase(request, 1) }) ); }); // Find the correct controller to handle the request. api.get('/documentation/:path', function(request, response, next) { const fragment = `/${request.params.path}`; const controllers = api.controllers(request.baucis.release, fragment); // If not found, bail. if (controllers.lenth === 0) return next(); controllers[0].generateSwagger(); response.json( _.merge(controllers[0].swagger, { apiVersion: request.baucis.release, swaggerVersion: '1.1', basePath: getBase(request, 2), resourcePath: fragment }) ); }); return api; };