feat(tagging for redoc): add tagging for redoc

This commit is contained in:
Philipp Kunz 2021-11-21 01:14:53 +01:00
parent d60ff7efdf
commit c83f0ccd35
2 changed files with 50 additions and 12 deletions

View File

@ -3,11 +3,12 @@ import * as smartexpress from '@pushrocks/smartexpress';
import * as smartswagger from '../ts'; import * as smartswagger from '../ts';
const run = async () => { const run = async () => {
const smartswaggerInstance = await smartswagger.Smartswagger.createFromUrl('https://my.sevdesk.de/OpenAPI/ReceiptAPI/openApi.json'); const smartswaggerInstance = await smartswagger.Smartswagger.createNew('A new OpenAPI Doc');
await smartswaggerInstance.mergeDocumentFromUrl('https://my.sevdesk.de/OpenAPI/ContactAPI/openApi.json', ''); await smartswaggerInstance.mergeDocumentFromUrl('https://my.sevdesk.de/OpenAPI/ReceiptAPI/openApi.json', '', 'Yes1');
await smartswaggerInstance.mergeDocumentFromUrl('https://my.sevdesk.de/OpenAPI/InvoiceAPI/openApi.json', ''); await smartswaggerInstance.mergeDocumentFromUrl('https://my.sevdesk.de/OpenAPI/ContactAPI/openApi.json', '', 'Yes2');
await smartswaggerInstance.mergeDocumentFromUrl('https://my.sevdesk.de/OpenAPI/OrderAPI/openApi.json', ''); await smartswaggerInstance.mergeDocumentFromUrl('https://my.sevdesk.de/OpenAPI/InvoiceAPI/openApi.json', '', 'Yes3');
await smartswaggerInstance.mergeDocumentFromUrl('https://my.sevdesk.de/OpenAPI/InventoryAPI/openApi.json', ''); await smartswaggerInstance.mergeDocumentFromUrl('https://my.sevdesk.de/OpenAPI/OrderAPI/openApi.json', '', 'Yes4');
await smartswaggerInstance.mergeDocumentFromUrl('https://my.sevdesk.de/OpenAPI/InventoryAPI/openApi.json', '', 'Yes5');
// express stuff // express stuff
const expressServer = new smartexpress.Server({ const expressServer = new smartexpress.Server({

View File

@ -2,14 +2,14 @@ import path from 'path';
import * as plugins from './smartswagger.plugins'; import * as plugins from './smartswagger.plugins';
interface RedocProps { interface RedocProps {
'x-tagGroups': any; 'x-tagGroups'?: {name: string, tags: string[]}[];
} }
type IExtendedApiDoc = plugins.openapiTypes.OpenAPIV3.Document & RedocProps; type IExtendedApiDoc = plugins.openapiTypes.OpenAPIV3.Document & RedocProps;
export class Smartswagger { export class Smartswagger {
// STATIC // STATIC
/** /**
* * creates a new Smartswagger instance from an external document
* @param urlArg a url arg that contains an original swagger.json in the response * @param urlArg a url arg that contains an original swagger.json in the response
* @returns an instance of * @returns an instance of
*/ */
@ -24,6 +24,18 @@ export class Smartswagger {
return newSMartswaggerInstance; return newSMartswaggerInstance;
} }
public static async createNew(titleArg: string = 'an OpenApiDoc') {
const newSMartswaggerInstance = new Smartswagger({
openapi: '3.0.0',
paths: {},
info: {
title: titleArg,
version: '1.0.0'
}
});
return newSMartswaggerInstance;
}
// INSTANCE // INSTANCE
/** /**
* the basic info of the api doc * the basic info of the api doc
@ -54,7 +66,7 @@ export class Smartswagger {
* @param documentToMergeArg * @param documentToMergeArg
* @param basePathArg * @param basePathArg
*/ */
public async mergeDocument(documentToMergeArg: IExtendedApiDoc, basePathArg: string) { public async mergeDocument(documentToMergeArg: IExtendedApiDoc, basePathArg: string = '', tagArg?: string) {
console.log(`merging document with name ${documentToMergeArg.info?.title}`); console.log(`merging document with name ${documentToMergeArg.info?.title}`);
await this.deref(); await this.deref();
// lets get a dereferenced version of the document we want to merge // lets get a dereferenced version of the document we want to merge
@ -65,6 +77,26 @@ export class Smartswagger {
const pathToMerge = plugins.path.join(basePathArg, path); const pathToMerge = plugins.path.join(basePathArg, path);
this.apiDoc.paths = this.apiDoc.paths || {}; this.apiDoc.paths = this.apiDoc.paths || {};
this.apiDoc.paths[pathToMerge] = documentToMerge.paths[path]; this.apiDoc.paths[pathToMerge] = documentToMerge.paths[path];
if (tagArg) {
if (this.apiDoc.paths[pathToMerge].post) {
this.apiDoc.paths[pathToMerge].post.tags = this.apiDoc.paths[pathToMerge].post.tags || [];
this.apiDoc.paths[pathToMerge].post.tags.push(tagArg);
}
if (this.apiDoc.paths[pathToMerge].get) {
this.apiDoc.paths[pathToMerge].get.tags = this.apiDoc.paths[pathToMerge].get.tags || [];
this.apiDoc.paths[pathToMerge].get.tags.push(tagArg);
}
if (this.apiDoc.paths[pathToMerge].put) {
this.apiDoc.paths[pathToMerge].put.tags = this.apiDoc.paths[pathToMerge].put.tags || [];
this.apiDoc.paths[pathToMerge].put.tags.push(tagArg);
}
if (this.apiDoc.paths[pathToMerge].delete) {
this.apiDoc.paths[pathToMerge].delete.tags = this.apiDoc.paths[pathToMerge].delete.tags || [];
this.apiDoc.paths[pathToMerge].delete.tags.push(tagArg);
}
}
} }
// merge tag groups // merge tag groups
@ -75,12 +107,17 @@ export class Smartswagger {
} }
} }
console.log('merged!'); console.log('merged!');
// set custom tag arg.
if (tagArg) {
this.apiDoc['x-tagGroups'].push({name: tagArg, tags: [tagArg]});
}
} }
/** /**
* merges a document from url * merges a document from url
*/ */
public async mergeDocumentFromUrl(documentUrlArg: string, basePathArg: string = '') { public async mergeDocumentFromUrl(documentUrlArg: string, basePathArg: string = '', tagArg?: string) {
console.log(`getting document at ${documentUrlArg} for merging...`); console.log(`getting document at ${documentUrlArg} for merging...`);
const documentResponse = await plugins.nodeFetch(documentUrlArg, { const documentResponse = await plugins.nodeFetch(documentUrlArg, {
headers: { headers: {
@ -90,17 +127,17 @@ export class Smartswagger {
const documentString = await documentResponse.text(); const documentString = await documentResponse.text();
const apiDoc: IExtendedApiDoc = JSON.parse(documentString); const apiDoc: IExtendedApiDoc = JSON.parse(documentString);
console.log(`document successfully fetched!`); console.log(`document successfully fetched!`);
await this.mergeDocument(apiDoc, basePathArg); await this.mergeDocument(apiDoc, basePathArg, tagArg);
} }
/** /**
* merge multiple documents in parallel * merge multiple documents in parallel
* @param urlArrayArg * @param urlArrayArg
*/ */
public async mergeManyDocumentsFromUrl(urlArrayArg: { url: string; basePath: string }[]) { public async mergeManyDocumentsFromUrl(urlArrayArg: { url: string; basePath?: string, tagArg?: string }[]) {
const promiseArray: Promise<void>[] = []; const promiseArray: Promise<void>[] = [];
for (const urlArg of urlArrayArg) { for (const urlArg of urlArrayArg) {
promiseArray.push(this.mergeDocumentFromUrl(urlArg.url, urlArg.basePath)); promiseArray.push(this.mergeDocumentFromUrl(urlArg.url, urlArg.basePath, urlArg.tagArg));
} }
await Promise.all(promiseArray); await Promise.all(promiseArray);
} }