forked from loafle/openapi-generator-original
* create nodejs express esrver * 1st commit of the express.js module. Express server working, api-docs loads properly. No real paths yet * 1st commit of the express.js module. Express server working, api-docs loads properly. No real paths yet (#2839) * Working Express server with successful routing to controllers. * rewrote controllers and services. Haven't tested yet * controllers and services have passed tests successfully * Added documentation * Added documentation * Support for openApi v3, using 'express-openapi-validator' for parsing and validation, and an internal router to pass arguments to controllers and services. /controllers/Pet.js and /services/PetService.js should be used for reverse engineering for future codegen script * update generator and template * update samples * more update * update service, controller * add vendor extensions * some updates to adapt to changes in the generator (removing references to swager); some work on handling file uploads; some work on tests * Update NodeJS server generator and templates based on new output (#3261) * update generator and template * update samples * more update * update service, controller * add vendor extensions * update doc * Changed routing code to follow the following convention: Each path operation has a 'x-openapi-router-controller' and 'x-openapi-router-service'. Automated files will be placed under /controllers and /services respectively. Controller file names will end with 'Controller.js'. Removed swaggerRouter, replaced it with openapiRouter Routing works and simple tests show a return of 200 to requests. * [nodejs-express-server] various updates, fixes (#3319) * various fix * remove dot from service * add space * better method empty argument * remove test service (#3379) * add new doc * 1. routingTests.js runs through all operations described in openapi.yaml and tries calling them, expecting 200 in return. Currently not all tests pass - not supporting xml, and problems with formData 2. Removed old testing files. 3. Added model files - contain data and structure as defined in openapi.yaml. Model.js has static methods relevant to all model files. 4. Changed openapi.yaml to allow running tests easily. * 1. routingTests.js runs through all operations described in openapi.yaml and tries calling them, expecting 200 in return. Currently not all tests pass - not supporting xml, and problems with formData (#3442) 2. Removed old testing files. 3. Added model files - contain data and structure as defined in openapi.yaml. Model.js has static methods relevant to all model files. 4. Changed openapi.yaml to allow running tests easily. * added model classes. Currently as a concept only. Seems like won't be in use * Updated README.md to be a detailed description of the project. Removed test files that are not needed. Removed utils/writer.js which is not needed, and the references to it in the codegen files * Removed redundant file app.js - this file has no benefit at this point. index.js now calls ExpressServer.js directly. Updated files that used to call app.js. Updated README.md accordingly Added a path to call the openapi.yaml, and a test file for all endpoints that are not in the openapi.yaml, ensuring that they return 200. Updated README.md accordingly * Remove test controller (#3575) * remove test controller * add back changes to templates * remove app.js * update wording
68 lines
2.6 KiB
JavaScript
68 lines
2.6 KiB
JavaScript
const logger = require('../logger');
|
|
const controllers = require('../controllers');
|
|
const Services = require('../services');
|
|
|
|
function handleError(err, request, response, next) {
|
|
logger.error(err);
|
|
const code = err.code || 400;
|
|
response.status(code);
|
|
response.error = err;
|
|
next(JSON.stringify({
|
|
code,
|
|
error: err,
|
|
}));
|
|
}
|
|
|
|
/**
|
|
* The purpose of this route is to collect the request variables as defined in the
|
|
* OpenAPI document and pass them to the handling controller as another Express
|
|
* middleware. All parameters are collected in the requet.swagger.values key-value object
|
|
*
|
|
* The assumption is that security handlers have already verified and allowed access
|
|
* to this path. If the business-logic of a particular path is dependant on authentication
|
|
* parameters (e.g. scope checking) - it is recommended to define the authentication header
|
|
* as one of the parameters expected in the OpenAPI/Swagger document.
|
|
*
|
|
* Requests made to paths that are not in the OpernAPI scope
|
|
* are passed on to the next middleware handler.
|
|
* @returns {Function}
|
|
*/
|
|
function openApiRouter() {
|
|
return async (request, response, next) => {
|
|
try {
|
|
/**
|
|
* This middleware runs after a previous process have applied an openapi object
|
|
* to the request.
|
|
* If none was applied This is because the path requested is not in the schema.
|
|
* If there's no openapi object, we have nothing to do, and pass on to next middleware.
|
|
*/
|
|
if (request.openapi === undefined
|
|
|| request.openapi.schema === undefined
|
|
) {
|
|
next();
|
|
return;
|
|
}
|
|
// request.swagger.paramValues = {};
|
|
// request.swagger.params.forEach((param) => {
|
|
// request.swagger.paramValues[param.name] = getValueFromRequest(request, param);
|
|
// });
|
|
const controllerName = request.openapi.schema['x-openapi-router-controller'];
|
|
const serviceName = request.openapi.schema['x-openapi-router-service'];
|
|
if (!controllers[controllerName] || controllers[controllerName] === undefined) {
|
|
handleError(`request sent to controller '${controllerName}' which has not been defined`,
|
|
request, response, next);
|
|
} else {
|
|
const apiController = new controllers[controllerName](Services[serviceName]);
|
|
const controllerOperation = request.openapi.schema.operationId;
|
|
await apiController[controllerOperation](request, response, next);
|
|
}
|
|
} catch (error) {
|
|
console.error(error);
|
|
const err = { code: 500, error: error.message };
|
|
handleError(err, request, response, next);
|
|
}
|
|
};
|
|
}
|
|
|
|
module.exports = openApiRouter;
|