Skip to content

Commit d9ed5fa

Browse files
committed
did some router setup
1 parent 44c12c0 commit d9ed5fa

File tree

13 files changed

+217
-23
lines changed

13 files changed

+217
-23
lines changed

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,9 @@
55

66

77
API Development Template
8+
9+
10+
## ToDo
11+
12+
- Implement Helmet for security
13+
- Implement Express Limiter for limiting requests

app.js

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,21 +23,42 @@ if (cluster.isMaster && config.env === 'production') {
2323
} else {
2424
var express = require('express');
2525
var app = express();
26-
// var router = require('./routes');
27-
28-
if(config.trustProxy === 'yes'){
29-
app.enable('trust proxy');
30-
}
31-
32-
// app.use('/',router);
33-
34-
if(config.env === 'production'){
35-
log.info('Worker %d running!', cluster.worker.id);
36-
}
37-
38-
39-
app.listen(config.port, function () {
40-
log.info('listening on port '+config.port+'!');
41-
});
26+
var router = require('./routes');
27+
var helmet = require('helmet');
28+
var client = require('redis').createClient(config.redisURL);
29+
var limiter = require('express-limiter')(app, client);
30+
31+
if(config.trustProxy === 'yes'){
32+
app.enable('trust proxy');
33+
}
34+
35+
36+
app.use(helmet());
37+
// no client side caching
38+
if(config.noFrontendCaching === 'yes'){
39+
app.use(helmet.noCache());
40+
}
41+
42+
limiter({
43+
path: '*',
44+
method: 'all',
45+
lookup: 'userId',
46+
total: config.rateLimit * 1,
47+
expire: config.rateLimitExpiry * 1,
48+
onRateLimited: function (req, res, next) {
49+
next({ message: 'Rate limit exceeded', statusCode: 429 });
50+
}
51+
});
52+
53+
app.use('/',router);
54+
55+
if(config.env === 'production'){
56+
log.info('Worker %d running!', cluster.worker.id);
57+
}
58+
59+
60+
app.listen(config.port, function () {
61+
log.info('listening on port '+config.port+'!');
62+
});
4263

4364
}

config/development.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,9 @@ module.exports = {
66
bugsnagKey: process.env.BUGSNAG_KEY || false,
77
secureMode: process.env.SECURE_MODE || false,
88
secret: process.env.SECRET || 'lakikihdgdfdjjjdgd67264664vdjhjdyncmxuei8336%%^#%gdvdhj????jjhdghduue',
9-
mongoURL: process.env.MONGOLAB_URL || 'mongodb://192.168.99.100/snipe'
10-
};
9+
mongoURL: process.env.MONGOLAB_URL || 'mongodb://192.168.99.100/snipe',
10+
noFrontendCaching: process.env.NO_CACHE || 'yes',
11+
rateLimit: process.env.RATE_LIMIT || '180',
12+
rateLimitExpiry: process.env.RATE_LIMIT_EXPIRY || '3600000',
13+
redisURL: process.env.REDIS_URL || 'redis://192.168.99.100:6379/1'
14+
};

config/production.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,9 @@ module.exports = {
66
bugsnagKey: process.env.BUGSNAG_KEY || false,
77
secureMode: process.env.SECURE_MODE || true,
88
secret: process.env.SECRET || 'lakikihdgdfdjjjdgd67264660okjnbgtrdxswerfgytg373745ei8336%%^#%gdvdhj????jjhdghduue',
9-
mongoURL: process.env.MONGOLAB_URL || 'mongodb://192.168.99.100/snipe'
10-
};
9+
mongoURL: process.env.MONGOLAB_URL || 'mongodb://192.168.99.100/snipe',
10+
noFrontendCaching: process.env.NO_CACHE || 'yes',
11+
rateLimit: process.env.RATE_LIMIT || '180',
12+
rateLimitExpiry: process.env.RATE_LIMIT_EXPIRY || '3600000',
13+
redisURL: process.env.REDIS_URL || 'redis://192.168.99.100:6379/1'
14+
};

controllers/Initialize.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
"use strict";
2+
var encryption = require('../services/encryption');
3+
var config = require('../config');
4+
var debug = require('debug')('initialize');
5+
6+
module.exports = {
7+
init: function(req, res, next){
8+
encryption.generateKey()
9+
.then(function(resp){
10+
res.ok({'x-tag': resp});
11+
})
12+
.catch(function(err){
13+
next(err);
14+
});
15+
}
16+
};

controllers/Users.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
"use strict";
2+
3+
var Users = require('../models/Users');
4+
5+
var UsersController = {};
6+
7+
UsersController.find = function(query,projection,options){
8+
return Users.find(query,projection,options);
9+
};
10+
11+
UsersController.findOne = function(id,projection,options){
12+
return Users.findById(id,projection,options);
13+
};
14+
15+
UsersController.search = function(string){
16+
return Users.search(string);
17+
};
18+
19+
UsersController.create = function(data){
20+
return Users.create(data);
21+
};
22+
23+
UsersController.update = function(query, data){
24+
return Users.update(query,data);
25+
};
26+
27+
UsersController.updateOne = function(id, data){
28+
return Users.findByIdAndUpdate(id,data);
29+
};
30+
31+
UsersController.delete = function(query){
32+
return Users.deleteMany(query);
33+
};
34+
35+
UsersController.deleteOne = function(id){
36+
return Users.findByIdAndRemove(id);
37+
};
38+
39+
UsersController.count = function(query){
40+
return Users.count(query);
41+
};
42+
43+
module.exports = UsersController;

models/Users.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
"use strict";
22

33
var db = require('../services/database/mongo');
4-
var _ = require('lodash');
54

65
var collection = 'Users';
76

package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,18 @@
4040
"body-parser": "^1.17.1",
4141
"bugsnag": "^1.9.1",
4242
"cluster": "^0.7.7",
43+
"cors": "^2.8.3",
4344
"crypto": "0.0.3",
4445
"debug": "^2.6.3",
4546
"express": "^4.15.2",
47+
"express-limiter": "^1.6.0",
4648
"express-validator": "^3.1.2",
49+
"helmet": "^3.6.1",
4750
"lodash": "^4.17.4",
4851
"mongoose": "^4.9.0",
4952
"q": "^1.4.1",
5053
"randomstring": "^1.1.5",
54+
"redis": "^2.7.1",
5155
"util": "^0.10.3",
5256
"winston": "^2.3.1",
5357
"winston-bugsnag": "^2.1.0"

routes/index.js

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
"use strict";
2+
var express = require('express');
3+
var router = express.Router();
4+
var bodyParser = require('body-parser');
5+
var expressValidator = require('express-validator');
6+
var cors = require('cors');
7+
var response = require('../services/response');
8+
var encryption = require('../services/encryption');
9+
var log = require('../services/logger');
10+
var me = require('../package.json');
11+
var initialize = require('./initialize');
12+
var _ = require('lodash');
13+
14+
var allRequestData = function(req,res,next){
15+
var requestData = {};
16+
var newRequestData = _.assignIn(requestData, req.params, req.body, req.query);
17+
req.param = function(key, defaultValue){
18+
if(newRequestData[key]){
19+
return newRequestData[key];
20+
}else if(defaultValue){
21+
return defaultValue;
22+
}else{
23+
return false;
24+
}
25+
};
26+
next();
27+
};
28+
29+
var enforceUserId = function(req,res,next){
30+
var userId = req.param('userId');
31+
if(!userId){
32+
res.badRequest(false,'No userId parameter was passed in the payload of this request. Please pass a userId.');
33+
}else{
34+
// Do a middleware that validates userId here. put the user service endpoint in the env var. ideally, this should be the gateway endpoint
35+
next();
36+
}
37+
};
38+
39+
40+
router.use(cors());
41+
router.use(response);
42+
router.use(bodyParser.urlencoded({ extended: false }));
43+
router.use(bodyParser.json());
44+
router.use(bodyParser.raw());
45+
router.use(bodyParser.text());
46+
// add the param function to request object
47+
router.use(allRequestData);
48+
// Make userId compolsory in every request
49+
router.use(enforceUserId);
50+
router.use(encryption.interpreter);
51+
router.use(expressValidator());
52+
53+
router.use(function(req,res,next){
54+
log.info('[TIME: '+new Date().toISOString()+'] [IP Address: '+req.ip+'] [METHOD: '+req.method+'] [URL: '+req.originalUrl+']');
55+
next();
56+
});
57+
58+
router.options('*', cors());
59+
60+
router.get('/', function (req, res) {
61+
res.ok({name: me.name, version: me.version});
62+
});
63+
64+
router.get('/.well-known/acme-challenge/xvArhQBSilF4V30dGUagNAZ96ASipB0b0ex0kXn0za8', function(req,res){
65+
res.send('xvArhQBSilF4V30dGUagNAZ96ASipB0b0ex0kXn0za8._v6aFbaRYWeOmSebtlD-X4Ixf5tPsyULMsXM8HjsK-Q');
66+
});
67+
68+
// Other routes here
69+
70+
router.use('/', initialize);
71+
72+
router.use(function(req, res, next) { // jshint ignore:line
73+
res.notFound();
74+
});
75+
76+
router.use(log.errorHandler);
77+
78+
module.exports = router;

routes/initialize.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
"use strict";
2+
var express = require('express');
3+
var router = express.Router();
4+
var initializeController = require('../controllers/initialize');
5+
6+
// set tag
7+
router.get('/initialize', initializeController.init);
8+
9+
module.exports = router;

0 commit comments

Comments
 (0)