Skip to content

Commit

Permalink
upgrading modules, adding overiddes for responseMessages, description…
Browse files Browse the repository at this point in the history
…, consumes, produces, version
  • Loading branch information
AndrewKeig committed Sep 25, 2014
1 parent 55de68e commit ec2f34a
Show file tree
Hide file tree
Showing 11 changed files with 122 additions and 114 deletions.
Binary file modified .DS_Store
Binary file not shown.
51 changes: 16 additions & 35 deletions lib/swagger/api.js
@@ -1,31 +1,10 @@
var jsonFile = require('json-file-plus')
, path = require('path')
, url = require('url')
, _ = require('underscore')
, _ = require('lodash')
, utils = require('./utils')
, indexfile = require('./index');

var getErrors = function(){
var errors = [
{
code: 401,
reason: "Unauthorised"
},
{
code: 400,
reason: "Bad request"
},
{
code: 404,
reason: "Not Found"
},
{
code: 500,
reason: "An internal server error"
}
];
};

var createParametersAndModels = function(validation, name, method){
if (!validation) return [];
var parameters = [];
Expand Down Expand Up @@ -90,7 +69,7 @@ var createParametersAndModels = function(validation, name, method){
if (items) models = { properties : items };

var model = {
name: utils.capitalise(name) + utils.capitalise(method),
name: 'body',
description: utils.capitalise(name),
paramType: "body",
required: true,
Expand Down Expand Up @@ -138,12 +117,12 @@ var createApis = function(model){
path: path,
operations: [{
httpMethod: route.method.toUpperCase(),
summary: "An api for " + route.method + ' ' + route.page,
nickname: utils.capitalise(route.method) + utils.capitalise(route.page),
consumes: [ "application/json" ],
produces: [ "application/json" ],
summary: route.options && route.options.description ? route.options.description : "An api for " + route.method + ' ' + route.route,
nickname: utils.capitalise(route.route),
consumes: route.options && route.options.consumes ? route.options.consumes : [ "application/json" ],
produces: route.options && route.options.produces ? route.options.produces : [ "application/json" ],
parameters : response.parameters,
errorResponses: getErrors()
responseMessages: route.options && route.options.responseMessages ? route.options.responseMessages : []
}]
};

Expand All @@ -154,22 +133,24 @@ var createApis = function(model){
return { apis : apis, models : models};
};

var apifile = function(routes, resources){
var apifile = function(config){

var pages = _.uniq(_.pluck(routes, 'page'));
var routes = _.uniq(_.pluck(config.routes, 'route'));

routes.forEach(function(route){
var routeForPage = _.filter(config.routes, function(item){ return item.route == route; });

pages.forEach(function(page){
var routeForPage = _.filter(routes, function(item){ return item.page == page; });
var response = createApis(routeForPage);
var template = path.join(__dirname, '/templates/api.json');
var version = config.options && config.options.version ? config.options.version : '0.0.1' ;

jsonFile(template, function (err, file) {
if (err) console.log(err);
file.set({ apiVersion: '0.0.1' });
file.set({ apiVersion: version });
file.set({ swaggerVersion: '1.2.5' });
file.set({ apis: response.apis});
file.set({ apis: response.apis });
file.set({ models: response.models });
file.filename = path.join(process.cwd(), resources + page + '.json');
file.filename = path.join(process.cwd(), config.resources + route + '.json');
file.save();
});
});
Expand Down
31 changes: 12 additions & 19 deletions lib/swagger/index.js
@@ -1,33 +1,26 @@
var path = require('path')
, _ = require('underscore')
, _ = require('lodash')
, jsonFile = require('json-file-plus')
, utils = require('./utils');

var indexfile = function(routes, resources){
var pages = _.uniq(_.pluck(routes, 'page'));
var indexfile = function(config){
var routes = _.uniq(_.pluck(config.routes, 'route'));
var template = path.join(__dirname, '/templates/index.json');
var apis = [];

var createApis = function(pages){
var apis = [];

pages.forEach(function(page){
var operation = {
path: "/api-docs.json/" + page,
description: utils.capitalise(page) + " API"
};

apis.push(operation);
routes.forEach(function(route){
apis.push({
path: "/api-docs.json/" + route,
description: utils.capitalise(route) + " API"
});

return apis;
};
});

jsonFile(template, function (err, file) {
if (err) console.log(err);
file.set({ apiVersion: '0.0.1' });
file.set({ apiVersion: config.version || '0.0.1' });
file.set({ swaggerVersion: '1.2.5' });
file.set({ apis: createApis(pages) });
file.filename = path.join(process.cwd(), resources + '/index.json');
file.set({ apis: apis });
file.filename = path.join(process.cwd(), config.resources + '/index.json');
file.save();
});
};
Expand Down
24 changes: 12 additions & 12 deletions lib/swagger/main.js
@@ -1,24 +1,24 @@
var _ = require('underscore')
var _ = require('lodash')
, routing = require('./routes')
, apifile = require('./api')
, indexfile = require('./index');

function swagger(app, options) {
if (!options.title) throw new Error('Please provide a title');
if (!options.statics) throw new Error('Please specify the location of the swagger ui');
if (!options.resources) throw new Error('Please sepecify where you would like to store your swagger resources');
if (!options.applicationUrl) throw new Error('Please specify the url which hosts your swagger resources');
if (!options.routes) throw new Error('Please provide a list of routes to swagger enable');
function swagger(app, config) {
if (!config.title) throw new Error('Please provide a title');
if (!config.statics) throw new Error('Please specify the location of the swagger ui');
if (!config.resources) throw new Error('Please sepecify where you would like to store your swagger resources');
if (!config.applicationUrl) throw new Error('Please specify the url which hosts your swagger resources');
if (!config.routes) throw new Error('Please provide a list of routes to swagger enable');

options.routes.forEach(function(route){
if (!route.page) throw new Error('Please provide a page for route', route);
config.routes.forEach(function(route){
if (!route.route) throw new Error('Please provide a route name', route);
if (!route.method) throw new Error('Please provide a method for route', route);
if (!route.path) throw new Error('Please provide a path for route', route);
});

apifile(options.routes, options.resources);
indexfile(options.routes, options.resources);
routing(app, options);
indexfile(config);
apifile(config);
routing(app, config);
}

module.exports = swagger;
22 changes: 11 additions & 11 deletions lib/swagger/routes.js
@@ -1,28 +1,28 @@
var express = require('express')
, path = require('path');

var swaggerRoutes = function(app, options) {
app.use('/', express.static(process.cwd() + options.statics));
var swaggerRoutes = function(app, config) {
app.use('/', express.static(process.cwd() + config.statics));

app.get('/api-docs.json', function (req, res, next) {
var models = require(path.join(process.cwd(), options.resources) + 'index.json');
models.basePath = options.applicationUrl;
res.json(200, models);
var models = require(path.join(process.cwd(), config.resources) + 'index.json');
models.basePath = config.applicationUrl;
res.status(200).json(models);
});

app.get('/api-docs.json/:resource', function (req, res, next) {
var models = require(path.join(process.cwd(), options.resources) + req.params.resource + '.json');
models.basePath = options.applicationUrl;
res.json(200, models);
var models = require(path.join(process.cwd(), config.resources) + req.params.resource + '.json');
models.basePath = config.applicationUrl;
res.status(200).json(models);
});

app.get(/^\/swagger(\/.*)?$/, function (req, res, next) {
var model = {
title: options.title,
applicationUrl: options.applicationUrl + '/api-docs.json'
title: config.title,
applicationUrl: config.applicationUrl + '/api-docs.json'
};

res.render(process.cwd() + options.statics + 'index', model);
res.render(process.cwd() + config.statics + 'index', model);
});
};

Expand Down
28 changes: 14 additions & 14 deletions package.json
@@ -1,7 +1,7 @@
{
"name": "express-validation-swagger",
"version": "0.1.3",
"description": "express-validation-swagger generates a swagger enabled client using simple conventions.",
"version": "0.1.5",
"description": "express-validation-swagger generates a V1 swagger enabled client using simple conventions.",
"homepage": "https://github.com/andrewkeig/express-validation-swagger",
"author": {
"name": "Andrew Keig",
Expand All @@ -12,20 +12,20 @@
"url": "git://github.com/andrewkeig/express-validation-swagger.git"
},
"dependencies": {
"express": ">=3.4.0",
"json-file-plus": ">=0.2.3",
"underscore": ">=1.6.0"
"consolidate": "^0.10.0",
"express": "^4.9.5",
"json-file-plus": "^1.0.7",
"lodash": "^2.4.1"
},
"devDependencies": {
"consolidate": "~0.9.1",
"handlebars": "~1.0.12",
"grunt": "~0.4.1",
"request": "~2.27.0",
"grunt-cafe-mocha": "~0.1.9",
"grunt-contrib-jshint": "~0.6.4",
"joi": "~2.7.0",
"async": "~0.2.10",
"express-validation": "~0.1.6"
"body-parser": "^1.9.0",
"express-validation": "^0.2.4",
"grunt": "^0.4.5",
"grunt-cafe-mocha": "^0.1.13",
"grunt-contrib-jshint": "^0.10.0",
"handlebars": "^2.0.0",
"joi": "^4.7.0",
"request": "^2.44.0"
},
"keywords": [
"swagger",
Expand Down
Binary file added test/.DS_Store
Binary file not shown.
43 changes: 30 additions & 13 deletions test/app.js
@@ -1,6 +1,7 @@
var express = require('express')
, cons = require('consolidate')
, http = require('http')
, bodyParser = require('body-parser')
, swagger = require('../lib/swagger/main')
, validate = require('express-validation')
, Joi = require('joi')
Expand All @@ -9,15 +10,16 @@ var express = require('express')
app.engine('html', cons.handlebars);
app.set('view engine', 'html');
app.set('views', 'public');
app.use(bodyParser.json())

var validation = {
user : {
get : {
headers: { userid : Joi.string().required().regex(/^[0-9a-fA-F]{24}$/) }
},
post : {
headers: { userid : Joi.string().required().regex(/^[0-9a-fA-F]{24}$/) }
, body: { username : Joi.string().required() }
headers: { userid : Joi.string().required().regex(/^[0-9a-fA-F]{24}$/) },
body: { username : Joi.string().required() }
},
del : {
headers: { userid : Joi.string().required().regex(/^[0-9a-fA-F]{24}$/) }
Expand All @@ -32,41 +34,56 @@ var services = {
user : {
get : function (req, res, next) {
var user = { "userId" : "530d1d22be018c1121025be1", "name" : "airasoul" };
res.json(200, user);
res.status(200).json(user)
},
post : function (req, res, next) {
var user = { "userId" : "530d1d22be018c1121025be1", "name" : "airasoul" };
res.json(201, user);
res.status(200).json(user)
},
del : function (req, res, next) {
var user = { "userId" : "530d1d22be018c1121025be1", "name" : "airasoul" };
res.json(204, user);
res.status(200).json(user)
},
put : function (req, res, next) {
var user = { "userId" : "530d1d22be018c1121025be1", "name" : "airasoul" };
res.json(204, user);
res.status(200).json(user)
}
}
}

app.get('/user', validate(validation.user.get), services.user.get);
app.post('/user', validate(validation.user.post), services.user.post );
app.del('/user', validate(validation.user.del), services.user.del);
app.delete('/user', validate(validation.user.del), services.user.del);
app.put('/user', validate(validation.user.put), services.user.put);

swagger(app, {
title : 'express validation swagger',
title : 'swagger api',
statics : '/test/public/swagger/',
resources : '/test/swagger/',
applicationUrl : 'http://127.0.0.1:3000',
version : '0.1.5',
routes : [
{ page : 'user', method : 'GET', path: '/user', validation : validation.user.get },
{ page : 'user', method : 'POST', path: '/user', validation : validation.user.post },
{ page : 'user', method : 'DELETE', path: '/user', validation : validation.user.del },
{ page : 'user', method : 'PUT', path: '/user', validation : validation.user.put }
{
route : 'user',
method : 'GET',
path: '/user',
validation : validation.user.get,
options : {
responseMessages : [
{code: 500, message: "Internal server error"},
{code: 400, message: "Bad request" },
{code: 404, message: "Not found" }
],
description : 'get a user by user id',
consumes : ["application/json"],
produces : ["application/json"]
}
},
{ route : 'user', method : 'POST', path: '/user', validation : validation.user.post },
{ route : 'user', method : 'DELETE', path: '/user', validation : validation.user.del },
{ route : 'user', method : 'PUT', path: '/user', validation : validation.user.put }
]
});

app.use(app.router);
http.createServer(app).listen(3000);
module.exports = app;
Binary file added test/swagger/.DS_Store
Binary file not shown.
2 changes: 1 addition & 1 deletion test/swagger/index.json
@@ -1,5 +1,5 @@
{
"apiVersion": "0.0.1",
"apiVersion": "0.1.5",
"swaggerVersion": "1.2.5",
"basePath": "",
"apis": [
Expand Down

0 comments on commit ec2f34a

Please sign in to comment.