import * as _ from "lodash"; import {IChassisContext, IChassisMiddleware, IOperation, Utils } from "../index"; // import * as request from "request"; import { OpenAPIPlugin } from "../plugins"; import { Schemas, OpenAPI } from "../openapi"; import { APIs } from "../helpers"; /** * plugin to handle JSON body * * @param context * @param options * @returns {exports} */ export default class DataDictMiddleware implements IChassisMiddleware { name = "datadict"; constructor() { } fn(oper: IOperation, _options: any): Function { if (_options.url) { return this.remote_openapi(oper,_options); } else { return this.local_openapi(oper,_options); } } local_openapi(oper: IOperation, _options: any): Function { let context: IChassisContext = oper.context; let plugin = context.plugins.get("openapi") as OpenAPIPlugin; // let options = _.extend({}, this.options, _options); let registry: Schemas = plugin.openapi.schemas; let api_url = _options.url; context.log( { code: "api:datadict:local", url: api_url }); return ( (req, res) => { let params = _.extend({ id: true, ref: true }, req.params, req.query, _options.params ); let schemas = registry.all( params ); res.status(200); res.send(schemas); }); } remote_openapi(oper: IOperation, _options: any): Function { let context: IChassisContext = oper.context; // let options = _.extend({}, this.options, _options); let api_url = _options.url; context.log( { code: "api:datadict:remote", url: api_url }); return ( (req, res) => { let params = _.extend({ id: true, ref: true }, req.params, req.query, _options.params ); context.log( { code: "api:datadict:request", url: api_url }); APIs.request( context, api_url).then( reply => { let body_spec = JSON.parse(reply.body); let openapi = new OpenAPI(context); openapi.load(body_spec); let registry: Schemas = openapi.schemas; let schemas = registry.all( params ); res.status(200); res.send(schemas); }).catch( err => { Utils.sendError(oper.context, res, { code: "api:datadict:remote:schemas", message: err.message, error: err}); }) }); } }