From 9d6222547811fd3c94b91496d9917b7df5115fc6 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Sat, 30 Jan 2021 17:26:51 +0100 Subject: [PATCH] Added openapi related classes --- src/apispec.ts | 25 +++++++++++++++++++++++++ src/loaders/openapi.ts | 24 ++++++++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 src/apispec.ts create mode 100644 src/loaders/openapi.ts diff --git a/src/apispec.ts b/src/apispec.ts new file mode 100644 index 0000000..4a1f496 --- /dev/null +++ b/src/apispec.ts @@ -0,0 +1,25 @@ +import { MetadataArgsStorage } from 'routing-controllers'; +import { routingControllersToSpec } from 'routing-controllers-openapi'; +import { config } from './config'; + +/** + * This function generates a the openapi spec from route metadata and type schemas. + * @param storage MetadataArgsStorage object generated by routing-controllers. + * @param schemas MetadataArgsStorage object generated by class-validator-jsonschema. + */ +export function generateSpec(storage: MetadataArgsStorage, schemas) { + return routingControllersToSpec( + storage, + {}, + { + components: { + schemas, + }, + info: { + description: "The the API for the LfK! document server.", + title: "LfK! document server API", + version: config.version + }, + } + ); +} \ No newline at end of file diff --git a/src/loaders/openapi.ts b/src/loaders/openapi.ts new file mode 100644 index 0000000..26ca18b --- /dev/null +++ b/src/loaders/openapi.ts @@ -0,0 +1,24 @@ +import { validationMetadatasToSchemas } from "@odit/class-validator-jsonschema"; +import express, { Application } from "express"; +import path from 'path'; +import { getMetadataArgsStorage } from "routing-controllers"; +import { generateSpec } from '../apispec'; + +/** + * Loader for everything openapi related - from creating the schema to serving it via a static route and swaggerUiExpress. + * All auth schema related stuff also has to be configured here + */ +export default async (app: Application) => { + const storage = getMetadataArgsStorage(); + const schemas = validationMetadatasToSchemas({ + refPointerPrefix: "#/components/schemas/", + }); + + //Spec creation based on the previously created schemas + const spec = generateSpec(storage, schemas); + app.get(["/api/docs/openapi.json", "/api/docs/swagger.json"], (req, res) => { + res.json(spec); + }); + app.use('/api/docs', express.static(path.join(__dirname, '../static/docs'), { index: "index.html", extensions: ['html'] })); + return app; +};