From 00466332903d51c3064c975efdc8d000074990c1 Mon Sep 17 00:00:00 2001 From: Dan Stineback Date: Thu, 26 May 2016 12:49:41 -0700 Subject: [PATCH 01/13] added 2nd resource --- dan-stineback/.gitignore | 1 + dan-stineback/lib/server.js | 45 +++++++------------------------ dan-stineback/package.json | 6 +++-- dan-stineback/routes/cat-route.js | 37 +++++++++++++++++++++++++ dan-stineback/routes/dog-route.js | 37 +++++++++++++++++++++++++ dan-stineback/schema/cats.js | 10 +++++++ dan-stineback/schema/dogs.js | 10 +++++++ 7 files changed, 108 insertions(+), 38 deletions(-) create mode 100644 dan-stineback/routes/cat-route.js create mode 100644 dan-stineback/routes/dog-route.js create mode 100644 dan-stineback/schema/cats.js create mode 100644 dan-stineback/schema/dogs.js diff --git a/dan-stineback/.gitignore b/dan-stineback/.gitignore index 3c3629e..885c9f0 100644 --- a/dan-stineback/.gitignore +++ b/dan-stineback/.gitignore @@ -1 +1,2 @@ node_modules +db diff --git a/dan-stineback/lib/server.js b/dan-stineback/lib/server.js index 95d26ea..e611be1 100644 --- a/dan-stineback/lib/server.js +++ b/dan-stineback/lib/server.js @@ -3,42 +3,15 @@ const express = require('express'); const router = require(__dirname + ('/server')); const app = express(); -const bodyParser = require('body-parser'); -const jsonParser = bodyParser.json(); - - -app.use(jsonParser); - - -app.get('/', (req, res) => { - console.log('you got get'); - res.send('Mission accomplished. Time for a beer. '); -}); - -app.get('/zoots', (req, res) => { - console.log('Zoots fool. '); - res.send('Zoots Zoots. '); -}); - -app.post('/zoots', (req, res) => { - console.log('Hey Mr. Post-man. '); - res.json({message: 'This is some sweet sweet JSON. '}); -}); - -app.put('/zoots', (req, res) => { - console.log('Put your hands up! '); - res.json({message: 'Party Under Trees JSON '}); -}); - -app.patch('/zoots', (req, res) => { - console.log('Patchy patchface. '); - res.json({message: 'Just a small fix JSON'}); -}); - -app.delete('/zoots', (req, res) => { - console.log('Seek and destroy! '); - res.json({message: 'Nothing to see here folks'}); -}); +const mongoose = require('mongoose'); +const morgan = require('morgan'); +const dogRouter = require('../routes/dog-route'); +const catRouter = require('../routes/cat-route'); + +app.use(morgan('dev')); +mongoose.connect('mongodb://localhost/dev_db'); +app.use('/dogs', dogRouter); +app.use('/cats', catRouter); app.get('/*', (req, res) => { res.status(404).json({message: 'not found'}); diff --git a/dan-stineback/package.json b/dan-stineback/package.json index 9db7bb7..e88b94b 100644 --- a/dan-stineback/package.json +++ b/dan-stineback/package.json @@ -20,7 +20,8 @@ }, "homepage": "https://github.com/dstineback/rest_api#readme", "dependencies": { - "body-parser": "^1.15.1" + "body-parser": "^1.15.1", + "morgan": "^1.7.0" }, "devDependencies": { "chai": "^3.5.0", @@ -29,6 +30,7 @@ "gulp-eslint": "^2.0.0", "gulp-mocha": "^2.2.0", "gulp-watch": "^4.3.6", - "mocha": "^2.5.1" + "mocha": "^2.5.1", + "mongoose": "^4.4.19" } } diff --git a/dan-stineback/routes/cat-route.js b/dan-stineback/routes/cat-route.js new file mode 100644 index 0000000..1dc3540 --- /dev/null +++ b/dan-stineback/routes/cat-route.js @@ -0,0 +1,37 @@ +'use strict'; +const express = require('express'); +const Cat = require('../schema/cats'); +const bodyParser = require('body-parser').json(); +const jsonParser = bodyParser; +const catRouter = module.exports = exports = express.Router(); + + +catRouter.get('/cats', (req, res) => { + Cat.find({}, (err, data) => { + if(err) return res.json({message: err.message}); + res.json(data); + }); +}); + +catRouter.post('/cats', (req, res) => { + let newCat = new Cat(req.body); + newCat.save((err, data)=> { + if (err) return res.json({message: err.message}); + res.json(data); + }); +}); + +catRouter.put('/cats', (req, res) => { + Cat.findOneAndUpdate({_id: req.body._id}, req.body, (err, data) =>{ + if (err) return res.json({message: err.message}); + res.send(data); + }); +}); + +catRouter.delete('/cats/:id', (req, res) => { + let _id = req.params.id; + Cat.findOneAndRemove({_id}, null, (err, data) => { + if (err) return res.json({message: err.message}); + res.send('deleted cat with id: ' + req.params.id); + }); +}); diff --git a/dan-stineback/routes/dog-route.js b/dan-stineback/routes/dog-route.js new file mode 100644 index 0000000..c17bfe5 --- /dev/null +++ b/dan-stineback/routes/dog-route.js @@ -0,0 +1,37 @@ +'use strict'; +const express = require('express'); +const Dog = require('../schema/dogs'); +const bodyParser = require('body-parser').json(); +const jsonParser = bodyParser; +const dogRouter = module.exports = exports = express.Router(); + + +dogRouter.get('/dogs', (req, res) => { + Dog.find({}, (err, data) => { + if(err) return res.json({message: err.message}); + res.json(data); + }) +}); + +dogRouter.post('/dogs', jsonParser, (req, res) => { + let newDog = new Dog(req.body); + newDog.save((err, data)=> { + if (err) return res.json({message: err.message}); + res.json(data); + }) +}); + +dogRouter.put('/dogs', jsonParser, (req, res) => { + Dog.findOneAndUpdate({_id: req.body._id}, req.body, (err, data) =>{ + if (err) return res.json({message: err.message}); + res.send(data); + }); +}); + +dogRouter.delete('/dogs/:id', (req, res) => { + let _id = req.params.id; + Dog.findOneAndRemove({_id}, null, (err, data) => { + if (err) return res.json({message: err.message}); + res.send('deleted dog with id: ' + req.params.id); + }); +}); diff --git a/dan-stineback/schema/cats.js b/dan-stineback/schema/cats.js new file mode 100644 index 0000000..8f38a2e --- /dev/null +++ b/dan-stineback/schema/cats.js @@ -0,0 +1,10 @@ +'use strict'; + +const mongoose = require('mongoose'); + +const Cat = new mongoose.Schema({ + name: String, + size: String, +}); + +module.exports = mongoose.model('Cat', Cat); diff --git a/dan-stineback/schema/dogs.js b/dan-stineback/schema/dogs.js new file mode 100644 index 0000000..16b012f --- /dev/null +++ b/dan-stineback/schema/dogs.js @@ -0,0 +1,10 @@ +'use strict'; + +const mongoose = require('mongoose'); + +const Dog = new mongoose.Schema({ + name: String, + size: String, +}); + +module.exports = mongoose.model('Dog', Dog); From 61aba4c4057d5623a61c9e9fb11a26ab71c6e955 Mon Sep 17 00:00:00 2001 From: Dan Stineback Date: Thu, 26 May 2016 19:44:09 -0700 Subject: [PATCH 02/13] added more test --- dan-stineback/index.js | 2 +- dan-stineback/lib/error_handling.js | 3 + dan-stineback/lib/server.js | 19 --- dan-stineback/routes/cat-route.js | 36 +++--- dan-stineback/routes/dog-route.js | 40 +++--- dan-stineback/schema/cats.js | 2 +- dan-stineback/schema/dogs.js | 2 +- dan-stineback/server.js | 22 ++++ dan-stineback/test/test.js | 189 +++++++++++++++++++--------- 9 files changed, 197 insertions(+), 118 deletions(-) create mode 100644 dan-stineback/lib/error_handling.js delete mode 100644 dan-stineback/lib/server.js create mode 100644 dan-stineback/server.js diff --git a/dan-stineback/index.js b/dan-stineback/index.js index 3847531..de7b181 100644 --- a/dan-stineback/index.js +++ b/dan-stineback/index.js @@ -1,3 +1,3 @@ 'use strict'; -module.exports = require(__dirname + '/lib/server.js'); +module.exports = require(__dirname + '/server.js'); diff --git a/dan-stineback/lib/error_handling.js b/dan-stineback/lib/error_handling.js new file mode 100644 index 0000000..fcd551c --- /dev/null +++ b/dan-stineback/lib/error_handling.js @@ -0,0 +1,3 @@ +module.exports = function (err, req, res, next) { + res.status(500).json({message: err.message}); +}; diff --git a/dan-stineback/lib/server.js b/dan-stineback/lib/server.js deleted file mode 100644 index e611be1..0000000 --- a/dan-stineback/lib/server.js +++ /dev/null @@ -1,19 +0,0 @@ -'use strict'; - -const express = require('express'); -const router = require(__dirname + ('/server')); -const app = express(); -const mongoose = require('mongoose'); -const morgan = require('morgan'); -const dogRouter = require('../routes/dog-route'); -const catRouter = require('../routes/cat-route'); - -app.use(morgan('dev')); -mongoose.connect('mongodb://localhost/dev_db'); -app.use('/dogs', dogRouter); -app.use('/cats', catRouter); - -app.get('/*', (req, res) => { - res.status(404).json({message: 'not found'}); -}); -app.listen(3000, () => console.log('server is up on 3000')); diff --git a/dan-stineback/routes/cat-route.js b/dan-stineback/routes/cat-route.js index 1dc3540..1e37457 100644 --- a/dan-stineback/routes/cat-route.js +++ b/dan-stineback/routes/cat-route.js @@ -3,35 +3,39 @@ const express = require('express'); const Cat = require('../schema/cats'); const bodyParser = require('body-parser').json(); const jsonParser = bodyParser; + const catRouter = module.exports = exports = express.Router(); -catRouter.get('/cats', (req, res) => { - Cat.find({}, (err, data) => { - if(err) return res.json({message: err.message}); - res.json(data); +catRouter.get('/cats/', (req, res, next) => { + Cat.find({}, (err, cat) => { + if(err) return next(err); + res.json(cat); }); }); -catRouter.post('/cats', (req, res) => { +catRouter.post('/cats/', bodyParser, (req, res, next) => { let newCat = new Cat(req.body); - newCat.save((err, data)=> { - if (err) return res.json({message: err.message}); - res.json(data); + newCat.save((err, cat)=> { + if (err) return next(err); + res.json(cat); }); }); -catRouter.put('/cats', (req, res) => { - Cat.findOneAndUpdate({_id: req.body._id}, req.body, (err, data) =>{ - if (err) return res.json({message: err.message}); - res.send(data); +catRouter.put('/cats/', bodyParser, (req, res, next) => { + let _id = req.body._id; + Cat.findOneAndUpdate({_id}, req.body, (err, cat) =>{ + if (err) return next(err); + let message = "successfully updated"; + res.json({message}); }); }); -catRouter.delete('/cats/:id', (req, res) => { +catRouter.delete('/cats/:id', (req, res, next) => { let _id = req.params.id; - Cat.findOneAndRemove({_id}, null, (err, data) => { - if (err) return res.json({message: err.message}); - res.send('deleted cat with id: ' + req.params.id); + Cat.findOneAndRemove({_id}, null, (err, cat) => { + if (err) return next(err); + let message = 'successfully deleted'; + res.json({message}); }); }); diff --git a/dan-stineback/routes/dog-route.js b/dan-stineback/routes/dog-route.js index c17bfe5..307ca6e 100644 --- a/dan-stineback/routes/dog-route.js +++ b/dan-stineback/routes/dog-route.js @@ -3,35 +3,39 @@ const express = require('express'); const Dog = require('../schema/dogs'); const bodyParser = require('body-parser').json(); const jsonParser = bodyParser; + const dogRouter = module.exports = exports = express.Router(); -dogRouter.get('/dogs', (req, res) => { - Dog.find({}, (err, data) => { - if(err) return res.json({message: err.message}); - res.json(data); - }) +dogRouter.get('/', (req, res, next) => { + Dog.find({}, (err, dog) => { + if(err) return next(err); + res.json(dog); + }); }); -dogRouter.post('/dogs', jsonParser, (req, res) => { +dogRouter.post('/', bodyParser, (req, res, next) => { let newDog = new Dog(req.body); - newDog.save((err, data)=> { - if (err) return res.json({message: err.message}); - res.json(data); - }) + newDog.save((err, dog)=> { + if (err) return next(err); + res.json(dog); + }); }); -dogRouter.put('/dogs', jsonParser, (req, res) => { - Dog.findOneAndUpdate({_id: req.body._id}, req.body, (err, data) =>{ - if (err) return res.json({message: err.message}); - res.send(data); +dogRouter.put('/', bodyParser, (req, res, next) => { + let _id = req.body._id; + Dog.findOneAndUpdate({_id}, req.body, (err, dog) =>{ + if (err) return next(err); + let message = "successfully updated"; + res.json({message}); }); }); -dogRouter.delete('/dogs/:id', (req, res) => { +dogRouter.delete('/:id', (req, res, next) => { let _id = req.params.id; - Dog.findOneAndRemove({_id}, null, (err, data) => { - if (err) return res.json({message: err.message}); - res.send('deleted dog with id: ' + req.params.id); + Dog.findOneAndRemove({_id}, null, (err, dog) => { + if (err) return next(err); + let message = 'successfully deleted'; + res.json({message}); }); }); diff --git a/dan-stineback/schema/cats.js b/dan-stineback/schema/cats.js index 8f38a2e..3eed4ac 100644 --- a/dan-stineback/schema/cats.js +++ b/dan-stineback/schema/cats.js @@ -7,4 +7,4 @@ const Cat = new mongoose.Schema({ size: String, }); -module.exports = mongoose.model('Cat', Cat); +module.exports = mongoose.model('cat', Cat); diff --git a/dan-stineback/schema/dogs.js b/dan-stineback/schema/dogs.js index 16b012f..f3c539e 100644 --- a/dan-stineback/schema/dogs.js +++ b/dan-stineback/schema/dogs.js @@ -7,4 +7,4 @@ const Dog = new mongoose.Schema({ size: String, }); -module.exports = mongoose.model('Dog', Dog); +module.exports = mongoose.model('dog', Dog); diff --git a/dan-stineback/server.js b/dan-stineback/server.js new file mode 100644 index 0000000..1e90fd0 --- /dev/null +++ b/dan-stineback/server.js @@ -0,0 +1,22 @@ +'use strict'; + +const express = require('express'); +const app = express(); +const mongoose = require('mongoose'); +const morgan = require('morgan'); +const errorHandler = require(__dirname + '/lib/error_handling'); + +const dbPort = process.env.MONGOLAB_URI || 'mongodb://localhost/dev_db'; +mongoose.connect('mongodb://localhost/dev_db'); + +const dogRouter = require(__dirname + '/routes/dog-route'); +const catRouter = require(__dirname + '/routes/cat-route'); + +app.use(morgan('dev')); +app.use(__dirname + '/dogs', dogRouter); +app.use(__dirname + '/cats', catRouter); + +app.use(errorHandler); + + +app.listen(3000, () => console.log('server is up on 3000')); diff --git a/dan-stineback/test/test.js b/dan-stineback/test/test.js index 4f3f681..6cef91b 100644 --- a/dan-stineback/test/test.js +++ b/dan-stineback/test/test.js @@ -1,84 +1,149 @@ 'use strict'; -const fs = require('fs'); -const express = require('express'); const chai = require('chai'); const chaiHTTP = require('chai-http'); -const expect = chai.expect; +const Cat = require('../schema/cats'); +const Dog = require('../schema/dogs'); + +const mongoose = require('mongoose'); chai.use(chaiHTTP); + +const expect = chai.expect; const request = chai.request; -const server = require(__dirname + '/../lib/server'); -const app = express(); -const bodyParser = require('body-parser'); -const jsonParser = bodyParser.json(); -const myRouter = express.Router(); +const dbPort = process.env.MONGOLAB_URI; -app.use(jsonParser); -require('../index'); +process.env.MONGOLAB_URI = 'mongodb://localhost/test_db'; +require('../server'); -describe('testing path', () => { - it('should return GET message', (done) => { - request('localhost:3000') - .get('/zoots') - .end((err, res) => { - expect(err).to.eql(null); - expect(res).to.have.status(200); - expect(res.text).to.eql('Zoots Zoots. '); - done(); + +describe('Cat test', () => { + after((done)=> { + process.env.MONGOLAB_URI = dbPort; + mongoose.connection.db.dropDatabase(()=>{ + done(); }); }); - it('should write POST mesage', (done) => { + it('should get a list of cats', (done) => { request('localhost:3000') - .post('/zoots') - .send({}) - .end((err, res) => { - expect(err).to.eql(null); - expect(res).to.have.status(200); - expect(res.text).to.eql(('{"message":"This is some sweet sweet JSON. "}')); - done(); - }); + .get('/cats/') + .end((err, res)=>{ + expect(err).to.eql(null); + expect(Array.isArray(res.body)).to.eql(true); + done(); + }); }); - it('should write PUT message', (done) => { + it('should post a cats', (done) => { + let vic = {name: 'Vic', size: 'large'}; request('localhost:3000') - .put('/zoots') - .send({}) - .end((err, res) => { - expect(err).to.eql(null); - expect(res).to.have.status(200); - expect(res.text).to.eql('{"message":"Party Under Trees JSON "}'); - done(); + .post('/cats/') + .send(vic) + .end((err, res)=>{ + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.body.name).to.eql('Vic'); + expect(res.body).to.have.property('_id'); + expect(res.body.size).to.eql('large'); + done(); + }); + }); + + + describe('test that need data', ()=> { + let testCat; + beforeEach((done)=> { + let newCat = new Cat({name: 'test', size: 'large'}); + newCat.save((err, Cat)=> { + testCat = Cat; + done(); + }); }); + it('should return a updated cats', (done) => { + testCat.name = 'updated'; + request('localhost:3000') + .put('/cats/') + .send(testCat) + .end((err,res)=>{ + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.body.message).to.eql('successfully updated'); + done(); + }); + }); + it('should delete a cat', (done)=>{ + request('localhost:3000') + .delete('/cats/' + testCat._id) + .end((err, res)=>{ + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.body.message).to.eql('successfully deleted'); + done(); + }) + }) }); - it('should write PATCH message', (done) => { - request('localhost:3000') - .patch('/zoots') - .send({}) - .end((err, res) => { - expect(err).to.eql(null); - expect(res).to.have.status(200); - expect(res.text).to.eql('{"message":"Just a small fix JSON"}'); - done(); +}); + +describe('Dog test', () => { + after((done)=> { + process.env.MONGOLAB_URI = dbPort; + mongoose.connection.db.dropDatabase(()=>{ + done(); }); }); - it('should test DELETE and write new message', (done) => { + it('should get a list of dogs', (done) => { request('localhost:3000') - .delete('/zoots') - .send({}) - .end((err, res) => { - expect(err).to.eql(null); - expect(res).to.have.status(200); - expect(res.text).to.eql('{"message":"Nothing to see here folks"}') - done(); - }); - }) - it('should respond with 404 not found', (done) => { + .get('/dogs/') + .end((err, res)=>{ + expect(err).to.eql(null); + expect(Array.isArray(res.body)).to.eql(true); + done(); + }); + }); + it('should post a dogs', (done) => { + let vic = {name: 'Vic', size: 'large'}; request('localhost:3000') - .get('/*') - .end((err, res) => { - expect(err).to.not.eql(null); - expect(res).to.have.status(404); - expect(res.text).to.eql('{"message":"not found"}'); - done(); + .post('/dogs/') + .send(vic) + .end((err, res)=>{ + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.body.name).to.eql('Vic'); + expect(res.body).to.have.property('_id'); + expect(res.body.size).to.eql('large'); + done(); + }); + }); + + + describe('test that need data', ()=> { + let testDog; + beforeEach((done)=> { + let newDog = new Dog({name: 'test', size: 'large'}); + newDog.save((err, Dog)=> { + testDog = Dog; + done(); + }); + }); + it('should return a updated dogs', (done) => { + testDog.name = 'updated'; + request('localhost:3000') + .put('/dogs/') + .send(testDog) + .end((err,res)=>{ + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.body.message).to.eql('successfully updated'); + done(); + }); }); + it('should delete a dog', (done)=>{ + request('localhost:3000') + .delete('/cats/' + testDog._id) + .end((err, res)=>{ + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.body.message).to.eql('successfully deleted'); + done(); + }) + }) }); }); From 416f8995dcf31047aa00d8bfa7ceaff31d4875ae Mon Sep 17 00:00:00 2001 From: Dan Stineback Date: Fri, 27 May 2016 09:45:09 -0700 Subject: [PATCH 03/13] fixed path issue --- dan-stineback/lib/error_handling.js | 2 +- dan-stineback/routes/cat-route.js | 8 ++++---- dan-stineback/server.js | 8 +++++--- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/dan-stineback/lib/error_handling.js b/dan-stineback/lib/error_handling.js index fcd551c..e01a9fc 100644 --- a/dan-stineback/lib/error_handling.js +++ b/dan-stineback/lib/error_handling.js @@ -1,3 +1,3 @@ module.exports = function (err, req, res, next) { - res.status(500).json({message: err.message}); + res.status(500).json({message: 'dan' + err.message}); }; diff --git a/dan-stineback/routes/cat-route.js b/dan-stineback/routes/cat-route.js index 1e37457..cebf8b5 100644 --- a/dan-stineback/routes/cat-route.js +++ b/dan-stineback/routes/cat-route.js @@ -7,14 +7,14 @@ const jsonParser = bodyParser; const catRouter = module.exports = exports = express.Router(); -catRouter.get('/cats/', (req, res, next) => { +catRouter.get('/', (req, res, next) => { Cat.find({}, (err, cat) => { if(err) return next(err); res.json(cat); }); }); -catRouter.post('/cats/', bodyParser, (req, res, next) => { +catRouter.post('/', bodyParser, (req, res, next) => { let newCat = new Cat(req.body); newCat.save((err, cat)=> { if (err) return next(err); @@ -22,7 +22,7 @@ catRouter.post('/cats/', bodyParser, (req, res, next) => { }); }); -catRouter.put('/cats/', bodyParser, (req, res, next) => { +catRouter.put('/', bodyParser, (req, res, next) => { let _id = req.body._id; Cat.findOneAndUpdate({_id}, req.body, (err, cat) =>{ if (err) return next(err); @@ -31,7 +31,7 @@ catRouter.put('/cats/', bodyParser, (req, res, next) => { }); }); -catRouter.delete('/cats/:id', (req, res, next) => { +catRouter.delete('/:id', (req, res, next) => { let _id = req.params.id; Cat.findOneAndRemove({_id}, null, (err, cat) => { if (err) return next(err); diff --git a/dan-stineback/server.js b/dan-stineback/server.js index 1e90fd0..95cf1fd 100644 --- a/dan-stineback/server.js +++ b/dan-stineback/server.js @@ -13,10 +13,12 @@ const dogRouter = require(__dirname + '/routes/dog-route'); const catRouter = require(__dirname + '/routes/cat-route'); app.use(morgan('dev')); -app.use(__dirname + '/dogs', dogRouter); -app.use(__dirname + '/cats', catRouter); +app.use('/dogs', dogRouter); +app.use('/cats', catRouter); app.use(errorHandler); - +app.use((req, res)=> { + res.status(404).json({msg: 'page not found test'}); +}); app.listen(3000, () => console.log('server is up on 3000')); From d91638a0be5b0a55264338442aea1e4b105f14e1 Mon Sep 17 00:00:00 2001 From: Dan Stineback Date: Fri, 27 May 2016 10:13:28 -0700 Subject: [PATCH 04/13] trying to push after github started working --- dan-stineback/server.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dan-stineback/server.js b/dan-stineback/server.js index 95cf1fd..9965a58 100644 --- a/dan-stineback/server.js +++ b/dan-stineback/server.js @@ -18,7 +18,7 @@ app.use('/cats', catRouter); app.use(errorHandler); -app.use((req, res)=> { - res.status(404).json({msg: 'page not found test'}); -}); +// app.use((req, res)=> { +// res.status(404).json({msg: 'page not found test'}); +// }); app.listen(3000, () => console.log('server is up on 3000')); From 1d182866914617aa022ff2c340c6a180a5458dc9 Mon Sep 17 00:00:00 2001 From: Dan Stineback Date: Fri, 27 May 2016 11:47:49 -0700 Subject: [PATCH 05/13] started to add a third router --- dan-stineback/routes/age.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 dan-stineback/routes/age.js diff --git a/dan-stineback/routes/age.js b/dan-stineback/routes/age.js new file mode 100644 index 0000000..091af44 --- /dev/null +++ b/dan-stineback/routes/age.js @@ -0,0 +1,15 @@ +'use strict'; +const express = require('express'); +const Cat = require('../schema/cats'); +const Dog = require('../schema/dogs'); +const bodyParser = require('body-parser').json(); +const jsonParser = bodyParser; + +const ageRouter = module.exports = exports = express.Router(); + +ageRouter.get('/', (req, res, next) =>{ + Cat.find({}, (err, cat)=>{ + if(err) return next(err); + res.json(cat); + }); +}); From f76283e6c1bbcbd82c298335e3766300d35f358a Mon Sep 17 00:00:00 2001 From: Dan Stineback Date: Fri, 27 May 2016 12:09:41 -0700 Subject: [PATCH 06/13] update --- dan-stineback/routes/age.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dan-stineback/routes/age.js b/dan-stineback/routes/age.js index 091af44..5907e31 100644 --- a/dan-stineback/routes/age.js +++ b/dan-stineback/routes/age.js @@ -8,8 +8,9 @@ const jsonParser = bodyParser; const ageRouter = module.exports = exports = express.Router(); ageRouter.get('/', (req, res, next) =>{ + let age; Cat.find({}, (err, cat)=>{ if(err) return next(err); - res.json(cat); + age = (dog.age.length) }); }); From f8a4d663e60a17680c9ce804576d05655d3b0d3e Mon Sep 17 00:00:00 2001 From: Dan Stineback Date: Fri, 27 May 2016 12:10:14 -0700 Subject: [PATCH 07/13] update --- dan-stineback/.gitignore | 4 ++-- dan-stineback/index.js | 3 --- dan-stineback/schema/cats.js | 2 +- dan-stineback/schema/dogs.js | 2 +- dan-stineback/server.js | 8 +++++--- 5 files changed, 9 insertions(+), 10 deletions(-) delete mode 100644 dan-stineback/index.js diff --git a/dan-stineback/.gitignore b/dan-stineback/.gitignore index 885c9f0..4c497d6 100644 --- a/dan-stineback/.gitignore +++ b/dan-stineback/.gitignore @@ -1,2 +1,2 @@ -node_modules -db +/node_modules +/db diff --git a/dan-stineback/index.js b/dan-stineback/index.js deleted file mode 100644 index de7b181..0000000 --- a/dan-stineback/index.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict'; - -module.exports = require(__dirname + '/server.js'); diff --git a/dan-stineback/schema/cats.js b/dan-stineback/schema/cats.js index 3eed4ac..cc4b61a 100644 --- a/dan-stineback/schema/cats.js +++ b/dan-stineback/schema/cats.js @@ -4,7 +4,7 @@ const mongoose = require('mongoose'); const Cat = new mongoose.Schema({ name: String, - size: String, + age: Number, }); module.exports = mongoose.model('cat', Cat); diff --git a/dan-stineback/schema/dogs.js b/dan-stineback/schema/dogs.js index f3c539e..42b2ad1 100644 --- a/dan-stineback/schema/dogs.js +++ b/dan-stineback/schema/dogs.js @@ -4,7 +4,7 @@ const mongoose = require('mongoose'); const Dog = new mongoose.Schema({ name: String, - size: String, + age: Number, }); module.exports = mongoose.model('dog', Dog); diff --git a/dan-stineback/server.js b/dan-stineback/server.js index 9965a58..66b98e6 100644 --- a/dan-stineback/server.js +++ b/dan-stineback/server.js @@ -11,14 +11,16 @@ mongoose.connect('mongodb://localhost/dev_db'); const dogRouter = require(__dirname + '/routes/dog-route'); const catRouter = require(__dirname + '/routes/cat-route'); +const ageRouter = require(__dirname + '/routes/age'); app.use(morgan('dev')); app.use('/dogs', dogRouter); app.use('/cats', catRouter); +app.use('/age', ageRouter); app.use(errorHandler); -// app.use((req, res)=> { -// res.status(404).json({msg: 'page not found test'}); -// }); +app.use((req, res)=> { + res.status(404).json({msg: 'page not found test'}); +}); app.listen(3000, () => console.log('server is up on 3000')); From 0058e9ecefc4c14df7dd5fbab3a559f21d789da3 Mon Sep 17 00:00:00 2001 From: Dan Stineback Date: Thu, 2 Jun 2016 19:44:24 -0700 Subject: [PATCH 08/13] added auth routes --- dan-stineback/.eslintignore | 5 ++++ dan-stineback/.eslintrc | 41 +++++++++++++++++++++++++++++ dan-stineback/lib/basic-http.js | 18 +++++++++++++ dan-stineback/lib/error_handling.js | 1 + dan-stineback/lib/jwt_auth.js | 25 ++++++++++++++++++ dan-stineback/model/user.js | 25 ++++++++++++++++++ dan-stineback/package.json | 2 ++ dan-stineback/routes/age.js | 16 ----------- dan-stineback/routes/router.js | 30 +++++++++++++++++++++ dan-stineback/server.js | 12 ++++++--- dan-stineback/test/test.js | 4 +-- 11 files changed, 158 insertions(+), 21 deletions(-) create mode 100644 dan-stineback/.eslintignore create mode 100644 dan-stineback/.eslintrc create mode 100644 dan-stineback/lib/basic-http.js create mode 100644 dan-stineback/lib/jwt_auth.js create mode 100644 dan-stineback/model/user.js delete mode 100644 dan-stineback/routes/age.js create mode 100644 dan-stineback/routes/router.js diff --git a/dan-stineback/.eslintignore b/dan-stineback/.eslintignore new file mode 100644 index 0000000..5b88cef --- /dev/null +++ b/dan-stineback/.eslintignore @@ -0,0 +1,5 @@ +**/node_modules/* +**/vendor/* +**/*.min.js +/*.md +/package.json diff --git a/dan-stineback/.eslintrc b/dan-stineback/.eslintrc new file mode 100644 index 0000000..6d505ad --- /dev/null +++ b/dan-stineback/.eslintrc @@ -0,0 +1,41 @@ +{ +"rules": { +"no-console": 0, +"indent": [ +2, +2 +], +"quotes": [ +2, +"single" +], +"linebreak-style": [ +2, +"unix" +], +"semi": [ +2, +"always" +] +}, +"env": { +"es6": true, +"node": true, +"browser": true, +"mocha": true +}, +"globals": { +"describe": false, +"it": false, +"beforeEach": false, +"afterEach": false, +"before": false, +"after": false +}, +"ecmaFeatures": { +"modules": true, +"experimentalObjectRestSpread": true, +"impliedStrict": true +}, +"extends": "eslint:recommended" +} diff --git a/dan-stineback/lib/basic-http.js b/dan-stineback/lib/basic-http.js new file mode 100644 index 0000000..2ac4a7f --- /dev/null +++ b/dan-stineback/lib/basic-http.js @@ -0,0 +1,18 @@ +'use strict'; + +module.exports = function(req, res, next) { + let basicAuth = req.headers.authorization; + let authString = basicAuth.split(' ').pop(); + let authBuff = new Buffer(authString, 'base64'); + let asciiAuth = authBuff.toString(); + let authArray = asciiAuth.split(':'); + authBuff.fill(0); + req.auth = { + username: authArray[0], + password: authArray[1] + }; + if(!req.auth.username || !req.auth.password) { + return next(new Error('Username or Password missing')); + } + next(); +}; diff --git a/dan-stineback/lib/error_handling.js b/dan-stineback/lib/error_handling.js index e01a9fc..46a8b25 100644 --- a/dan-stineback/lib/error_handling.js +++ b/dan-stineback/lib/error_handling.js @@ -1,3 +1,4 @@ +'use strict'; module.exports = function (err, req, res, next) { res.status(500).json({message: 'dan' + err.message}); }; diff --git a/dan-stineback/lib/jwt_auth.js b/dan-stineback/lib/jwt_auth.js new file mode 100644 index 0000000..7218a7a --- /dev/null +++ b/dan-stineback/lib/jwt_auth.js @@ -0,0 +1,25 @@ +'use strict'; + +const jwt = require('jsonwebtoken'); +const User = require('../model/user'); +const secret = process.env.SECRET || 'changeme'; + +module.exports = function(req, res, next) { + let token = req.body.token || req.headers.token; + let tokenErr = new Error('Authorization Failure'); + let decodedToken; + + if (!token) return next(tokenErr); + + try { + decodedToken = jwt.verify(token, secret); + } catch(e) { + return next(tokenErr); + } + + User.findOne({_id: decodedToken._id}, (err, user) => { + if (!user || err) return next(tokenErr); + req.user = user; + next(); + }); +}; diff --git a/dan-stineback/model/user.js b/dan-stineback/model/user.js new file mode 100644 index 0000000..8f97cef --- /dev/null +++ b/dan-stineback/model/user.js @@ -0,0 +1,25 @@ +'use strict'; + +const mongoose = require('mongoose'); +const bcrypt = require('bcrypt'); +const secret = process.env.SECRET || 'changeme'; +const jwt = require('jsonwebtoken'); + +const User = new mongoose.Schema({ + username: {type: String, required: true}, + password: {type: String, required: true} +}); + +User.methods.hashedPassword = function() { + return bcrypt.hashSync(this.password, 8); +}; + +User.methods.comparePassword = function(password) { + return bcrypt.compareSync(password, this.password); +}; + +User.methods.generateToken = function() { + return jwt.sign({_id: this._id}, secret); +}; + +module.exports = mongoose.model('user', User); diff --git a/dan-stineback/package.json b/dan-stineback/package.json index e88b94b..ff49c39 100644 --- a/dan-stineback/package.json +++ b/dan-stineback/package.json @@ -20,7 +20,9 @@ }, "homepage": "https://github.com/dstineback/rest_api#readme", "dependencies": { + "bcrypt": "^0.8.6", "body-parser": "^1.15.1", + "jsonwebtoken": "^7.0.0", "morgan": "^1.7.0" }, "devDependencies": { diff --git a/dan-stineback/routes/age.js b/dan-stineback/routes/age.js deleted file mode 100644 index 5907e31..0000000 --- a/dan-stineback/routes/age.js +++ /dev/null @@ -1,16 +0,0 @@ -'use strict'; -const express = require('express'); -const Cat = require('../schema/cats'); -const Dog = require('../schema/dogs'); -const bodyParser = require('body-parser').json(); -const jsonParser = bodyParser; - -const ageRouter = module.exports = exports = express.Router(); - -ageRouter.get('/', (req, res, next) =>{ - let age; - Cat.find({}, (err, cat)=>{ - if(err) return next(err); - age = (dog.age.length) - }); -}); diff --git a/dan-stineback/routes/router.js b/dan-stineback/routes/router.js new file mode 100644 index 0000000..e729196 --- /dev/null +++ b/dan-stineback/routes/router.js @@ -0,0 +1,30 @@ +'use strict'; +const express = require('express'); +const bodyParser = require('body-parser').json(); +const User = require('../model/user'); +const basicHTTP = require('../lib/basic-http'); + +const router = module.exports = exports = express.Router(); + +router.post('/signup', bodyParser, (req, res, next) => { + let newUser = new User(req.body); + let hashedPassword = newUser.hashedPassword(); + newUser.password = hashedPassword; + req.body.password = null; + User.findOne({username: req.body.username}, (err, user) => { + if (err || user) return next(new Error('could not create user')); + newUser.save((err, user) => { + if (err) return next(new Error('could not create user')); + res.json({token: user.generateToken()}); + }); + }); +}); + +router.get('/signin', basicHTTP, (req, res, next) => { + User.findOne({username: req.auth.username}, (err, user) => { + if (err || !user) return next(new Error('Could not sign in')); + if (!user.comparePassword(req.auth.password)) return next(new Error('Could not sign in')); + + res.json({token: user.generateToken()}); + }); +}); diff --git a/dan-stineback/server.js b/dan-stineback/server.js index 66b98e6..28915ae 100644 --- a/dan-stineback/server.js +++ b/dan-stineback/server.js @@ -5,21 +5,27 @@ const app = express(); const mongoose = require('mongoose'); const morgan = require('morgan'); const errorHandler = require(__dirname + '/lib/error_handling'); +const jwtAuth = require('./lib/jwt_auth'); -const dbPort = process.env.MONGOLAB_URI || 'mongodb://localhost/dev_db'; +const dbPort = process.env.MONGODB_URI || 'mongodb://localhost/dev_db'; mongoose.connect('mongodb://localhost/dev_db'); const dogRouter = require(__dirname + '/routes/dog-route'); const catRouter = require(__dirname + '/routes/cat-route'); -const ageRouter = require(__dirname + '/routes/age'); + app.use(morgan('dev')); app.use('/dogs', dogRouter); app.use('/cats', catRouter); -app.use('/age', ageRouter); + app.use(errorHandler); +app.use((err, req, res, next) => { + res.status(500).json({message: err.message}); + next(err); +}); + app.use((req, res)=> { res.status(404).json({msg: 'page not found test'}); }); diff --git a/dan-stineback/test/test.js b/dan-stineback/test/test.js index 6cef91b..aee63d8 100644 --- a/dan-stineback/test/test.js +++ b/dan-stineback/test/test.js @@ -10,9 +10,9 @@ chai.use(chaiHTTP); const expect = chai.expect; const request = chai.request; -const dbPort = process.env.MONGOLAB_URI; +const dbPort = process.env.MONGODB_URI; -process.env.MONGOLAB_URI = 'mongodb://localhost/test_db'; +process.env.MONGODB_URI = 'mongodb://localhost/test_db'; require('../server'); From c3697e9904a1291b1645c910e2bd44d214059de9 Mon Sep 17 00:00:00 2001 From: Dan Stineback Date: Fri, 3 Jun 2016 10:46:48 -0700 Subject: [PATCH 09/13] fixed all lint bugs --- dan-stineback/.eslintignore | 1 + dan-stineback/gulpfile.js | 2 +- dan-stineback/lib/error_handling.js | 4 -- dan-stineback/{schema => model}/cats.js | 2 +- dan-stineback/{schema => model}/dogs.js | 2 +- dan-stineback/package.json | 73 +++++++++++++------------ dan-stineback/routes/cat-route.js | 10 ++-- dan-stineback/routes/dog-route.js | 10 ++-- dan-stineback/routes/router.js | 4 +- dan-stineback/server.js | 11 ++-- dan-stineback/test/test.js | 27 ++++----- 11 files changed, 67 insertions(+), 79 deletions(-) delete mode 100644 dan-stineback/lib/error_handling.js rename dan-stineback/{schema => model}/cats.js (91%) rename dan-stineback/{schema => model}/dogs.js (91%) diff --git a/dan-stineback/.eslintignore b/dan-stineback/.eslintignore index 5b88cef..0314ab3 100644 --- a/dan-stineback/.eslintignore +++ b/dan-stineback/.eslintignore @@ -3,3 +3,4 @@ **/*.min.js /*.md /package.json +/npm-debug.log diff --git a/dan-stineback/gulpfile.js b/dan-stineback/gulpfile.js index 8efd445..6a8ae3f 100644 --- a/dan-stineback/gulpfile.js +++ b/dan-stineback/gulpfile.js @@ -2,7 +2,7 @@ const gulp = require('gulp'); const eslint = require('gulp-eslint'); const mocha = require('gulp-mocha'); -const watch = require('gulp-watch'); + gulp.task('default', ['lint', 'test'], () => { console.log('started'); diff --git a/dan-stineback/lib/error_handling.js b/dan-stineback/lib/error_handling.js deleted file mode 100644 index 46a8b25..0000000 --- a/dan-stineback/lib/error_handling.js +++ /dev/null @@ -1,4 +0,0 @@ -'use strict'; -module.exports = function (err, req, res, next) { - res.status(500).json({message: 'dan' + err.message}); -}; diff --git a/dan-stineback/schema/cats.js b/dan-stineback/model/cats.js similarity index 91% rename from dan-stineback/schema/cats.js rename to dan-stineback/model/cats.js index cc4b61a..470b647 100644 --- a/dan-stineback/schema/cats.js +++ b/dan-stineback/model/cats.js @@ -4,7 +4,7 @@ const mongoose = require('mongoose'); const Cat = new mongoose.Schema({ name: String, - age: Number, + age: Number }); module.exports = mongoose.model('cat', Cat); diff --git a/dan-stineback/schema/dogs.js b/dan-stineback/model/dogs.js similarity index 91% rename from dan-stineback/schema/dogs.js rename to dan-stineback/model/dogs.js index 42b2ad1..9fdf25f 100644 --- a/dan-stineback/schema/dogs.js +++ b/dan-stineback/model/dogs.js @@ -4,7 +4,7 @@ const mongoose = require('mongoose'); const Dog = new mongoose.Schema({ name: String, - age: Number, + age: Number }); module.exports = mongoose.model('dog', Dog); diff --git a/dan-stineback/package.json b/dan-stineback/package.json index ff49c39..ad41fe3 100644 --- a/dan-stineback/package.json +++ b/dan-stineback/package.json @@ -1,38 +1,39 @@ { - "name": "dan-stineback", - "version": "1.0.0", - "description": "rest api project", - "main": "index.js", - "directories": { - "test": "test" - }, - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/dstineback/rest_api.git" - }, - "author": "dstineback@gmail.com", - "license": "MIT", - "bugs": { - "url": "https://github.com/dstineback/rest_api/issues" - }, - "homepage": "https://github.com/dstineback/rest_api#readme", - "dependencies": { - "bcrypt": "^0.8.6", - "body-parser": "^1.15.1", - "jsonwebtoken": "^7.0.0", - "morgan": "^1.7.0" - }, - "devDependencies": { - "chai": "^3.5.0", - "chai-http": "^2.0.1", - "gulp": "^3.9.1", - "gulp-eslint": "^2.0.0", - "gulp-mocha": "^2.2.0", - "gulp-watch": "^4.3.6", - "mocha": "^2.5.1", - "mongoose": "^4.4.19" - } + "name": "dan-stineback", + "version": "1.0.0", + "description": "rest api project", + "main": "server.js", + "directories": { + "test": "test" + }, + "scripts": { + "test": "./node_modules/mocha/bin/mocha", + "start": "node server.js", + "lint": "./node_modules/eslint/bin/eslint.js *" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/dstineback/rest_api.git" + }, + "author": "dstineback@gmail.com", + "license": "MIT", + "bugs": { + "url": "https://github.com/dstineback/rest_api/issues" + }, + "homepage": "https://github.com/dstineback/rest_api#readme", + "dependencies": { + "bcrypt": "^0.8.6", + "body-parser": "^1.15.1", + "jsonwebtoken": "^7.0.0", + "morgan": "^1.7.0" + }, + "devDependencies": { + "chai": "^3.5.0", + "chai-http": "^2.0.1", + "gulp": "^3.9.1", + "gulp-eslint": "^2.0.0", + "gulp-mocha": "^2.2.0", + "mocha": "^2.5.1", + "mongoose": "^4.4.19" + } } diff --git a/dan-stineback/routes/cat-route.js b/dan-stineback/routes/cat-route.js index cebf8b5..35b9b2e 100644 --- a/dan-stineback/routes/cat-route.js +++ b/dan-stineback/routes/cat-route.js @@ -1,8 +1,8 @@ 'use strict'; const express = require('express'); -const Cat = require('../schema/cats'); +const Cat = require('../model/cats'); const bodyParser = require('body-parser').json(); -const jsonParser = bodyParser; + const catRouter = module.exports = exports = express.Router(); @@ -26,8 +26,7 @@ catRouter.put('/', bodyParser, (req, res, next) => { let _id = req.body._id; Cat.findOneAndUpdate({_id}, req.body, (err, cat) =>{ if (err) return next(err); - let message = "successfully updated"; - res.json({message}); + res.json({message:'successfully updated', data: cat}); }); }); @@ -35,7 +34,6 @@ catRouter.delete('/:id', (req, res, next) => { let _id = req.params.id; Cat.findOneAndRemove({_id}, null, (err, cat) => { if (err) return next(err); - let message = 'successfully deleted'; - res.json({message}); + res.json({message: 'successfully deleted', data: cat}); }); }); diff --git a/dan-stineback/routes/dog-route.js b/dan-stineback/routes/dog-route.js index 307ca6e..3352a77 100644 --- a/dan-stineback/routes/dog-route.js +++ b/dan-stineback/routes/dog-route.js @@ -1,8 +1,8 @@ 'use strict'; const express = require('express'); -const Dog = require('../schema/dogs'); +const Dog = require('../model/dogs'); const bodyParser = require('body-parser').json(); -const jsonParser = bodyParser; + const dogRouter = module.exports = exports = express.Router(); @@ -26,8 +26,7 @@ dogRouter.put('/', bodyParser, (req, res, next) => { let _id = req.body._id; Dog.findOneAndUpdate({_id}, req.body, (err, dog) =>{ if (err) return next(err); - let message = "successfully updated"; - res.json({message}); + res.json({message: 'successfully updated', data: dog}); }); }); @@ -35,7 +34,6 @@ dogRouter.delete('/:id', (req, res, next) => { let _id = req.params.id; Dog.findOneAndRemove({_id}, null, (err, dog) => { if (err) return next(err); - let message = 'successfully deleted'; - res.json({message}); + res.json({message: 'successfully deleted', data: dog}); }); }); diff --git a/dan-stineback/routes/router.js b/dan-stineback/routes/router.js index e729196..0d8c633 100644 --- a/dan-stineback/routes/router.js +++ b/dan-stineback/routes/router.js @@ -15,7 +15,7 @@ router.post('/signup', bodyParser, (req, res, next) => { if (err || user) return next(new Error('could not create user')); newUser.save((err, user) => { if (err) return next(new Error('could not create user')); - res.json({token: user.generateToken()}); + res.json({message: req.body.username + ' We mad a token for you', token: user.generateToken()}); }); }); }); @@ -25,6 +25,6 @@ router.get('/signin', basicHTTP, (req, res, next) => { if (err || !user) return next(new Error('Could not sign in')); if (!user.comparePassword(req.auth.password)) return next(new Error('Could not sign in')); - res.json({token: user.generateToken()}); + res.json({message: req.auth.username + ' Here is your token', token: user.generateToken()}); }); }); diff --git a/dan-stineback/server.js b/dan-stineback/server.js index 28915ae..202bb6e 100644 --- a/dan-stineback/server.js +++ b/dan-stineback/server.js @@ -4,22 +4,19 @@ const express = require('express'); const app = express(); const mongoose = require('mongoose'); const morgan = require('morgan'); -const errorHandler = require(__dirname + '/lib/error_handling'); -const jwtAuth = require('./lib/jwt_auth'); const dbPort = process.env.MONGODB_URI || 'mongodb://localhost/dev_db'; -mongoose.connect('mongodb://localhost/dev_db'); +mongoose.connect(dbPort); const dogRouter = require(__dirname + '/routes/dog-route'); const catRouter = require(__dirname + '/routes/cat-route'); +const authRouter = require(__dirname + '/routes/router'); app.use(morgan('dev')); app.use('/dogs', dogRouter); app.use('/cats', catRouter); - - -app.use(errorHandler); +app.use('/', authRouter); app.use((err, req, res, next) => { res.status(500).json({message: err.message}); @@ -27,6 +24,6 @@ app.use((err, req, res, next) => { }); app.use((req, res)=> { - res.status(404).json({msg: 'page not found test'}); + res.status(404).json({msg: 'page not found'}); }); app.listen(3000, () => console.log('server is up on 3000')); diff --git a/dan-stineback/test/test.js b/dan-stineback/test/test.js index aee63d8..77f1366 100644 --- a/dan-stineback/test/test.js +++ b/dan-stineback/test/test.js @@ -2,8 +2,8 @@ const chai = require('chai'); const chaiHTTP = require('chai-http'); -const Cat = require('../schema/cats'); -const Dog = require('../schema/dogs'); +const Cat = require('../model/cats'); +const Dog = require('../model/dogs'); const mongoose = require('mongoose'); chai.use(chaiHTTP); @@ -20,7 +20,7 @@ describe('Cat test', () => { after((done)=> { process.env.MONGOLAB_URI = dbPort; mongoose.connection.db.dropDatabase(()=>{ - done(); + done(); }); }); it('should get a list of cats', (done) => { @@ -42,7 +42,6 @@ describe('Cat test', () => { expect(res).to.have.status(200); expect(res.body.name).to.eql('Vic'); expect(res.body).to.have.property('_id'); - expect(res.body.size).to.eql('large'); done(); }); }); @@ -69,16 +68,16 @@ describe('Cat test', () => { done(); }); }); - it('should delete a cat', (done)=>{ - request('localhost:3000') + it('should delete a cat', (done)=>{ + request('localhost:3000') .delete('/cats/' + testCat._id) .end((err, res)=>{ expect(err).to.eql(null); expect(res).to.have.status(200); expect(res.body.message).to.eql('successfully deleted'); done(); - }) - }) + }); + }); }); }); @@ -86,7 +85,7 @@ describe('Dog test', () => { after((done)=> { process.env.MONGOLAB_URI = dbPort; mongoose.connection.db.dropDatabase(()=>{ - done(); + done(); }); }); it('should get a list of dogs', (done) => { @@ -108,12 +107,10 @@ describe('Dog test', () => { expect(res).to.have.status(200); expect(res.body.name).to.eql('Vic'); expect(res.body).to.have.property('_id'); - expect(res.body.size).to.eql('large'); done(); }); }); - describe('test that need data', ()=> { let testDog; beforeEach((done)=> { @@ -135,15 +132,15 @@ describe('Dog test', () => { done(); }); }); - it('should delete a dog', (done)=>{ - request('localhost:3000') + it('should delete a dog', (done)=>{ + request('localhost:3000') .delete('/cats/' + testDog._id) .end((err, res)=>{ expect(err).to.eql(null); expect(res).to.have.status(200); expect(res.body.message).to.eql('successfully deleted'); done(); - }) - }) + }); + }); }); }); From 5f37ec6639961b8d1ca2d2fcf902f11f54aa4eb9 Mon Sep 17 00:00:00 2001 From: Dan Stineback Date: Fri, 3 Jun 2016 11:13:05 -0700 Subject: [PATCH 10/13] added test --- dan-stineback/gulpfile.js | 1 - dan-stineback/package.json | 75 +++++++++++++++++++------------------- dan-stineback/server.js | 2 +- dan-stineback/test/test.js | 48 +++++++++++++++++++++++- 4 files changed, 85 insertions(+), 41 deletions(-) diff --git a/dan-stineback/gulpfile.js b/dan-stineback/gulpfile.js index 6a8ae3f..02f092e 100644 --- a/dan-stineback/gulpfile.js +++ b/dan-stineback/gulpfile.js @@ -3,7 +3,6 @@ const gulp = require('gulp'); const eslint = require('gulp-eslint'); const mocha = require('gulp-mocha'); - gulp.task('default', ['lint', 'test'], () => { console.log('started'); }); diff --git a/dan-stineback/package.json b/dan-stineback/package.json index ad41fe3..0456c09 100644 --- a/dan-stineback/package.json +++ b/dan-stineback/package.json @@ -1,39 +1,40 @@ { - "name": "dan-stineback", - "version": "1.0.0", - "description": "rest api project", - "main": "server.js", - "directories": { - "test": "test" - }, - "scripts": { - "test": "./node_modules/mocha/bin/mocha", - "start": "node server.js", - "lint": "./node_modules/eslint/bin/eslint.js *" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/dstineback/rest_api.git" - }, - "author": "dstineback@gmail.com", - "license": "MIT", - "bugs": { - "url": "https://github.com/dstineback/rest_api/issues" - }, - "homepage": "https://github.com/dstineback/rest_api#readme", - "dependencies": { - "bcrypt": "^0.8.6", - "body-parser": "^1.15.1", - "jsonwebtoken": "^7.0.0", - "morgan": "^1.7.0" - }, - "devDependencies": { - "chai": "^3.5.0", - "chai-http": "^2.0.1", - "gulp": "^3.9.1", - "gulp-eslint": "^2.0.0", - "gulp-mocha": "^2.2.0", - "mocha": "^2.5.1", - "mongoose": "^4.4.19" - } + "name": "dan-stineback", + "version": "1.0.0", + "description": "rest api project", + "main": "server.js", + "directories": { + "test": "test" + }, + "scripts": { + "test": "./node_modules/mocha/bin/mocha", + "start": "node server.js", + "lint": "./node_modules/eslint/bin/eslint.js *" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/dstineback/rest_api.git" + }, + "author": "dstineback@gmail.com", + "license": "MIT", + "bugs": { + "url": "https://github.com/dstineback/rest_api/issues" + }, + "homepage": "https://github.com/dstineback/rest_api#readme", + "dependencies": { + "bcrypt": "^0.8.6", + "body-parser": "^1.15.1", + "eslint": "^2.11.1", + "jsonwebtoken": "^7.0.0", + "morgan": "^1.7.0" + }, + "devDependencies": { + "chai": "^3.5.0", + "chai-http": "^2.0.1", + "gulp": "^3.9.1", + "gulp-eslint": "^2.0.0", + "gulp-mocha": "^2.2.0", + "mocha": "^2.5.1", + "mongoose": "^4.4.19" + } } diff --git a/dan-stineback/server.js b/dan-stineback/server.js index 202bb6e..ff9fdc3 100644 --- a/dan-stineback/server.js +++ b/dan-stineback/server.js @@ -24,6 +24,6 @@ app.use((err, req, res, next) => { }); app.use((req, res)=> { - res.status(404).json({msg: 'page not found'}); + res.status(404).json({message: 'not found'}); }); app.listen(3000, () => console.log('server is up on 3000')); diff --git a/dan-stineback/test/test.js b/dan-stineback/test/test.js index 77f1366..ae5d9d0 100644 --- a/dan-stineback/test/test.js +++ b/dan-stineback/test/test.js @@ -4,6 +4,7 @@ const chai = require('chai'); const chaiHTTP = require('chai-http'); const Cat = require('../model/cats'); const Dog = require('../model/dogs'); +const basic = require('../lib/basic-http'); const mongoose = require('mongoose'); chai.use(chaiHTTP); @@ -18,7 +19,7 @@ require('../server'); describe('Cat test', () => { after((done)=> { - process.env.MONGOLAB_URI = dbPort; + process.env.MONGODB_URI = dbPort; mongoose.connection.db.dropDatabase(()=>{ done(); }); @@ -83,7 +84,7 @@ describe('Cat test', () => { describe('Dog test', () => { after((done)=> { - process.env.MONGOLAB_URI = dbPort; + process.env.MONGODB_URI = dbPort; mongoose.connection.db.dropDatabase(()=>{ done(); }); @@ -144,3 +145,46 @@ describe('Dog test', () => { }); }); }); + +describe('unit tests for auth', () => { + it('should auth a user', () => { + let baseString = new Buffer('vic:password').toString('base64'); + let authString = 'Basic ' + baseString; + let req = {headers:{authorization: authString}}; + basic(req, {}, () => { + expect(req.auth).to.eql({username: 'vic', password: 'password'}); + }); + }); +}); + +describe('signin tests', () => { + after((done)=> { + process.env.MONGODB_URI = dbPort; + mongoose.connection.db.dropDatabase(() => { + done(); + }); + }); + it('should have a token', (done) => { + request('localhost:3000') + .post('/signup') + .send({username:'vic', password:'vic'}) + .end((err,res) => { + expect(err).to.eql(null); + expect(res.body).to.have.property('token'); + done(); + }); + }); +}); + +describe('catch error test', () => { + it('should give an error for unsupported routes', (done) => { + request('localhost:3000') + .get('/*') + .end((err, res) => { + expect(err).to.not.eql(null); + expect(res).to.have.status(404); + expect(res.body).to.eql({message: 'not found'}); + done(); + }); + }); +}); From ecc3835d08201cc7b4eda16cc2f7bf0b5c9bd7e3 Mon Sep 17 00:00:00 2001 From: Dan Stineback Date: Fri, 3 Jun 2016 11:25:30 -0700 Subject: [PATCH 11/13] changed some messages --- dan-stineback/routes/router.js | 6 +++--- dan-stineback/server.js | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/dan-stineback/routes/router.js b/dan-stineback/routes/router.js index 0d8c633..4a93d15 100644 --- a/dan-stineback/routes/router.js +++ b/dan-stineback/routes/router.js @@ -12,9 +12,9 @@ router.post('/signup', bodyParser, (req, res, next) => { newUser.password = hashedPassword; req.body.password = null; User.findOne({username: req.body.username}, (err, user) => { - if (err || user) return next(new Error('could not create user')); + if (err || user) return next(new Error('User name already used')); newUser.save((err, user) => { - if (err) return next(new Error('could not create user')); + if (err) return next(new Error('Could not save user')); res.json({message: req.body.username + ' We mad a token for you', token: user.generateToken()}); }); }); @@ -23,7 +23,7 @@ router.post('/signup', bodyParser, (req, res, next) => { router.get('/signin', basicHTTP, (req, res, next) => { User.findOne({username: req.auth.username}, (err, user) => { if (err || !user) return next(new Error('Could not sign in')); - if (!user.comparePassword(req.auth.password)) return next(new Error('Could not sign in')); + if (!user.comparePassword(req.auth.password)) return next(new Error('wrong password')); res.json({message: req.auth.username + ' Here is your token', token: user.generateToken()}); }); diff --git a/dan-stineback/server.js b/dan-stineback/server.js index ff9fdc3..bdc0180 100644 --- a/dan-stineback/server.js +++ b/dan-stineback/server.js @@ -12,7 +12,6 @@ const dogRouter = require(__dirname + '/routes/dog-route'); const catRouter = require(__dirname + '/routes/cat-route'); const authRouter = require(__dirname + '/routes/router'); - app.use(morgan('dev')); app.use('/dogs', dogRouter); app.use('/cats', catRouter); From 5e7aab25f4e3644f8a114b0acef79fed4fc97eb7 Mon Sep 17 00:00:00 2001 From: Dan Stineback Date: Mon, 20 Jun 2016 12:36:53 -0700 Subject: [PATCH 12/13] commented out auth for class --- dan-stineback/package.json | 1 + dan-stineback/server.js | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/dan-stineback/package.json b/dan-stineback/package.json index 0456c09..591142b 100644 --- a/dan-stineback/package.json +++ b/dan-stineback/package.json @@ -24,6 +24,7 @@ "dependencies": { "bcrypt": "^0.8.6", "body-parser": "^1.15.1", + "cors": "^2.7.1", "eslint": "^2.11.1", "jsonwebtoken": "^7.0.0", "morgan": "^1.7.0" diff --git a/dan-stineback/server.js b/dan-stineback/server.js index bdc0180..9894de2 100644 --- a/dan-stineback/server.js +++ b/dan-stineback/server.js @@ -4,18 +4,21 @@ const express = require('express'); const app = express(); const mongoose = require('mongoose'); const morgan = require('morgan'); +const cors = require('cors'); + const dbPort = process.env.MONGODB_URI || 'mongodb://localhost/dev_db'; mongoose.connect(dbPort); const dogRouter = require(__dirname + '/routes/dog-route'); const catRouter = require(__dirname + '/routes/cat-route'); -const authRouter = require(__dirname + '/routes/router'); +// const authRouter = require(__dirname + '/routes/router'); +app.use(cors()); app.use(morgan('dev')); app.use('/dogs', dogRouter); app.use('/cats', catRouter); -app.use('/', authRouter); +// app.use('/', authRouter); app.use((err, req, res, next) => { res.status(500).json({message: err.message}); From 9a1e23349a753a38f23a5a450c8bf33603f94939 Mon Sep 17 00:00:00 2001 From: Dan Stineback Date: Fri, 8 Jul 2016 16:13:40 -0700 Subject: [PATCH 13/13] added auth again --- dan-stineback/lib/jwt_auth.js | 4 +++- dan-stineback/routes/cat-route.js | 7 ++++--- dan-stineback/routes/dog-route.js | 8 ++++---- dan-stineback/routes/router.js | 2 +- dan-stineback/server.js | 4 ++-- 5 files changed, 14 insertions(+), 11 deletions(-) diff --git a/dan-stineback/lib/jwt_auth.js b/dan-stineback/lib/jwt_auth.js index 7218a7a..e3fd8db 100644 --- a/dan-stineback/lib/jwt_auth.js +++ b/dan-stineback/lib/jwt_auth.js @@ -5,7 +5,9 @@ const User = require('../model/user'); const secret = process.env.SECRET || 'changeme'; module.exports = function(req, res, next) { - let token = req.body.token || req.headers.token; + + + let token = req.headers.token || req.body.token; let tokenErr = new Error('Authorization Failure'); let decodedToken; diff --git a/dan-stineback/routes/cat-route.js b/dan-stineback/routes/cat-route.js index 35b9b2e..8850da7 100644 --- a/dan-stineback/routes/cat-route.js +++ b/dan-stineback/routes/cat-route.js @@ -2,6 +2,7 @@ const express = require('express'); const Cat = require('../model/cats'); const bodyParser = require('body-parser').json(); +const jwtAuth = require('../lib/jwt_auth'); const catRouter = module.exports = exports = express.Router(); @@ -14,7 +15,7 @@ catRouter.get('/', (req, res, next) => { }); }); -catRouter.post('/', bodyParser, (req, res, next) => { +catRouter.post('/', bodyParser, jwtAuth, (req, res, next) => { let newCat = new Cat(req.body); newCat.save((err, cat)=> { if (err) return next(err); @@ -22,7 +23,7 @@ catRouter.post('/', bodyParser, (req, res, next) => { }); }); -catRouter.put('/', bodyParser, (req, res, next) => { +catRouter.put('/', bodyParser, jwtAuth, (req, res, next) => { let _id = req.body._id; Cat.findOneAndUpdate({_id}, req.body, (err, cat) =>{ if (err) return next(err); @@ -30,7 +31,7 @@ catRouter.put('/', bodyParser, (req, res, next) => { }); }); -catRouter.delete('/:id', (req, res, next) => { +catRouter.delete('/:id', jwtAuth, (req, res, next) => { let _id = req.params.id; Cat.findOneAndRemove({_id}, null, (err, cat) => { if (err) return next(err); diff --git a/dan-stineback/routes/dog-route.js b/dan-stineback/routes/dog-route.js index 3352a77..904832f 100644 --- a/dan-stineback/routes/dog-route.js +++ b/dan-stineback/routes/dog-route.js @@ -2,7 +2,7 @@ const express = require('express'); const Dog = require('../model/dogs'); const bodyParser = require('body-parser').json(); - +const jwtAuth = require('../lib/jwt_auth'); const dogRouter = module.exports = exports = express.Router(); @@ -14,7 +14,7 @@ dogRouter.get('/', (req, res, next) => { }); }); -dogRouter.post('/', bodyParser, (req, res, next) => { +dogRouter.post('/', bodyParser, jwtAuth, (req, res, next) => { let newDog = new Dog(req.body); newDog.save((err, dog)=> { if (err) return next(err); @@ -22,7 +22,7 @@ dogRouter.post('/', bodyParser, (req, res, next) => { }); }); -dogRouter.put('/', bodyParser, (req, res, next) => { +dogRouter.put('/', bodyParser, jwtAuth, (req, res, next) => { let _id = req.body._id; Dog.findOneAndUpdate({_id}, req.body, (err, dog) =>{ if (err) return next(err); @@ -30,7 +30,7 @@ dogRouter.put('/', bodyParser, (req, res, next) => { }); }); -dogRouter.delete('/:id', (req, res, next) => { +dogRouter.delete('/:id', jwtAuth, (req, res, next) => { let _id = req.params.id; Dog.findOneAndRemove({_id}, null, (err, dog) => { if (err) return next(err); diff --git a/dan-stineback/routes/router.js b/dan-stineback/routes/router.js index 4a93d15..c6cc9b6 100644 --- a/dan-stineback/routes/router.js +++ b/dan-stineback/routes/router.js @@ -20,7 +20,7 @@ router.post('/signup', bodyParser, (req, res, next) => { }); }); -router.get('/signin', basicHTTP, (req, res, next) => { +router.post('/signin', basicHTTP, (req, res, next) => { User.findOne({username: req.auth.username}, (err, user) => { if (err || !user) return next(new Error('Could not sign in')); if (!user.comparePassword(req.auth.password)) return next(new Error('wrong password')); diff --git a/dan-stineback/server.js b/dan-stineback/server.js index 9894de2..e915913 100644 --- a/dan-stineback/server.js +++ b/dan-stineback/server.js @@ -12,13 +12,13 @@ mongoose.connect(dbPort); const dogRouter = require(__dirname + '/routes/dog-route'); const catRouter = require(__dirname + '/routes/cat-route'); -// const authRouter = require(__dirname + '/routes/router'); +const authRouter = require(__dirname + '/routes/router'); app.use(cors()); app.use(morgan('dev')); app.use('/dogs', dogRouter); app.use('/cats', catRouter); -// app.use('/', authRouter); +app.use('/', authRouter); app.use((err, req, res, next) => { res.status(500).json({message: err.message});