forked from loafle/openapi-generator-original
Add a new NodeJS Express server generator (#3567)
* 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
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
const logger = require('../logger');
|
||||
|
||||
class Controller {
|
||||
static sendResponse(response, payload) {
|
||||
/**
|
||||
* The default response-code is 200. We want to allow to change that. in That case,
|
||||
* payload will be an object consisting of a code and a payload. If not customized
|
||||
* send 200 and the payload as received in this method.
|
||||
*/
|
||||
response.status(payload.code || 200);
|
||||
const responsePayload = payload.payload !== undefined ? payload.payload : payload;
|
||||
if (responsePayload instanceof Object) {
|
||||
response.json(responsePayload);
|
||||
} else {
|
||||
response.end(responsePayload);
|
||||
}
|
||||
}
|
||||
|
||||
static sendError(response, error) {
|
||||
response.status(error.code || 500);
|
||||
if (error.error instanceof Object) {
|
||||
response.json(error.error);
|
||||
} else {
|
||||
response.end(error.error || error.message);
|
||||
}
|
||||
}
|
||||
|
||||
static collectFiles(request) {
|
||||
logger.info('Checking if files are expected in schema');
|
||||
if (request.openapi.schema.requestBody !== undefined) {
|
||||
const [contentType] = request.headers['content-type'].split(';');
|
||||
if (contentType === 'multipart/form-data') {
|
||||
const contentSchema = request.openapi.schema.requestBody.content[contentType].schema;
|
||||
Object.entries(contentSchema.properties).forEach(([name, property]) => {
|
||||
if (property.type === 'string' && ['binary', 'base64'].indexOf(property.format) > -1) {
|
||||
request.body[name] = request.files.find(file => file.fieldname === name);
|
||||
}
|
||||
});
|
||||
} else if (request.openapi.schema.requestBody.content[contentType] !== undefined
|
||||
&& request.files !== undefined) {
|
||||
[request.body] = request.files;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static collectRequestParams(request) {
|
||||
this.collectFiles(request);
|
||||
const requestParams = {};
|
||||
if (request.openapi.schema.requestBody !== undefined) {
|
||||
requestParams.body = request.body;
|
||||
}
|
||||
request.openapi.schema.parameters.forEach((param) => {
|
||||
if (param.in === 'path') {
|
||||
requestParams[param.name] = request.openapi.pathParams[param.name];
|
||||
} else if (param.in === 'query') {
|
||||
requestParams[param.name] = request.query[param.name];
|
||||
}
|
||||
});
|
||||
return requestParams;
|
||||
}
|
||||
|
||||
static async handleRequest(request, response, serviceOperation) {
|
||||
try {
|
||||
const serviceResponse = await serviceOperation(this.collectRequestParams(request));
|
||||
Controller.sendResponse(response, serviceResponse);
|
||||
} catch (error) {
|
||||
Controller.sendError(response, error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = Controller;
|
||||
@@ -0,0 +1,42 @@
|
||||
const Controller = require('./Controller');
|
||||
|
||||
class PetController {
|
||||
constructor(Service) {
|
||||
this.service = Service;
|
||||
}
|
||||
|
||||
async addPet(request, response) {
|
||||
await Controller.handleRequest(request, response, this.service.addPet);
|
||||
}
|
||||
|
||||
async deletePet(request, response) {
|
||||
await Controller.handleRequest(request, response, this.service.deletePet);
|
||||
}
|
||||
|
||||
async findPetsByStatus(request, response) {
|
||||
await Controller.handleRequest(request, response, this.service.findPetsByStatus);
|
||||
}
|
||||
|
||||
async findPetsByTags(request, response) {
|
||||
await Controller.handleRequest(request, response, this.service.findPetsByTags);
|
||||
}
|
||||
|
||||
async getPetById(request, response) {
|
||||
await Controller.handleRequest(request, response, this.service.getPetById);
|
||||
}
|
||||
|
||||
async updatePet(request, response) {
|
||||
await Controller.handleRequest(request, response, this.service.updatePet);
|
||||
}
|
||||
|
||||
async updatePetWithForm(request, response) {
|
||||
await Controller.handleRequest(request, response, this.service.updatePetWithForm);
|
||||
}
|
||||
|
||||
async uploadFile(request, response) {
|
||||
await Controller.handleRequest(request, response, this.service.uploadFile);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
module.exports = PetController;
|
||||
@@ -0,0 +1,26 @@
|
||||
const Controller = require('./Controller');
|
||||
|
||||
class StoreController {
|
||||
constructor(Service) {
|
||||
this.service = Service;
|
||||
}
|
||||
|
||||
async deleteOrder(request, response) {
|
||||
await Controller.handleRequest(request, response, this.service.deleteOrder);
|
||||
}
|
||||
|
||||
async getInventory(request, response) {
|
||||
await Controller.handleRequest(request, response, this.service.getInventory);
|
||||
}
|
||||
|
||||
async getOrderById(request, response) {
|
||||
await Controller.handleRequest(request, response, this.service.getOrderById);
|
||||
}
|
||||
|
||||
async placeOrder(request, response) {
|
||||
await Controller.handleRequest(request, response, this.service.placeOrder);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
module.exports = StoreController;
|
||||
@@ -0,0 +1,42 @@
|
||||
const Controller = require('./Controller');
|
||||
|
||||
class UserController {
|
||||
constructor(Service) {
|
||||
this.service = Service;
|
||||
}
|
||||
|
||||
async createUser(request, response) {
|
||||
await Controller.handleRequest(request, response, this.service.createUser);
|
||||
}
|
||||
|
||||
async createUsersWithArrayInput(request, response) {
|
||||
await Controller.handleRequest(request, response, this.service.createUsersWithArrayInput);
|
||||
}
|
||||
|
||||
async createUsersWithListInput(request, response) {
|
||||
await Controller.handleRequest(request, response, this.service.createUsersWithListInput);
|
||||
}
|
||||
|
||||
async deleteUser(request, response) {
|
||||
await Controller.handleRequest(request, response, this.service.deleteUser);
|
||||
}
|
||||
|
||||
async getUserByName(request, response) {
|
||||
await Controller.handleRequest(request, response, this.service.getUserByName);
|
||||
}
|
||||
|
||||
async loginUser(request, response) {
|
||||
await Controller.handleRequest(request, response, this.service.loginUser);
|
||||
}
|
||||
|
||||
async logoutUser(request, response) {
|
||||
await Controller.handleRequest(request, response, this.service.logoutUser);
|
||||
}
|
||||
|
||||
async updateUser(request, response) {
|
||||
await Controller.handleRequest(request, response, this.service.updateUser);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
module.exports = UserController;
|
||||
@@ -0,0 +1,9 @@
|
||||
const PetController = require('./PetController');
|
||||
const StoreController = require('./StoreController');
|
||||
const UserController = require('./UserController');
|
||||
|
||||
module.exports = {
|
||||
PetController,
|
||||
StoreController,
|
||||
UserController,
|
||||
};
|
||||
Reference in New Issue
Block a user