Skip to content

Commit a9505ce

Browse files
authored
Merge pull request #1 from EnsembleLab/dev
Dev
2 parents 1113d20 + c5c13bc commit a9505ce

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+2718
-367
lines changed

.travis.yml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,21 @@
1+
sudo: false
12
language: node_js
3+
services:
4+
- mongodb
5+
- redis-server
6+
env:
7+
- MONGOLAB_URL=mongodb://127.0.0.1/snipe RATE_LIMIT=10 REDIS_URL=redis://127.0.0.1/1 SECURE_MODE=true
8+
addons:
9+
apt:
10+
sources:
11+
- mongodb-3.0-precise
12+
packages:
13+
- mongodb-org-server
214
node_js:
315
- '7'
416
- '6'
517
before_script:
18+
- sleep 15
619
- npm install -g gulp mocha gulp-cli codecov istanbul
720
install:
821
- npm install

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: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,21 +23,28 @@ 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 express_enforces_ssl = require('express-enforces-ssl');
28+
29+
if(config.trustProxy === 'yes'){
30+
app.enable('trust proxy');
31+
}
32+
33+
if(config.enforceSSL === 'yes'){
34+
app.use(express_enforces_ssl());
35+
}
36+
37+
app.use('/',router);
38+
39+
if(config.env === 'production'){
40+
log.info('Worker %d running!', cluster.worker.id);
41+
}
42+
43+
44+
var server = app.listen(config.port, function () {
45+
var host = server.address().address;
46+
var port = server.address().port;
47+
log.info('listening on host '+host+', port '+port+'!');
48+
});
4249

4350
}

config/development.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,13 @@ 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 || '1800',
12+
rateLimitExpiry: process.env.RATE_LIMIT_EXPIRY || '3600000',
13+
redisURL: process.env.REDIS_URL || 'redis://192.168.99.100:6379/1',
14+
letsencryptSSLVerificationURL: process.env.LETSENCRYPT_VERIFICATION_URL || '/.well-known/acme-challenge/xvArhQBSilF4V30dGUagNAZ96ASipB0b0ex0kXn0za8',
15+
letsencryptSSLVerificationBody: process.env.LETSENCRYPT_VERIFICATION_BODY || 'xvArhQBSilF4V30dGUagNAZ96ASipB0b0ex0kXn0za8._v6aFbaRYWeOmSebtlD-X4Ixf5tPsyULMsXM8HjsK-Q',
16+
maxContentLength: process.env.MAX_CONTENT_LENGTH || '9999',
17+
enforceSSL: process.env.ENFORCE_SSL || 'no'
18+
};

config/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@ if(process.env.NODE_ENV === 'development'){
88
module.exports = production;
99
}else{
1010
module.exports = development;
11-
}
11+
}

config/production.js

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,17 @@
22
module.exports = {
33
env: process.env.NODE_ENV || 'production',
44
port: process.env.PORT || 80,
5-
trustProxy: process.env.TRUST_PROXY || 'no',
5+
trustProxy: process.env.TRUST_PROXY || 'yes',
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 || 'no',
11+
rateLimit: process.env.RATE_LIMIT || '1800',
12+
rateLimitExpiry: process.env.RATE_LIMIT_EXPIRY || '3600000',
13+
redisURL: process.env.REDIS_URL || 'redis://192.168.99.100:6379/1',
14+
letsencryptSSLVerificationURL: process.env.LETSENCRYPT_VERIFICATION_URL || '/.well-known/acme-challenge/xvArhQBSilF4V30dGUagNAZ96ASipB0b0ex0kXn0za8',
15+
letsencryptSSLVerificationBody: process.env.LETSENCRYPT_VERIFICATION_BODY || 'xvArhQBSilF4V30dGUagNAZ96ASipB0b0ex0kXn0za8._v6aFbaRYWeOmSebtlD-X4Ixf5tPsyULMsXM8HjsK-Q',
16+
maxContentLength: process.env.MAX_CONTENT_LENGTH || '9999',
17+
enforceSSL: process.env.ENFORCE_SSL || 'no'
18+
};

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: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
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+
UsersController.restore = function(query){
44+
return Users.count(query);
45+
};
46+
47+
module.exports = UsersController;

favicon.ico

14.7 KB
Binary file not shown.

gulpfile.js

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,31 +5,38 @@ var stylish = require('jshint-stylish');
55
var nodemon = require('gulp-nodemon');
66
var debug = require('debug')('gulp');
77
var mocha = require('gulp-mocha');
8-
8+
99
gulp.task('lint', function() {
1010
return gulp.src(['./*.js','./**/*.js','!./node_modules/**','!./node_modules/*.js'])
11-
.pipe(jshint())
12-
.pipe(jshint.reporter(stylish));
11+
.pipe(jshint())
12+
.pipe(jshint.reporter(stylish));
1313
});
1414

1515
gulp.task('default', function(){
1616
var stream = nodemon({ script: 'app.js' , env: { 'NODE_ENV': 'development', 'DEBUG':'gulp' }, tasks: ['lint','test'] });
17-
17+
1818
stream
19-
.on('restart', function () {
19+
.on('restart', function () {
2020
debug('restarted!');
21-
})
22-
.on('crash', function() {
21+
})
22+
.on('crash', function() {
2323
debug('Application has crashed!\n');
2424
stream.emit('restart', 10); // restart the server in 10 seconds
25-
});
25+
});
2626
});
27-
27+
2828
gulp.task('test', function() {
29-
gulp.src('./test/*.js', {read: false})
29+
// Override RATE LIMIT HERE FOR UNIT TEST
30+
process.env.RATE_LIMIT = 10;
31+
process.env.SECURE_MODE = true;
32+
gulp.src('./test', {read: false})
3033
// `gulp-mocha` needs filepaths so you can't have any plugins before it
3134
.pipe(mocha({reporter: 'spec'}));
3235
}
33-
);
36+
);
37+
38+
gulp.task('create', function(){
39+
40+
});
3441

35-
gulp.task('sanity',['lint','test']);
42+
gulp.task('sanity',['lint','test']);

0 commit comments

Comments
 (0)