Last active
May 26, 2016 09:12
-
-
Save tmpjr/539554d86b6ccc796462 to your computer and use it in GitHub Desktop.
Sample REST server with Node, Mongoose and Express
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var express = require('express'); | |
var bodyParser = require('body-parser'); | |
var mongoose = require('mongoose'); | |
var morgan = require('morgan'); | |
var jwt = require('jsonwebtoken'); | |
var app = express(); | |
var router = express.Router(); | |
var config = require('./config'); | |
var Sample = require('./sample'); | |
var User = require('./user'); | |
mongoose.connect(config.database); | |
app.set('superSecret', config.secret); | |
app.use(morgan('dev')); | |
app.use(bodyParser.json()); | |
app.use(bodyParser.urlencoded({ extended: true })); | |
router.post('/authenticate', function(req, res) { | |
User.findOne({ | |
name: req.body.name | |
}, function(err, user) { | |
if (err) throw err; | |
if (!user) { | |
res.json({ success: false, message: 'Authentication failed. User not found.' }); | |
} else if (user) { | |
if (user.password != req.body.password) { | |
res.json({ success: false, message: 'Authentication failed. Wrong password.' }); | |
} else { | |
// if user is found and password matches, create a token | |
var token = jwt.sign(user, app.get('superSecret'), { | |
expiresInMinutes: 1440 // 24 hours | |
}); | |
res.json({ | |
success: true, | |
message: 'Here is your token', | |
token: token | |
}); | |
} | |
} | |
}); | |
}); | |
router.route('/users') | |
.post(function(req, res) { | |
var user = new User(req.body); | |
user.save(function(err) { | |
if (err) throw err; | |
console.log('User saved successfully'); | |
res.send({ success: true }); | |
}); | |
}) | |
.get(function(req, res) { | |
User.find(function(err, users) { | |
if (err) throw err; | |
res.json(users); | |
}); | |
}); | |
router.route('/samples') | |
.get(function(req, res) { | |
Sample.find(function(err, samples) { | |
if (err) { | |
res.send(err); | |
} | |
res.json(samples); | |
}); | |
}) | |
.post(function(req, res) { | |
var sample = new Sample(req.body); | |
sample.save(function(err) { | |
if (err) { | |
res.send(err); | |
} | |
res.send({message: 'Sample added'}); | |
}); | |
}); | |
router.route('/samples/:id') | |
.put(function(req, res) { | |
Sample.findOne({ _id:req.params.id }, function(err, sample) { | |
if (err) { | |
res.send(err); | |
} | |
for (prop in req.body) { | |
sample[prop] = req.body[prop]; | |
} | |
sample.save(function(err) { | |
if (err) { | |
res.send(err); | |
} | |
res.send(sample); | |
}); | |
}); | |
}) | |
.get(function(req, res) { | |
Sample.findOne({ _id:req.params.id }, function(err, sample) { | |
if (err) { | |
res.send(err); | |
} | |
res.json(sample); | |
}); | |
}) | |
.delete(function(req, res) { | |
Sample.remove({ | |
_id: req.params.id | |
}, function(err, sample) { | |
if (err) { | |
res.send(err); | |
} | |
res.json({ message: "Successfully deleted" }) | |
}); | |
}); | |
app.use('/api', router); | |
app.set('port', 8000); | |
var server = app.listen(app.get('port'), function() { | |
console.log('Express server listening on port ' + server.address().port); | |
}); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module.exports = { | |
'secret': 'carplanegoosehouse', | |
'database': 'mongodb://localhost:27017/sampledb' | |
}; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"name": "sample-storage", | |
"version": "1.0.0", | |
"description": "", | |
"main": "api.js", | |
"scripts": { | |
"test": "echo \"Error: no test specified\" && exit 1" | |
}, | |
"author": "@tmpjrdotme", | |
"license": "ISC", | |
"dependencies": { | |
"body-parser": "^1.13.3", | |
"express": "^4.13.3", | |
"jsonwebtoken": "^5.0.5", | |
"mongoose": "^4.1.3", | |
"morgan": "^1.6.1" | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var mongoose = require('mongoose'); | |
var Schema = mongoose.Schema; | |
var sampleSchema = new Schema({ | |
barcode: String, | |
type: String, | |
collected: Date, | |
created_at: Date, | |
updated_at: Date | |
}); | |
sampleSchema.pre('save', function(next) { | |
var currentDate = new Date(); | |
this.updated_at = currentDate; | |
if (!this.created_at) { | |
this.created_at = currentDate; | |
} | |
next(); | |
}); | |
module.exports = mongoose.model('Sample', sampleSchema); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"accession": "Z2342343", | |
"barcode": "B324234", | |
"specimen_type": "Blood", | |
"received_on": "2015-08-12" | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var mongoose = require('mongoose'); | |
var Schema = mongoose.Schema; | |
var userSchema = new Schema({ | |
name: String, | |
password: String, | |
admin: Boolean | |
}); | |
module.exports = mongoose.model('User', userSchema); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Just a bare bones implementation of a REST API using Node, Express and Mongoose. I created this gist for reference.