diff --git a/nodejs-server/README.md b/nodejs-server/README.md new file mode 100644 index 00000000..a4acae25 --- /dev/null +++ b/nodejs-server/README.md @@ -0,0 +1,23 @@ +# Swagger generated server + +## Overview +This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the [OpenAPI-Spec](https://github.com/OAI/OpenAPI-Specification) from a remote server, you can easily generate a server stub. This is an example of building a node.js server. + +This example uses the [expressjs](http://expressjs.com/) framework. To see how to make this your own, look here: + +[README](https://github.com/swagger-api/swagger-codegen/blob/master/README.md) + +### Running the server +To run the server, run: + +``` +npm start +``` + +To view the Swagger UI interface: + +``` +open http://localhost:8080/docs +``` + +This project leverages the mega-awesome [swagger-tools](https://github.com/apigee-127/swagger-tools) middleware which does most all the work. diff --git a/nodejs-server/api/swagger.yaml b/nodejs-server/api/swagger.yaml new file mode 100644 index 00000000..c43f40aa --- /dev/null +++ b/nodejs-server/api/swagger.yaml @@ -0,0 +1,123 @@ +--- +swagger: "2.0" +info: + description: "This is a simple API" + version: "1.0.0" + title: "Simple Inventory API" + contact: + email: "you@your-company.com" + license: + name: "Apache 2.0" + url: "http://www.apache.org/licenses/LICENSE-2.0.html" +host: "virtserver.swaggerhub.com" +basePath: "/erichilarysmithsr/Yellowscreen/1.0.0" +tags: +- name: "admins" + description: "Secured Admin-only calls" +- name: "developers" + description: "Operations available to regular developers" +schemes: +- "https" +paths: + /inventory: + get: + tags: + - "developers" + summary: "searches inventory" + description: "By passing in the appropriate options, you can search for\navailable\ + \ inventory in the system\n" + operationId: "searchInventory" + produces: + - "application/json" + parameters: + - name: "searchString" + in: "query" + description: "pass an optional search string for looking up inventory" + required: false + type: "string" + - name: "skip" + in: "query" + description: "number of records to skip for pagination" + required: false + type: "integer" + minimum: 0 + format: "int32" + - name: "limit" + in: "query" + description: "maximum number of records to return" + required: false + type: "integer" + maximum: 50 + minimum: 0 + format: "int32" + responses: + 200: + description: "search results matching criteria" + schema: + type: "array" + items: + $ref: "#/definitions/InventoryItem" + 400: + description: "bad input parameter" + x-swagger-router-controller: "Developers" + post: + tags: + - "admins" + summary: "adds an inventory item" + description: "Adds an item to the system" + operationId: "addInventory" + consumes: + - "application/json" + produces: + - "application/json" + parameters: + - in: "body" + name: "inventoryItem" + description: "Inventory item to add" + required: false + schema: + $ref: "#/definitions/InventoryItem" + responses: + 201: + description: "item created" + 400: + description: "invalid input, object invalid" + 409: + description: "an existing item already exists" + x-swagger-router-controller: "Admins" +definitions: + InventoryItem: + type: "object" + required: + - "id" + - "manufacturer" + - "name" + - "releaseDate" + properties: + id: + type: "string" + format: "uuid" + example: "d290f1ee-6c54-4b01-90e6-d701748f0851" + name: + type: "string" + example: "Widget Adapter" + releaseDate: + type: "string" + format: "int32" + example: "2016-08-29T09:12:33.001Z" + manufacturer: + $ref: "#/definitions/Manufacturer" + Manufacturer: + required: + - "name" + properties: + name: + type: "string" + example: "ACME Corporation" + homePage: + type: "string" + format: "url" + example: "https://www.acme-corp.com" + phone: + type: "string" + example: "408-867-5309" diff --git a/nodejs-server/controllers/Admins.js b/nodejs-server/controllers/Admins.js new file mode 100644 index 00000000..b917596c --- /dev/null +++ b/nodejs-server/controllers/Admins.js @@ -0,0 +1,11 @@ +'use strict'; + +var url = require('url'); + + +var Admins = require('./AdminsService'); + + +module.exports.addInventory = function addInventory (req, res, next) { + Admins.addInventory(req.swagger.params, res, next); +}; diff --git a/nodejs-server/controllers/AdminsService.js b/nodejs-server/controllers/AdminsService.js new file mode 100644 index 00000000..f580c8c2 --- /dev/null +++ b/nodejs-server/controllers/AdminsService.js @@ -0,0 +1,11 @@ +'use strict'; + +exports.addInventory = function(args, res, next) { + /** + * parameters expected in the args: + * inventoryItem (InventoryItem) + **/ + // no response value expected for this operation + res.end(); +} + diff --git a/nodejs-server/controllers/Developers.js b/nodejs-server/controllers/Developers.js new file mode 100644 index 00000000..18a325c1 --- /dev/null +++ b/nodejs-server/controllers/Developers.js @@ -0,0 +1,11 @@ +'use strict'; + +var url = require('url'); + + +var Developers = require('./DevelopersService'); + + +module.exports.searchInventory = function searchInventory (req, res, next) { + Developers.searchInventory(req.swagger.params, res, next); +}; diff --git a/nodejs-server/controllers/DevelopersService.js b/nodejs-server/controllers/DevelopersService.js new file mode 100644 index 00000000..a9e165d2 --- /dev/null +++ b/nodejs-server/controllers/DevelopersService.js @@ -0,0 +1,30 @@ +'use strict'; + +exports.searchInventory = function(args, res, next) { + /** + * parameters expected in the args: + * searchString (String) + * skip (Integer) + * limit (Integer) + **/ + var examples = {}; + examples['application/json'] = [ { + "releaseDate" : "2016-08-29T09:12:33.001Z", + "name" : "Widget Adapter", + "id" : "d290f1ee-6c54-4b01-90e6-d701748f0851", + "manufacturer" : { + "phone" : "408-867-5309", + "name" : "ACME Corporation", + "homePage" : "https://www.acme-corp.com" + } +} ]; + if(Object.keys(examples).length > 0) { + res.setHeader('Content-Type', 'application/json'); + res.end(JSON.stringify(examples[Object.keys(examples)[0]] || {}, null, 2)); + } + else { + res.end(); + } + +} + diff --git a/nodejs-server/index.js b/nodejs-server/index.js new file mode 100644 index 00000000..aaa873a1 --- /dev/null +++ b/nodejs-server/index.js @@ -0,0 +1,40 @@ +'use strict'; + +var app = require('connect')(); +var http = require('http'); +var swaggerTools = require('swagger-tools'); +var jsyaml = require('js-yaml'); +var fs = require('fs'); +var serverPort = 8080; + +// swaggerRouter configuration +var options = { + swaggerUi: '/swagger.json', + controllers: './controllers', + useStubs: process.env.NODE_ENV === 'development' ? true : false // Conditionally turn on stubs (mock mode) +}; + +// The Swagger document (require it, build it programmatically, fetch it from a URL, ...) +var spec = fs.readFileSync('./api/swagger.yaml', 'utf8'); +var swaggerDoc = jsyaml.safeLoad(spec); + +// Initialize the Swagger middleware +swaggerTools.initializeMiddleware(swaggerDoc, function (middleware) { + // Interpret Swagger resources and attach metadata to request - must be first in swagger-tools middleware chain + app.use(middleware.swaggerMetadata()); + + // Validate Swagger requests + app.use(middleware.swaggerValidator()); + + // Route validated requests to appropriate controller + app.use(middleware.swaggerRouter(options)); + + // Serve the Swagger documents and Swagger UI + app.use(middleware.swaggerUi()); + + // Start the server + http.createServer(app).listen(serverPort, function () { + console.log('Your server is listening on port %d (http://localhost:%d)', serverPort, serverPort); + console.log('Swagger-ui is available on http://localhost:%d/docs', serverPort); + }); +}); diff --git a/nodejs-server/package.json b/nodejs-server/package.json new file mode 100644 index 00000000..b38b1759 --- /dev/null +++ b/nodejs-server/package.json @@ -0,0 +1,20 @@ +{ + "name": "simple-inventory-api", + "version": "1.0.0", + "description": "This is a simple API", + "main": "index.js", + "scripts": { + "prestart": "npm install", + "start": "node index.js" + }, + "keywords": [ + "swagger" + ], + "license": "Apache-2.0", + "private": true, + "dependencies": { + "connect": "^3.2.0", + "js-yaml": "^3.3.0", + "swagger-tools": "0.10.1" + } +} diff --git a/package.json b/package.json index 493a144c..a2abb57c 100644 --- a/package.json +++ b/package.json @@ -9,14 +9,28 @@ "preferGlobal": false, "repository": "git://github.com/chjj/tty.js.git", "homepage": "https://github.com/chjj/tty.js", - "bugs": { "url": "https://github.com/chjj/tty.js/issues" }, - "keywords": ["tty", "terminal", "term", "xterm"], - "tags": ["tty", "terminal", "term", "xterm"], + "bugs": { + "url": "https://github.com/chjj/tty.js/issues" + }, + "keywords": [ + "tty", + "terminal", + "term", + "xterm" + ], + "tags": [ + "tty", + "terminal", + "term", + "xterm" + ], "dependencies": { - "express": "3.4.4", - "socket.io": "0.9.16", + "express": "4.0.0", + "socket.io": "1.0.1", "pty.js": "0.2.4", "term.js": "0.0.3" }, - "engines": { "node": ">= 0.8.0" } -} + "engines": { + "node": ">= 0.8.0" + } +} \ No newline at end of file