From 04d5265424bc31c373e0dde28f2d887fee94a50f Mon Sep 17 00:00:00 2001 From: Victor Benavente Date: Tue, 24 May 2016 10:44:52 -0700 Subject: [PATCH 01/18] set up file structure, added testing and gulpfile --- vic-class11-assignment/.gitignore | 1 + vic-class11-assignment/gulpfile.js | 21 ++++++++ vic-class11-assignment/index.js | 1 + vic-class11-assignment/lib/server.js | 7 +++ vic-class11-assignment/package.json | 33 +++++++++++++ vic-class11-assignment/test/test.js | 72 ++++++++++++++++++++++++++++ 6 files changed, 135 insertions(+) create mode 100644 vic-class11-assignment/.gitignore create mode 100644 vic-class11-assignment/gulpfile.js create mode 100644 vic-class11-assignment/index.js create mode 100644 vic-class11-assignment/lib/server.js create mode 100644 vic-class11-assignment/package.json create mode 100644 vic-class11-assignment/test/test.js diff --git a/vic-class11-assignment/.gitignore b/vic-class11-assignment/.gitignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/vic-class11-assignment/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/vic-class11-assignment/gulpfile.js b/vic-class11-assignment/gulpfile.js new file mode 100644 index 0000000..981fa96 --- /dev/null +++ b/vic-class11-assignment/gulpfile.js @@ -0,0 +1,21 @@ +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'); +}) + +gulp.task('lint', () => { + gulp.src('/server.js') + .pipe(eslint()) + .pipe(eslint.format()); +}); + +gulp.task('test', () => { + gulp.src('test/*.js') + .pipe(mocha()); +}); + +gulp.watch('./**/*.js', ['lint', 'test']); diff --git a/vic-class11-assignment/index.js b/vic-class11-assignment/index.js new file mode 100644 index 0000000..ac6b61b --- /dev/null +++ b/vic-class11-assignment/index.js @@ -0,0 +1 @@ +module.exports = require(__dirname + '/lib/server.js'); diff --git a/vic-class11-assignment/lib/server.js b/vic-class11-assignment/lib/server.js new file mode 100644 index 0000000..35e4327 --- /dev/null +++ b/vic-class11-assignment/lib/server.js @@ -0,0 +1,7 @@ +'use strict'; + +const express = require('express') +const app = express(); +const bodyParser = require('body-parser'); +const jsonParser = bodyParser.json() +const myRouter = express.Router(); diff --git a/vic-class11-assignment/package.json b/vic-class11-assignment/package.json new file mode 100644 index 0000000..0348304 --- /dev/null +++ b/vic-class11-assignment/package.json @@ -0,0 +1,33 @@ +{ + "name": "rest_api", + "version": "1.0.0", + "description": "##To Submit this Assignment * fork this repository * write all of your code in a folder containing your name * push to your repository * submit a pull request to this repository * submit a link to your PR in canvas", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/vbenavente/rest_api.git" + }, + "keywords": [], + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/vbenavente/rest_api/issues" + }, + "homepage": "https://github.com/vbenavente/rest_api#readme", + "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.2" + }, + "dependencies": { + "body-parser": "^1.15.1", + "express": "^4.13.4" + } +} diff --git a/vic-class11-assignment/test/test.js b/vic-class11-assignment/test/test.js new file mode 100644 index 0000000..b88a1c7 --- /dev/null +++ b/vic-class11-assignment/test/test.js @@ -0,0 +1,72 @@ +'use strict'; + +const fs = require('fs'); +const chai = require('chai'); +const chaiHTTP = require('chai-http'); +const expect = chai.expect; +chai.use(chaiHTTP); +const request = chai.request; + +const server = require(__dirname + '/../lib/server'); + +require('../index'); + +describe('Testing CRUD routes', () => { + it('should respond with 404 to bad path', () => { + request('localhost:3000') + .get('/badpath') + .end((err, res) => { + expect(err).to.not.eql(null); + expect(res).to.have.status(404); + expect(res.text).to.eql('not found') + }); + }); + it('should return a get message', (done) => { + request('localhost:3000') + .get('/articles') + .end((err, res) => { + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.text).to.eql('get success\n'); + done(); + }); + }); + it('should return a post message', (done) => { + request('localhost:3000') + .post('/articles') + .end((err, res) => { + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.text).to.eql('post success\n'); + done(); + }); + }); + it('should return a put message', (done) => { + request('localhost:3000') + .put('/articles') + .end((err, res) => { + expect(err).to.eql(null); + expect(res).to.have.status(200) + expect(res.text).to.eql('put success\n'); + done(); + }); + }); + it('should return a patch message', (done) => { + request('localhost:3000') + .patch('/articles') + .end((err, res) => { + expect(err).to.eql(null); + expect(res).to.have.status(200) + expect(res.text).to.eql('patch success\n'); + }); + }); + it('should return a delete message', (done) => { + request('localhost:3000') + .delete('/articles') + .end((err, res) => { + expect(err).to.eql(null); + expect(res).to.have.status(200) + expect(res.text).to.eql('delete success\n'); + }); + }); +}); From a6cf4feeedefeda3f3a3474bc11a73373d521157 Mon Sep 17 00:00:00 2001 From: Victor Benavente Date: Tue, 24 May 2016 23:29:44 -0700 Subject: [PATCH 02/18] adding CRUD routes for resource, working on persistance for testing --- vic-class11-assignment/lib/server.js | 49 ++++++++++++++++++++++++++++ vic-class11-assignment/test/test.js | 19 ++++++----- 2 files changed, 60 insertions(+), 8 deletions(-) diff --git a/vic-class11-assignment/lib/server.js b/vic-class11-assignment/lib/server.js index 35e4327..2eccec5 100644 --- a/vic-class11-assignment/lib/server.js +++ b/vic-class11-assignment/lib/server.js @@ -5,3 +5,52 @@ const app = express(); const bodyParser = require('body-parser'); const jsonParser = bodyParser.json() const myRouter = express.Router(); + +const model = { + nodata: { + msg: 'no model' + } +}; + +app.use(jsonParser); + +app.use((req, res, next) => { + req.model = model; + next(); +}) + +app.use((req, res, next) => { + console.log('Request:', req.url); + next(); +}) + +myRouter.get('/', (req, res) => { + res.send('You get me'); +}); + +app.get('/:id', (req, res) => { + let id = req.params.id; + res.json({message: id.toUpperCase()}); +}); + +app.post('/articles', (req, res) => { + res.json({message: 'post success'}) +}); + +app.put('/articles', (req, res) => { + res.json({message: 'put success'}); +}); + +app.patch('/articles', (req, res) => { + res.json({message: 'patch success'}); +}); + +app.delete('/articles', (req, res) => { + res.json({message: 'delete success'}); +}); + +app.get('/*', (req, res) => { + res.status(404).json({message: 'not found'}); +}) + +app.listen(3000, () => console.log('up on 3000')); diff --git a/vic-class11-assignment/test/test.js b/vic-class11-assignment/test/test.js index b88a1c7..ebe5a67 100644 --- a/vic-class11-assignment/test/test.js +++ b/vic-class11-assignment/test/test.js @@ -12,13 +12,14 @@ const server = require(__dirname + '/../lib/server'); require('../index'); describe('Testing CRUD routes', () => { - it('should respond with 404 to bad path', () => { + it('should respond with 404 to bad path', (done) => { request('localhost:3000') - .get('/badpath') + .get('/*') .end((err, res) => { expect(err).to.not.eql(null); expect(res).to.have.status(404); expect(res.text).to.eql('not found') + done(); }); }); it('should return a get message', (done) => { @@ -27,7 +28,7 @@ describe('Testing CRUD routes', () => { .end((err, res) => { expect(err).to.eql(null); expect(res).to.have.status(200); - expect(res.text).to.eql('get success\n'); + expect(res.text).to.eql('{"message":"ARTICLES"}'); done(); }); }); @@ -37,7 +38,7 @@ describe('Testing CRUD routes', () => { .end((err, res) => { expect(err).to.eql(null); expect(res).to.have.status(200); - expect(res.text).to.eql('post success\n'); + expect(res.text).to.eql('{"message":"post success"}'); done(); }); }); @@ -47,7 +48,7 @@ describe('Testing CRUD routes', () => { .end((err, res) => { expect(err).to.eql(null); expect(res).to.have.status(200) - expect(res.text).to.eql('put success\n'); + expect(res.text).to.eql('{"message":"put success"}'); done(); }); }); @@ -57,16 +58,18 @@ describe('Testing CRUD routes', () => { .end((err, res) => { expect(err).to.eql(null); expect(res).to.have.status(200) - expect(res.text).to.eql('patch success\n'); + expect(res.text).to.eql('{"message":"patch success"}'); + done(); }); }); it('should return a delete message', (done) => { request('localhost:3000') .delete('/articles') .end((err, res) => { - expect(err).to.eql(null); + expect(err).to.not.eql(null); expect(res).to.have.status(200) - expect(res.text).to.eql('delete success\n'); + expect(res.text).to.eql('{"message":"delete success"}'); + done(); }); }); }); From f4e64f740a2d2112236d7ce2fb083c3829c06088 Mon Sep 17 00:00:00 2001 From: Victor Benavente Date: Tue, 24 May 2016 23:53:45 -0700 Subject: [PATCH 03/18] working on switching to myRouter on articles resource --- vic-class11-assignment/lib/server.js | 25 +++++++++++++++++++------ vic-class11-assignment/test/test.js | 4 ++-- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/vic-class11-assignment/lib/server.js b/vic-class11-assignment/lib/server.js index 2eccec5..cc043ed 100644 --- a/vic-class11-assignment/lib/server.js +++ b/vic-class11-assignment/lib/server.js @@ -25,7 +25,12 @@ app.use((req, res, next) => { }) myRouter.get('/', (req, res) => { - res.send('You get me'); + res.type('json'); + if (model.data) { + res.json(model.data); + } else { + res.json(model.nodata) + } }); app.get('/:id', (req, res) => { @@ -33,22 +38,30 @@ app.get('/:id', (req, res) => { res.json({message: id.toUpperCase()}); }); -app.post('/articles', (req, res) => { - res.json({message: 'post success'}) +myRouter.post('/articles', (req, res) => { + res.type('json'); + res.json({message: 'post success', data: req.body}); }); -app.put('/articles', (req, res) => { +myRouter.put('/articles', (req, res) => { res.json({message: 'put success'}); }); -app.patch('/articles', (req, res) => { +myRouter.patch('/articles', (req, res) => { res.json({message: 'patch success'}); }); -app.delete('/articles', (req, res) => { +myRouter.delete('/articles', (req, res) => { res.json({message: 'delete success'}); }); +app.use('/articles', myRouter); + +app.use((err, req, res, next) => { + console.log(err); + res.status(err.statusCode || 500).json({message: err.message}); +}); + app.get('/*', (req, res) => { res.status(404).json({message: 'not found'}); }) diff --git a/vic-class11-assignment/test/test.js b/vic-class11-assignment/test/test.js index ebe5a67..86746c6 100644 --- a/vic-class11-assignment/test/test.js +++ b/vic-class11-assignment/test/test.js @@ -16,7 +16,7 @@ describe('Testing CRUD routes', () => { request('localhost:3000') .get('/*') .end((err, res) => { - expect(err).to.not.eql(null); + expect(err).to.eql(null); expect(res).to.have.status(404); expect(res.text).to.eql('not found') done(); @@ -66,7 +66,7 @@ describe('Testing CRUD routes', () => { request('localhost:3000') .delete('/articles') .end((err, res) => { - expect(err).to.not.eql(null); + expect(err).to.eql(null); expect(res).to.have.status(200) expect(res.text).to.eql('{"message":"delete success"}'); done(); From dadac8f8c451033d1108686d057308732958aab9 Mon Sep 17 00:00:00 2001 From: Victor Benavente Date: Wed, 25 May 2016 00:40:51 -0700 Subject: [PATCH 04/18] testing is now working --- vic-class11-assignment/lib/server.js | 65 ++++++++++++++-------------- vic-class11-assignment/test/test.js | 34 ++++++++------- 2 files changed, 51 insertions(+), 48 deletions(-) diff --git a/vic-class11-assignment/lib/server.js b/vic-class11-assignment/lib/server.js index cc043ed..63c8960 100644 --- a/vic-class11-assignment/lib/server.js +++ b/vic-class11-assignment/lib/server.js @@ -6,61 +6,62 @@ const bodyParser = require('body-parser'); const jsonParser = bodyParser.json() const myRouter = express.Router(); -const model = { - nodata: { - msg: 'no model' - } -}; +// const model = { +// nodata: { +// msg: 'no model' +// } +// }; app.use(jsonParser); -app.use((req, res, next) => { - req.model = model; - next(); -}) +// app.use((req, res, next) => { +// req.model = model; +// next(); +// }) -app.use((req, res, next) => { - console.log('Request:', req.url); - next(); -}) +// app.use((req, res, next) => { +// console.log('Request:', req.url); +// next(); +// }) -myRouter.get('/', (req, res) => { - res.type('json'); - if (model.data) { - res.json(model.data); - } else { - res.json(model.nodata) - } -}); +// myRouter.get('/', (req, res) => { +// res.type('json'); +// if (model.data) { +// res.json(model.data); +// } else { +// res.json(model.nodata) +// } +// }); -app.get('/:id', (req, res) => { +myRouter.get('/:id', (req, res) => { let id = req.params.id; res.json({message: id.toUpperCase()}); }); -myRouter.post('/articles', (req, res) => { - res.type('json'); - res.json({message: 'post success', data: req.body}); +myRouter.post('/', (req, res) => { + console.log('post is doing something') + // res.type('json'); + res.json({message: 'post success'}); }); -myRouter.put('/articles', (req, res) => { +myRouter.put('/', (req, res) => { res.json({message: 'put success'}); }); -myRouter.patch('/articles', (req, res) => { +myRouter.patch('/', (req, res) => { res.json({message: 'patch success'}); }); -myRouter.delete('/articles', (req, res) => { +myRouter.delete('/', (req, res) => { res.json({message: 'delete success'}); }); app.use('/articles', myRouter); -app.use((err, req, res, next) => { - console.log(err); - res.status(err.statusCode || 500).json({message: err.message}); -}); +// app.use((err, req, res, next) => { +// console.log(err); +// res.status(err.statusCode || 500).json({message: err.message}); +//}); app.get('/*', (req, res) => { res.status(404).json({message: 'not found'}); diff --git a/vic-class11-assignment/test/test.js b/vic-class11-assignment/test/test.js index 86746c6..b66ba5d 100644 --- a/vic-class11-assignment/test/test.js +++ b/vic-class11-assignment/test/test.js @@ -12,29 +12,29 @@ const server = require(__dirname + '/../lib/server'); require('../index'); describe('Testing CRUD routes', () => { - it('should respond with 404 to bad path', (done) => { + it('should respond with 404 to bad path', () => { request('localhost:3000') - .get('/*') + .get('/badpath') .end((err, res) => { - expect(err).to.eql(null); + expect(err).to.not.eql(null); expect(res).to.have.status(404); - expect(res.text).to.eql('not found') - done(); + expect(res.text).to.eql('{"message":"not found"}'); }); }); it('should return a get message', (done) => { - request('localhost:3000') - .get('/articles') + request('localhost:3000/articles') + .get('/more') .end((err, res) => { expect(err).to.eql(null); expect(res).to.have.status(200); - expect(res.text).to.eql('{"message":"ARTICLES"}'); + expect(res.text).to.eql('{"message":"MORE"}'); done(); }); }); it('should return a post message', (done) => { - request('localhost:3000') - .post('/articles') + request('localhost:3000/articles') + .post('/') + .send({}) .end((err, res) => { expect(err).to.eql(null); expect(res).to.have.status(200); @@ -43,8 +43,9 @@ describe('Testing CRUD routes', () => { }); }); it('should return a put message', (done) => { - request('localhost:3000') - .put('/articles') + request('localhost:3000/articles') + .put('/') + .send({}) .end((err, res) => { expect(err).to.eql(null); expect(res).to.have.status(200) @@ -53,8 +54,9 @@ describe('Testing CRUD routes', () => { }); }); it('should return a patch message', (done) => { - request('localhost:3000') - .patch('/articles') + request('localhost:3000/articles') + .patch('/') + .send({}) .end((err, res) => { expect(err).to.eql(null); expect(res).to.have.status(200) @@ -63,8 +65,8 @@ describe('Testing CRUD routes', () => { }); }); it('should return a delete message', (done) => { - request('localhost:3000') - .delete('/articles') + request('localhost:3000/articles') + .delete('/') .end((err, res) => { expect(err).to.eql(null); expect(res).to.have.status(200) From aed5ce1e62583474cbd49e7f8e863c214ccafdde Mon Sep 17 00:00:00 2001 From: Victor Benavente Date: Fri, 27 May 2016 12:13:45 -0700 Subject: [PATCH 05/18] added routes, schema, and testing for two resource api --- vic-class11-assignment/index.js | 2 +- vic-class11-assignment/lib/error_handling.js | 3 + vic-class11-assignment/lib/server.js | 70 ------------ .../routes/icecream_routes.js | 42 ++++++++ .../routes/milkshake_routes.js | 41 +++++++ vic-class11-assignment/schema/icecream.js | 11 ++ vic-class11-assignment/schema/milkshake.js | 11 ++ vic-class11-assignment/server.js | 29 +++++ vic-class11-assignment/test/milkshake_test.js | 0 vic-class11-assignment/test/test.js | 101 ++++++++++-------- 10 files changed, 196 insertions(+), 114 deletions(-) create mode 100644 vic-class11-assignment/lib/error_handling.js delete mode 100644 vic-class11-assignment/lib/server.js create mode 100644 vic-class11-assignment/routes/icecream_routes.js create mode 100644 vic-class11-assignment/routes/milkshake_routes.js create mode 100644 vic-class11-assignment/schema/icecream.js create mode 100644 vic-class11-assignment/schema/milkshake.js create mode 100644 vic-class11-assignment/server.js create mode 100644 vic-class11-assignment/test/milkshake_test.js diff --git a/vic-class11-assignment/index.js b/vic-class11-assignment/index.js index ac6b61b..d3a98f5 100644 --- a/vic-class11-assignment/index.js +++ b/vic-class11-assignment/index.js @@ -1 +1 @@ -module.exports = require(__dirname + '/lib/server.js'); +module.exports = require(__dirname + '/server.js'); diff --git a/vic-class11-assignment/lib/error_handling.js b/vic-class11-assignment/lib/error_handling.js new file mode 100644 index 0000000..bd4b571 --- /dev/null +++ b/vic-class11-assignment/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/vic-class11-assignment/lib/server.js b/vic-class11-assignment/lib/server.js deleted file mode 100644 index 63c8960..0000000 --- a/vic-class11-assignment/lib/server.js +++ /dev/null @@ -1,70 +0,0 @@ -'use strict'; - -const express = require('express') -const app = express(); -const bodyParser = require('body-parser'); -const jsonParser = bodyParser.json() -const myRouter = express.Router(); - -// const model = { -// nodata: { -// msg: 'no model' -// } -// }; - -app.use(jsonParser); - -// app.use((req, res, next) => { -// req.model = model; -// next(); -// }) - -// app.use((req, res, next) => { -// console.log('Request:', req.url); -// next(); -// }) - -// myRouter.get('/', (req, res) => { -// res.type('json'); -// if (model.data) { -// res.json(model.data); -// } else { -// res.json(model.nodata) -// } -// }); - -myRouter.get('/:id', (req, res) => { - let id = req.params.id; - res.json({message: id.toUpperCase()}); -}); - -myRouter.post('/', (req, res) => { - console.log('post is doing something') - // res.type('json'); - res.json({message: 'post success'}); -}); - -myRouter.put('/', (req, res) => { - res.json({message: 'put success'}); -}); - -myRouter.patch('/', (req, res) => { - res.json({message: 'patch success'}); -}); - -myRouter.delete('/', (req, res) => { - res.json({message: 'delete success'}); -}); - -app.use('/articles', myRouter); - -// app.use((err, req, res, next) => { -// console.log(err); -// res.status(err.statusCode || 500).json({message: err.message}); -//}); - -app.get('/*', (req, res) => { - res.status(404).json({message: 'not found'}); -}) - -app.listen(3000, () => console.log('up on 3000')); diff --git a/vic-class11-assignment/routes/icecream_routes.js b/vic-class11-assignment/routes/icecream_routes.js new file mode 100644 index 0000000..7ff97d3 --- /dev/null +++ b/vic-class11-assignment/routes/icecream_routes.js @@ -0,0 +1,42 @@ +'use strict'; + +const express = require('express'); +const bodyParser = require('body-parser'); +const jsonParser = bodyParser.json(); +const IceCream = require('../schema/icecream'); + +const iceCreamRouter = module.exports = exports = express.Router(); + +iceCreamRouter.get('/', (req, res, next) => { + IceCream.find({}, (err, icecream) => { + if(err) return next(err); + res.json(icecream); + }); +}); + +iceCreamRouter.post('/', jsonParser, (req, res) => { + let newIceCream = new IceCream(req.body); + newIceCream.save((err, icecream) => { + if(err) return next(err); + res.json(icecream); + }); +}); + +iceCreamRouter.put('/:id', jsonParser, (req, res, next) => { + let _id = req.params.id; + console.log('looking for id and req.body', _id, req.body) + IceCream.findOneAndUpdate({_id}, req.body, (err, icecream) => { + if(err) return next(err); + let message = 'successfully updated'; + res.json({message}); + }); +}); + +iceCreamRouter.delete('/:id', (req, res, next) => { + let _id = req.params.id; + IceCream.findOneAndRemove({_id}, (err, icecream) => { + if(err) return next(err); + let message = 'successfully deleted'; + res.json({message}); + }); +}); diff --git a/vic-class11-assignment/routes/milkshake_routes.js b/vic-class11-assignment/routes/milkshake_routes.js new file mode 100644 index 0000000..559aa47 --- /dev/null +++ b/vic-class11-assignment/routes/milkshake_routes.js @@ -0,0 +1,41 @@ +'use strict' + +const express = require('express'); +const bodyParser = require('body-parser'); +const jsonParser = bodyParser.json(); +const MilkShake = require('../schema/milkshake'); + +const milkShakeRouter = module.exports = exports = express.Router(); + +milkShakeRouter.get('/', (req, res, next) => { + MilkShake.find({}, (err, milkshakes) => { + if(err) return next(err); + res.json(milkshakes); + }); +}); + +milkShakeRouter.post('/', jsonParser, (req, res) => { + let newMilkshake = new MilkShake(req.body); + newMilkShake.save((err, milkshake) => { + if(err) return next(err); + res.json(milkshake); + }); +}); + +milkShakeRouter.put('/', jsonParser, (req, res) => { + let _id = req.body._id; + MilkShake.findOneAndUpdate({_id}, req,body, (err, milkshake) => { + if(err) return next(err); + let message = 'successfully updated'; + res.json({message}); + }); +}); + +milkShakeRouter.delete('/:id', (req, res, next) => { + let _id = req.params.id; + MilkShake.findOneAndRemove({_id}, (err, milkshake) => { + if(err) return next(err); + let message = 'successfully deleted'; + res.json({message}); + }); +}); diff --git a/vic-class11-assignment/schema/icecream.js b/vic-class11-assignment/schema/icecream.js new file mode 100644 index 0000000..676f139 --- /dev/null +++ b/vic-class11-assignment/schema/icecream.js @@ -0,0 +1,11 @@ +'use strict' + +const mongoose = require('mongoose'); + +const IceCream = new mongoose.Schema({ + flavor: String, + scoops: Number, + vessel: String +}); + +module.exports = mongoose.model('icecream', IceCream); diff --git a/vic-class11-assignment/schema/milkshake.js b/vic-class11-assignment/schema/milkshake.js new file mode 100644 index 0000000..35bc324 --- /dev/null +++ b/vic-class11-assignment/schema/milkshake.js @@ -0,0 +1,11 @@ +'use strict'; + +const mongoose = require('mongoose'); + +const MilkShake = new mongoose.Schema({ + flavor: String, + scoops: Number, + milkRichness: String +}); + +module.exports = mongoose.model('milkshake', MilkShake); diff --git a/vic-class11-assignment/server.js b/vic-class11-assignment/server.js new file mode 100644 index 0000000..1bfd8ec --- /dev/null +++ b/vic-class11-assignment/server.js @@ -0,0 +1,29 @@ +'use strict'; + +const express = require('express') +const app = express(); +const mongoose = require('mongoose'); +const morgan = require('morgan'); +const errorHandler = require('./lib/error_handling'); + +const dbPort = process.env.MONGOLAB_URI || 'mongodb://localhost/dev_db'; + +mongoose.connect(dbPort); + +const iceCreamRouter = require('./routes/icecream_routes'); +const milkShakeRouter = require('./routes/milkshake_routes'); + +app.use(morgan('dev')); +app.use('/icecream', iceCreamRouter); +app.use('/milkshake', milkShakeRouter); + +app.use(errorHandler); + +app.use((req, res) => { + res.status(404).json({message: 'not found'}); +}); + + +app.listen(3000, () => { + console.log('up on 3000'); +}); diff --git a/vic-class11-assignment/test/milkshake_test.js b/vic-class11-assignment/test/milkshake_test.js new file mode 100644 index 0000000..e69de29 diff --git a/vic-class11-assignment/test/test.js b/vic-class11-assignment/test/test.js index b66ba5d..d98fddb 100644 --- a/vic-class11-assignment/test/test.js +++ b/vic-class11-assignment/test/test.js @@ -1,77 +1,92 @@ 'use strict'; -const fs = require('fs'); const chai = require('chai'); const chaiHTTP = require('chai-http'); -const expect = chai.expect; +const mongoose = require('mongoose'); +const IceCream = require('../schema/icecream'); chai.use(chaiHTTP); -const request = chai.request; -const server = require(__dirname + '/../lib/server'); +const expect = chai.expect; +const request = chai.request; +const dbPort = process.env.MONGOLAB_URI; +process.env.MONGOLAB_URI = 'mongodb://localhost/test_db'; require('../index'); -describe('Testing CRUD routes', () => { - it('should respond with 404 to bad path', () => { +describe('Testing CRUD routes IceCream', () => { + after((done) => { + process.env.MONGOLAB_URI = dbPort; + mongoose.connection.db.dropDatabase(() => { + done(); + }); + }); + + it('should respond with 404 to bad path', (done) => { request('localhost:3000') .get('/badpath') .end((err, res) => { expect(err).to.not.eql(null); expect(res).to.have.status(404); expect(res.text).to.eql('{"message":"not found"}'); + done(); }); }); - it('should return a get message', (done) => { - request('localhost:3000/articles') - .get('/more') + it('should get a list of ice cream', (done) => { + request('localhost:3000') + .get('/icecream/') .end((err, res) => { expect(err).to.eql(null); expect(res).to.have.status(200); - expect(res.text).to.eql('{"message":"MORE"}'); + expect(Array.isArray(res.body)).to.eql(true); done(); }); }); - it('should return a post message', (done) => { - request('localhost:3000/articles') - .post('/') - .send({}) + it('should create ice cream', (done) => { + request('localhost:3000') + .post('/icecream/') + .send({flavor: 'chocolate', scoops: 1, vessel: 'cup'}) .end((err, res) => { expect(err).to.eql(null); expect(res).to.have.status(200); - expect(res.text).to.eql('{"message":"post success"}'); + expect(res.body.flavor).to.eql('chocolate'); + expect(res.body.vessel).to.eql('cup'); done(); }); }); - it('should return a put message', (done) => { - request('localhost:3000/articles') - .put('/') - .send({}) - .end((err, res) => { - expect(err).to.eql(null); - expect(res).to.have.status(200) - expect(res.text).to.eql('{"message":"put success"}'); - done(); + + describe('tests that need ice cream already', () => { + let testIceCream; + beforeEach((done) => { + let newIceCream = new IceCream({flavor: 'vanilla', scoops: 2, vessel: 'waffle cone'}); + newIceCream.save((err, icecream) => { + testIceCream = icecream; + done(); + }); }); - }); - it('should return a patch message', (done) => { - request('localhost:3000/articles') - .patch('/') - .send({}) - .end((err, res) => { - expect(err).to.eql(null); - expect(res).to.have.status(200) - expect(res.text).to.eql('{"message":"patch success"}'); - done(); + + it('should update a message', (done) => { + testIceCream.flavor = 'coffee'; + request('localhost:3000') + .put('/icecream/' + testIceCream._id) + .send({testIceCream}) + .end((err, res) => { + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.body.message).to.eql('successfully updated'); + expect(res.body.flavor).to.eql('coffee'); + done(); + }); }); - }); - it('should return a delete message', (done) => { - request('localhost:3000/articles') - .delete('/') - .end((err, res) => { - expect(err).to.eql(null); - expect(res).to.have.status(200) - expect(res.text).to.eql('{"message":"delete success"}'); - done(); + + it('should get rid of perfectly good ice cream', (done) => { + request('localhost:3000') + .delete('/icecream/' + testIceCream._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 a1ce234718efc03b6953ae03893ddc54220ab90b Mon Sep 17 00:00:00 2001 From: Victor Benavente Date: Fri, 27 May 2016 21:32:46 -0700 Subject: [PATCH 06/18] CRUD testing working for icecream route --- vic-class11-assignment/routes/icecream_routes.js | 4 ++-- vic-class11-assignment/test/test.js | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/vic-class11-assignment/routes/icecream_routes.js b/vic-class11-assignment/routes/icecream_routes.js index 7ff97d3..8687618 100644 --- a/vic-class11-assignment/routes/icecream_routes.js +++ b/vic-class11-assignment/routes/icecream_routes.js @@ -22,8 +22,8 @@ iceCreamRouter.post('/', jsonParser, (req, res) => { }); }); -iceCreamRouter.put('/:id', jsonParser, (req, res, next) => { - let _id = req.params.id; +iceCreamRouter.put('/', jsonParser, (req, res, next) => { + let _id = req.body._id; console.log('looking for id and req.body', _id, req.body) IceCream.findOneAndUpdate({_id}, req.body, (err, icecream) => { if(err) return next(err); diff --git a/vic-class11-assignment/test/test.js b/vic-class11-assignment/test/test.js index d98fddb..30dd28d 100644 --- a/vic-class11-assignment/test/test.js +++ b/vic-class11-assignment/test/test.js @@ -67,13 +67,13 @@ describe('Testing CRUD routes IceCream', () => { it('should update a message', (done) => { testIceCream.flavor = 'coffee'; request('localhost:3000') - .put('/icecream/' + testIceCream._id) - .send({testIceCream}) + .put('/icecream/') + .send(testIceCream) .end((err, res) => { expect(err).to.eql(null); expect(res).to.have.status(200); + console.log(res.body); expect(res.body.message).to.eql('successfully updated'); - expect(res.body.flavor).to.eql('coffee'); done(); }); }); From 27c714f4348085c87e8bc906ecdb79b6a6a6bb74 Mon Sep 17 00:00:00 2001 From: Victor Benavente Date: Wed, 1 Jun 2016 11:16:41 -0700 Subject: [PATCH 07/18] added .eslintrc, .eslintignore, fixed linter errors --- vic-class11-assignment/.eslintignore | 5 +++ vic-class11-assignment/.eslintrc | 41 +++++++++++++++++++ vic-class11-assignment/.gitignore | 1 + vic-class11-assignment/lib/error_handling.js | 1 + .../routes/icecream_routes.js | 9 ++-- .../routes/milkshake_routes.js | 14 +++---- vic-class11-assignment/schema/icecream.js | 2 +- vic-class11-assignment/server.js | 2 +- 8 files changed, 62 insertions(+), 13 deletions(-) create mode 100644 vic-class11-assignment/.eslintignore create mode 100644 vic-class11-assignment/.eslintrc diff --git a/vic-class11-assignment/.eslintignore b/vic-class11-assignment/.eslintignore new file mode 100644 index 0000000..5b88cef --- /dev/null +++ b/vic-class11-assignment/.eslintignore @@ -0,0 +1,5 @@ +**/node_modules/* +**/vendor/* +**/*.min.js +/*.md +/package.json diff --git a/vic-class11-assignment/.eslintrc b/vic-class11-assignment/.eslintrc new file mode 100644 index 0000000..6d505ad --- /dev/null +++ b/vic-class11-assignment/.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/vic-class11-assignment/.gitignore b/vic-class11-assignment/.gitignore index 3c3629e..885c9f0 100644 --- a/vic-class11-assignment/.gitignore +++ b/vic-class11-assignment/.gitignore @@ -1 +1,2 @@ node_modules +db diff --git a/vic-class11-assignment/lib/error_handling.js b/vic-class11-assignment/lib/error_handling.js index bd4b571..cde5178 100644 --- a/vic-class11-assignment/lib/error_handling.js +++ b/vic-class11-assignment/lib/error_handling.js @@ -1,3 +1,4 @@ module.exports = function(err, req, res, next) { res.status(500).json({message: err.message}); + next(err); }; diff --git a/vic-class11-assignment/routes/icecream_routes.js b/vic-class11-assignment/routes/icecream_routes.js index 8687618..a49d3d4 100644 --- a/vic-class11-assignment/routes/icecream_routes.js +++ b/vic-class11-assignment/routes/icecream_routes.js @@ -9,12 +9,13 @@ const iceCreamRouter = module.exports = exports = express.Router(); iceCreamRouter.get('/', (req, res, next) => { IceCream.find({}, (err, icecream) => { + console.log('not getting', icecream); if(err) return next(err); res.json(icecream); }); }); -iceCreamRouter.post('/', jsonParser, (req, res) => { +iceCreamRouter.post('/', jsonParser, (req, res, next) => { let newIceCream = new IceCream(req.body); newIceCream.save((err, icecream) => { if(err) return next(err); @@ -24,8 +25,8 @@ iceCreamRouter.post('/', jsonParser, (req, res) => { iceCreamRouter.put('/', jsonParser, (req, res, next) => { let _id = req.body._id; - console.log('looking for id and req.body', _id, req.body) - IceCream.findOneAndUpdate({_id}, req.body, (err, icecream) => { + console.log('looking for id and req.body', _id, req.body); + IceCream.findOneAndUpdate({_id}, req.body, (err) => { if(err) return next(err); let message = 'successfully updated'; res.json({message}); @@ -34,7 +35,7 @@ iceCreamRouter.put('/', jsonParser, (req, res, next) => { iceCreamRouter.delete('/:id', (req, res, next) => { let _id = req.params.id; - IceCream.findOneAndRemove({_id}, (err, icecream) => { + IceCream.findOneAndRemove({_id}, (err) => { if(err) return next(err); let message = 'successfully deleted'; res.json({message}); diff --git a/vic-class11-assignment/routes/milkshake_routes.js b/vic-class11-assignment/routes/milkshake_routes.js index 559aa47..e990ba4 100644 --- a/vic-class11-assignment/routes/milkshake_routes.js +++ b/vic-class11-assignment/routes/milkshake_routes.js @@ -1,4 +1,4 @@ -'use strict' +'use strict'; const express = require('express'); const bodyParser = require('body-parser'); @@ -14,20 +14,20 @@ milkShakeRouter.get('/', (req, res, next) => { }); }); -milkShakeRouter.post('/', jsonParser, (req, res) => { +milkShakeRouter.post('/', jsonParser, (req, res, next) => { let newMilkshake = new MilkShake(req.body); - newMilkShake.save((err, milkshake) => { + newMilkshake.save((err, milkshake) => { if(err) return next(err); res.json(milkshake); }); }); -milkShakeRouter.put('/', jsonParser, (req, res) => { +milkShakeRouter.put('/', jsonParser, (req, res, next) => { let _id = req.body._id; - MilkShake.findOneAndUpdate({_id}, req,body, (err, milkshake) => { + MilkShake.findOneAndUpdate({_id}, req.body, (err, milkshake) => { if(err) return next(err); let message = 'successfully updated'; - res.json({message}); + res.json({message}, milkshake); }); }); @@ -36,6 +36,6 @@ milkShakeRouter.delete('/:id', (req, res, next) => { MilkShake.findOneAndRemove({_id}, (err, milkshake) => { if(err) return next(err); let message = 'successfully deleted'; - res.json({message}); + res.json({message}, milkshake); }); }); diff --git a/vic-class11-assignment/schema/icecream.js b/vic-class11-assignment/schema/icecream.js index 676f139..97efeeb 100644 --- a/vic-class11-assignment/schema/icecream.js +++ b/vic-class11-assignment/schema/icecream.js @@ -1,4 +1,4 @@ -'use strict' +'use strict'; const mongoose = require('mongoose'); diff --git a/vic-class11-assignment/server.js b/vic-class11-assignment/server.js index 1bfd8ec..927a65a 100644 --- a/vic-class11-assignment/server.js +++ b/vic-class11-assignment/server.js @@ -1,6 +1,6 @@ 'use strict'; -const express = require('express') +const express = require('express'); const app = express(); const mongoose = require('mongoose'); const morgan = require('morgan'); From dfa58e05936ba1645c1aa863c48d7f06f419a1e8 Mon Sep 17 00:00:00 2001 From: Victor Benavente Date: Wed, 1 Jun 2016 12:18:52 -0700 Subject: [PATCH 08/18] added CRUD route testing for milkshake routes --- .../routes/icecream_routes.js | 1 - .../routes/milkshake_routes.js | 9 +- vic-class11-assignment/test/milkshake_test.js | 91 +++++++++++++++++++ vic-class11-assignment/test/test.js | 3 +- 4 files changed, 97 insertions(+), 7 deletions(-) diff --git a/vic-class11-assignment/routes/icecream_routes.js b/vic-class11-assignment/routes/icecream_routes.js index a49d3d4..3b713cc 100644 --- a/vic-class11-assignment/routes/icecream_routes.js +++ b/vic-class11-assignment/routes/icecream_routes.js @@ -25,7 +25,6 @@ iceCreamRouter.post('/', jsonParser, (req, res, next) => { iceCreamRouter.put('/', jsonParser, (req, res, next) => { let _id = req.body._id; - console.log('looking for id and req.body', _id, req.body); IceCream.findOneAndUpdate({_id}, req.body, (err) => { if(err) return next(err); let message = 'successfully updated'; diff --git a/vic-class11-assignment/routes/milkshake_routes.js b/vic-class11-assignment/routes/milkshake_routes.js index e990ba4..37db923 100644 --- a/vic-class11-assignment/routes/milkshake_routes.js +++ b/vic-class11-assignment/routes/milkshake_routes.js @@ -9,6 +9,7 @@ const milkShakeRouter = module.exports = exports = express.Router(); milkShakeRouter.get('/', (req, res, next) => { MilkShake.find({}, (err, milkshakes) => { + console.log('not getting', milkshakes); if(err) return next(err); res.json(milkshakes); }); @@ -24,18 +25,18 @@ milkShakeRouter.post('/', jsonParser, (req, res, next) => { milkShakeRouter.put('/', jsonParser, (req, res, next) => { let _id = req.body._id; - MilkShake.findOneAndUpdate({_id}, req.body, (err, milkshake) => { + MilkShake.findOneAndUpdate({_id}, req.body, (err) => { if(err) return next(err); let message = 'successfully updated'; - res.json({message}, milkshake); + res.json({message}); }); }); milkShakeRouter.delete('/:id', (req, res, next) => { let _id = req.params.id; - MilkShake.findOneAndRemove({_id}, (err, milkshake) => { + MilkShake.findOneAndRemove({_id}, (err) => { if(err) return next(err); let message = 'successfully deleted'; - res.json({message}, milkshake); + res.json({message}); }); }); diff --git a/vic-class11-assignment/test/milkshake_test.js b/vic-class11-assignment/test/milkshake_test.js index e69de29..6be6098 100644 --- a/vic-class11-assignment/test/milkshake_test.js +++ b/vic-class11-assignment/test/milkshake_test.js @@ -0,0 +1,91 @@ +'use strict'; + +const chai = require('chai'); +const chaiHTTP = require('chai-http'); +const mongoose = require('mongoose'); +const MilkShake = require('../schema/milkshake.js'); +chai.use(chaiHTTP); + +const expect = chai.expect; +const request = chai.request; +const dbPort = process.env.MONGOLAB_URI; + +process.env.MONGOLAB_URI = 'mongodb://localhost/milkshake_test_db'; +require('../index'); + +describe('Testing CRUD routes MilkShake', () => { + after((done) => { + process.env.MONGOLAB_URI = dbPort; + mongoose.connection.db.dropDatabase(() => { + done(); + }); + }); + + it('should respond with 404 to a bad path', (done) => { + request('localhost:3000') + .get('/badpath') + .end((err, res) => { + expect(err).to.not.eql(null); + expect(res).to.have.status(404); + expect(res.text).to.eql('{"message":"not found"}'); + done(); + }); + }); + it('should get a list of milkshakes', (done) => { + request('localhost:3000') + .get('/milkshake/') + .end((err, res) => { + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(Array.isArray(res.body)).to.eql(true); + done(); + }); + }); + it('should create a milkshake', (done) => { + request('localhost:3000') + .post('/milkshake') + .send({flavor: 'strawberry', scoops: 3, milkRichness: 'whole milk'}) + .end((err, res) => { + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.body.flavor).to.eql('strawberry'); + expect(res.body.scoops).to.eql(3); + done(); + }); + }); + + describe('tests that need an existing milkshake', () => { + let testMilkShake; + beforeEach((done) => { + let newMilkShake = new MilkShake({flavor: 'peanut butter', scoops: 4, milkRichness: '2percent milk'}); + newMilkShake.save((err, milkshake) => { + testMilkShake = milkshake; + done(); + }); + }); + + it('should update a message', (done) => { + testMilkShake.scoops = 2; + request('localhost:3000') + .put('/milkshake/') + .send(testMilkShake) + .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 get rid of perfectly good milkshakes', (done) => { + request('localhost:3000') + .delete('/milkshake/' + testMilkShake._id) + .end((err, res) => { + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.body.message).to.eql('successfully deleted'); + done(); + }); + }); + }); +}); diff --git a/vic-class11-assignment/test/test.js b/vic-class11-assignment/test/test.js index 30dd28d..5961df6 100644 --- a/vic-class11-assignment/test/test.js +++ b/vic-class11-assignment/test/test.js @@ -23,7 +23,7 @@ describe('Testing CRUD routes IceCream', () => { it('should respond with 404 to bad path', (done) => { request('localhost:3000') - .get('/badpath') + .get('/wrongway') .end((err, res) => { expect(err).to.not.eql(null); expect(res).to.have.status(404); @@ -72,7 +72,6 @@ describe('Testing CRUD routes IceCream', () => { .end((err, res) => { expect(err).to.eql(null); expect(res).to.have.status(200); - console.log(res.body); expect(res.body.message).to.eql('successfully updated'); done(); }); From e0541337a15d319f03d6ef6c42bad424fefec6a7 Mon Sep 17 00:00:00 2001 From: Victor Benavente Date: Fri, 3 Jun 2016 10:58:09 -0700 Subject: [PATCH 09/18] added user signup and signin authentication via token --- vic-class11-assignment/lib/basic_http.js | 21 ++++++++++++++ vic-class11-assignment/lib/jwt_auth.js | 25 ++++++++++++++++ vic-class11-assignment/model/user.js | 21 ++++++++++++++ vic-class11-assignment/routes/auth_routes.js | 30 ++++++++++++++++++++ vic-class11-assignment/schema/user.js | 10 +++++++ vic-class11-assignment/server.js | 2 ++ 6 files changed, 109 insertions(+) create mode 100644 vic-class11-assignment/lib/basic_http.js create mode 100644 vic-class11-assignment/lib/jwt_auth.js create mode 100644 vic-class11-assignment/model/user.js create mode 100644 vic-class11-assignment/routes/auth_routes.js create mode 100644 vic-class11-assignment/schema/user.js diff --git a/vic-class11-assignment/lib/basic_http.js b/vic-class11-assignment/lib/basic_http.js new file mode 100644 index 0000000..8592bfd --- /dev/null +++ b/vic-class11-assignment/lib/basic_http.js @@ -0,0 +1,21 @@ +'use strict'; + +module.exports = function(req, res, next) { + let basicAuth = req.headers.authorization; + let authString = basicAuth.split(' ')[1]; + 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(0); +}; diff --git a/vic-class11-assignment/lib/jwt_auth.js b/vic-class11-assignment/lib/jwt_auth.js new file mode 100644 index 0000000..105fb6b --- /dev/null +++ b/vic-class11-assignment/lib/jwt_auth.js @@ -0,0 +1,25 @@ +'use strict'; + +const jwt = require('jsonwebtoken'); +const User = require('./model/user.js'); +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/vic-class11-assignment/model/user.js b/vic-class11-assignment/model/user.js new file mode 100644 index 0000000..761494b --- /dev/null +++ b/vic-class11-assignment/model/user.js @@ -0,0 +1,21 @@ +'use strict'; + +const mongoose = require('mongoose'); +const bcrypt = require('bcrypt'); +const jwt = require('jsonwebtoken'); +const User = require('../Schema/user'); +const secret = process.env.SECRET || 'changeme'; + +User.methods.hashPassword = 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/vic-class11-assignment/routes/auth_routes.js b/vic-class11-assignment/routes/auth_routes.js new file mode 100644 index 0000000..02d6215 --- /dev/null +++ b/vic-class11-assignment/routes/auth_routes.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 authRouter = module.exports = exports = express.Router(); + +authRouter.post('/signup', bodyParser, (req, res, next) => { + let newUser = new User(req.body); + let hashedPassword = newUser.hashPassword(); + 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()}); + }); + }); +}); + +authRouter.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 - username not found')); + if(!user.comparePassword(req.auth.password)) return next(new Error('could not sign in - incorrect password')); + res.json({token: user.generateToken()}); + }); +}); diff --git a/vic-class11-assignment/schema/user.js b/vic-class11-assignment/schema/user.js new file mode 100644 index 0000000..2fe1f0f --- /dev/null +++ b/vic-class11-assignment/schema/user.js @@ -0,0 +1,10 @@ +'use strict'; + +const mongoose = require('mongoose'); + +const User = new mongoose.Schema({ + username: {type: String, required: true}, + password: {type: String, required: true} +}); + +module.exports = mongoose.model('user', User); diff --git a/vic-class11-assignment/server.js b/vic-class11-assignment/server.js index 927a65a..908e1a2 100644 --- a/vic-class11-assignment/server.js +++ b/vic-class11-assignment/server.js @@ -5,6 +5,7 @@ const app = express(); const mongoose = require('mongoose'); const morgan = require('morgan'); const errorHandler = require('./lib/error_handling'); +const authRouter = require('./route/auth_routes'); const dbPort = process.env.MONGOLAB_URI || 'mongodb://localhost/dev_db'; @@ -14,6 +15,7 @@ const iceCreamRouter = require('./routes/icecream_routes'); const milkShakeRouter = require('./routes/milkshake_routes'); app.use(morgan('dev')); +app.use('/', authRouter); app.use('/icecream', iceCreamRouter); app.use('/milkshake', milkShakeRouter); From 532e47abef83a95ebee899cd88a9e5cdc7298e36 Mon Sep 17 00:00:00 2001 From: Victor Benavente Date: Fri, 3 Jun 2016 11:33:52 -0700 Subject: [PATCH 10/18] restructured files schema files to model --- vic-class11-assignment/gulpfile.js | 3 +-- vic-class11-assignment/{schema => model}/icecream.js | 0 vic-class11-assignment/{schema => model}/milkshake.js | 0 vic-class11-assignment/model/user.js | 6 +++++- vic-class11-assignment/package.json | 4 +++- vic-class11-assignment/routes/icecream_routes.js | 2 +- vic-class11-assignment/routes/milkshake_routes.js | 2 +- vic-class11-assignment/schema/user.js | 10 ---------- vic-class11-assignment/server.js | 2 +- vic-class11-assignment/test/milkshake_test.js | 2 +- vic-class11-assignment/test/test.js | 2 +- 11 files changed, 14 insertions(+), 19 deletions(-) rename vic-class11-assignment/{schema => model}/icecream.js (100%) rename vic-class11-assignment/{schema => model}/milkshake.js (100%) delete mode 100644 vic-class11-assignment/schema/user.js diff --git a/vic-class11-assignment/gulpfile.js b/vic-class11-assignment/gulpfile.js index 981fa96..3c0a395 100644 --- a/vic-class11-assignment/gulpfile.js +++ b/vic-class11-assignment/gulpfile.js @@ -1,11 +1,10 @@ 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'); -}) +}); gulp.task('lint', () => { gulp.src('/server.js') diff --git a/vic-class11-assignment/schema/icecream.js b/vic-class11-assignment/model/icecream.js similarity index 100% rename from vic-class11-assignment/schema/icecream.js rename to vic-class11-assignment/model/icecream.js diff --git a/vic-class11-assignment/schema/milkshake.js b/vic-class11-assignment/model/milkshake.js similarity index 100% rename from vic-class11-assignment/schema/milkshake.js rename to vic-class11-assignment/model/milkshake.js diff --git a/vic-class11-assignment/model/user.js b/vic-class11-assignment/model/user.js index 761494b..5282226 100644 --- a/vic-class11-assignment/model/user.js +++ b/vic-class11-assignment/model/user.js @@ -3,9 +3,13 @@ const mongoose = require('mongoose'); const bcrypt = require('bcrypt'); const jwt = require('jsonwebtoken'); -const User = require('../Schema/user'); const secret = process.env.SECRET || 'changeme'; +const User = new mongoose.Schema({ + username: {type: String, required: true}, + password: {type: String, required: true} +}); + User.methods.hashPassword = function() { return bcrypt.hashSync(this.password, 8); }; diff --git a/vic-class11-assignment/package.json b/vic-class11-assignment/package.json index 0348304..7ea344b 100644 --- a/vic-class11-assignment/package.json +++ b/vic-class11-assignment/package.json @@ -27,7 +27,9 @@ "mocha": "^2.5.2" }, "dependencies": { + "bcrypt": "^0.8.6", "body-parser": "^1.15.1", - "express": "^4.13.4" + "express": "^4.13.4", + "jsonwebtoken": "^7.0.0" } } diff --git a/vic-class11-assignment/routes/icecream_routes.js b/vic-class11-assignment/routes/icecream_routes.js index 3b713cc..d1fc4c7 100644 --- a/vic-class11-assignment/routes/icecream_routes.js +++ b/vic-class11-assignment/routes/icecream_routes.js @@ -3,7 +3,7 @@ const express = require('express'); const bodyParser = require('body-parser'); const jsonParser = bodyParser.json(); -const IceCream = require('../schema/icecream'); +const IceCream = require('../model/icecream'); const iceCreamRouter = module.exports = exports = express.Router(); diff --git a/vic-class11-assignment/routes/milkshake_routes.js b/vic-class11-assignment/routes/milkshake_routes.js index 37db923..a674f31 100644 --- a/vic-class11-assignment/routes/milkshake_routes.js +++ b/vic-class11-assignment/routes/milkshake_routes.js @@ -3,7 +3,7 @@ const express = require('express'); const bodyParser = require('body-parser'); const jsonParser = bodyParser.json(); -const MilkShake = require('../schema/milkshake'); +const MilkShake = require('../model/milkshake'); const milkShakeRouter = module.exports = exports = express.Router(); diff --git a/vic-class11-assignment/schema/user.js b/vic-class11-assignment/schema/user.js deleted file mode 100644 index 2fe1f0f..0000000 --- a/vic-class11-assignment/schema/user.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict'; - -const mongoose = require('mongoose'); - -const User = new mongoose.Schema({ - username: {type: String, required: true}, - password: {type: String, required: true} -}); - -module.exports = mongoose.model('user', User); diff --git a/vic-class11-assignment/server.js b/vic-class11-assignment/server.js index 908e1a2..0490e49 100644 --- a/vic-class11-assignment/server.js +++ b/vic-class11-assignment/server.js @@ -5,12 +5,12 @@ const app = express(); const mongoose = require('mongoose'); const morgan = require('morgan'); const errorHandler = require('./lib/error_handling'); -const authRouter = require('./route/auth_routes'); const dbPort = process.env.MONGOLAB_URI || 'mongodb://localhost/dev_db'; mongoose.connect(dbPort); +const authRouter = require('./routes/auth_routes'); const iceCreamRouter = require('./routes/icecream_routes'); const milkShakeRouter = require('./routes/milkshake_routes'); diff --git a/vic-class11-assignment/test/milkshake_test.js b/vic-class11-assignment/test/milkshake_test.js index 6be6098..932f29f 100644 --- a/vic-class11-assignment/test/milkshake_test.js +++ b/vic-class11-assignment/test/milkshake_test.js @@ -3,7 +3,7 @@ const chai = require('chai'); const chaiHTTP = require('chai-http'); const mongoose = require('mongoose'); -const MilkShake = require('../schema/milkshake.js'); +const MilkShake = require('../model/milkshake.js'); chai.use(chaiHTTP); const expect = chai.expect; diff --git a/vic-class11-assignment/test/test.js b/vic-class11-assignment/test/test.js index 5961df6..fc6e37f 100644 --- a/vic-class11-assignment/test/test.js +++ b/vic-class11-assignment/test/test.js @@ -3,7 +3,7 @@ const chai = require('chai'); const chaiHTTP = require('chai-http'); const mongoose = require('mongoose'); -const IceCream = require('../schema/icecream'); +const IceCream = require('../model/icecream'); chai.use(chaiHTTP); const expect = chai.expect; From 0a127630cf069a23f07157ad655787fe6f719b11 Mon Sep 17 00:00:00 2001 From: Victor Benavente Date: Fri, 3 Jun 2016 11:42:43 -0700 Subject: [PATCH 11/18] updated package.json --- vic-class11-assignment/package.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/vic-class11-assignment/package.json b/vic-class11-assignment/package.json index 7ea344b..2ab4035 100644 --- a/vic-class11-assignment/package.json +++ b/vic-class11-assignment/package.json @@ -1,10 +1,12 @@ { - "name": "rest_api", + "name": "two_resource_api_with_authentication", "version": "1.0.0", "description": "##To Submit this Assignment * fork this repository * write all of your code in a folder containing your name * push to your repository * submit a pull request to this repository * submit a link to your PR in canvas", "main": "index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "./node_modules/mocha/bin/mocha", + "start": "node index.js", + "lint": "./node_modules/eslint/bin/eslint.js *" }, "repository": { "type": "git", From 1958866b97844d7a5356c432a47465cb10b70bf7 Mon Sep 17 00:00:00 2001 From: Victor Benavente Date: Mon, 20 Jun 2016 10:44:03 -0700 Subject: [PATCH 12/18] commented out auth router --- vic-class11-assignment/.gitignore | 2 ++ vic-class11-assignment/lib/jwt_auth.js | 2 +- vic-class11-assignment/routes/icecream_routes.js | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/vic-class11-assignment/.gitignore b/vic-class11-assignment/.gitignore index 885c9f0..fd7be33 100644 --- a/vic-class11-assignment/.gitignore +++ b/vic-class11-assignment/.gitignore @@ -1,2 +1,4 @@ node_modules db +../db/* +./db/* diff --git a/vic-class11-assignment/lib/jwt_auth.js b/vic-class11-assignment/lib/jwt_auth.js index 105fb6b..df3e186 100644 --- a/vic-class11-assignment/lib/jwt_auth.js +++ b/vic-class11-assignment/lib/jwt_auth.js @@ -1,7 +1,7 @@ 'use strict'; const jwt = require('jsonwebtoken'); -const User = require('./model/user.js'); +const User = require('../model/user.js'); const secret = process.env.SECRET || 'changeme'; module.exports = function(req, res, next) { diff --git a/vic-class11-assignment/routes/icecream_routes.js b/vic-class11-assignment/routes/icecream_routes.js index d1fc4c7..64421cc 100644 --- a/vic-class11-assignment/routes/icecream_routes.js +++ b/vic-class11-assignment/routes/icecream_routes.js @@ -4,6 +4,7 @@ const express = require('express'); const bodyParser = require('body-parser'); const jsonParser = bodyParser.json(); const IceCream = require('../model/icecream'); +// const jwt = require('../lib/jwt_auth'); const iceCreamRouter = module.exports = exports = express.Router(); From 80f18e8169ff0a05f166e8b9339c076ab2a15ec0 Mon Sep 17 00:00:00 2001 From: Victor Benavente Date: Tue, 21 Jun 2016 11:25:49 -0700 Subject: [PATCH 13/18] updated package.json, corrected put call --- vic-class11-assignment/.gitignore | 2 +- vic-class11-assignment/package.json | 1 + vic-class11-assignment/routes/icecream_routes.js | 4 ++-- vic-class11-assignment/server.js | 7 +++++-- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/vic-class11-assignment/.gitignore b/vic-class11-assignment/.gitignore index fd7be33..703bb84 100644 --- a/vic-class11-assignment/.gitignore +++ b/vic-class11-assignment/.gitignore @@ -1,4 +1,4 @@ node_modules db -../db/* ./db/* +../db/* diff --git a/vic-class11-assignment/package.json b/vic-class11-assignment/package.json index 2ab4035..f5ba2fe 100644 --- a/vic-class11-assignment/package.json +++ b/vic-class11-assignment/package.json @@ -31,6 +31,7 @@ "dependencies": { "bcrypt": "^0.8.6", "body-parser": "^1.15.1", + "cors": "^2.7.1", "express": "^4.13.4", "jsonwebtoken": "^7.0.0" } diff --git a/vic-class11-assignment/routes/icecream_routes.js b/vic-class11-assignment/routes/icecream_routes.js index 64421cc..3ee752f 100644 --- a/vic-class11-assignment/routes/icecream_routes.js +++ b/vic-class11-assignment/routes/icecream_routes.js @@ -24,8 +24,8 @@ iceCreamRouter.post('/', jsonParser, (req, res, next) => { }); }); -iceCreamRouter.put('/', jsonParser, (req, res, next) => { - let _id = req.body._id; +iceCreamRouter.put('/:id', jsonParser, (req, res, next) => { + let _id = req.params.id; IceCream.findOneAndUpdate({_id}, req.body, (err) => { if(err) return next(err); let message = 'successfully updated'; diff --git a/vic-class11-assignment/server.js b/vic-class11-assignment/server.js index 0490e49..923ba15 100644 --- a/vic-class11-assignment/server.js +++ b/vic-class11-assignment/server.js @@ -5,17 +5,20 @@ const app = express(); const mongoose = require('mongoose'); const morgan = require('morgan'); const errorHandler = require('./lib/error_handling'); +const cors = require('cors'); const dbPort = process.env.MONGOLAB_URI || 'mongodb://localhost/dev_db'; mongoose.connect(dbPort); -const authRouter = require('./routes/auth_routes'); +// const authRouter = require('./routes/auth_routes'); const iceCreamRouter = require('./routes/icecream_routes'); const milkShakeRouter = require('./routes/milkshake_routes'); +app.use(cors()); + app.use(morgan('dev')); -app.use('/', authRouter); +// app.use('/', authRouter); app.use('/icecream', iceCreamRouter); app.use('/milkshake', milkShakeRouter); From a8b544ad497fd63221b9d5374b2d028a895d9187 Mon Sep 17 00:00:00 2001 From: Victor Benavente Date: Tue, 21 Jun 2016 11:32:03 -0700 Subject: [PATCH 14/18] updated milkshake router put call --- vic-class11-assignment/routes/milkshake_routes.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vic-class11-assignment/routes/milkshake_routes.js b/vic-class11-assignment/routes/milkshake_routes.js index a674f31..8a70a9b 100644 --- a/vic-class11-assignment/routes/milkshake_routes.js +++ b/vic-class11-assignment/routes/milkshake_routes.js @@ -23,8 +23,8 @@ milkShakeRouter.post('/', jsonParser, (req, res, next) => { }); }); -milkShakeRouter.put('/', jsonParser, (req, res, next) => { - let _id = req.body._id; +milkShakeRouter.put('/:id', jsonParser, (req, res, next) => { + let _id = req.params.id; MilkShake.findOneAndUpdate({_id}, req.body, (err) => { if(err) return next(err); let message = 'successfully updated'; From e0b489baade6bdb91a7e4f7eb917d23d664722f3 Mon Sep 17 00:00:00 2001 From: Victor Benavente Date: Fri, 22 Jul 2016 20:35:31 -0700 Subject: [PATCH 15/18] added authentication back --- vic-class11-assignment/lib/basic_http.js | 2 +- vic-class11-assignment/routes/icecream_routes.js | 8 ++++---- vic-class11-assignment/routes/milkshake_routes.js | 7 ++++--- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/vic-class11-assignment/lib/basic_http.js b/vic-class11-assignment/lib/basic_http.js index 8592bfd..7e0aa79 100644 --- a/vic-class11-assignment/lib/basic_http.js +++ b/vic-class11-assignment/lib/basic_http.js @@ -17,5 +17,5 @@ module.exports = function(req, res, next) { return next(new Error('Username or Password missing')); } - next(0); + next(); }; diff --git a/vic-class11-assignment/routes/icecream_routes.js b/vic-class11-assignment/routes/icecream_routes.js index 3ee752f..3cd8999 100644 --- a/vic-class11-assignment/routes/icecream_routes.js +++ b/vic-class11-assignment/routes/icecream_routes.js @@ -4,7 +4,7 @@ const express = require('express'); const bodyParser = require('body-parser'); const jsonParser = bodyParser.json(); const IceCream = require('../model/icecream'); -// const jwt = require('../lib/jwt_auth'); +const jwt = require('../lib/jwt_auth'); const iceCreamRouter = module.exports = exports = express.Router(); @@ -16,7 +16,7 @@ iceCreamRouter.get('/', (req, res, next) => { }); }); -iceCreamRouter.post('/', jsonParser, (req, res, next) => { +iceCreamRouter.post('/', jwt, jsonParser, (req, res, next) => { let newIceCream = new IceCream(req.body); newIceCream.save((err, icecream) => { if(err) return next(err); @@ -24,7 +24,7 @@ iceCreamRouter.post('/', jsonParser, (req, res, next) => { }); }); -iceCreamRouter.put('/:id', jsonParser, (req, res, next) => { +iceCreamRouter.put('/:id', jwt, jsonParser, (req, res, next) => { let _id = req.params.id; IceCream.findOneAndUpdate({_id}, req.body, (err) => { if(err) return next(err); @@ -33,7 +33,7 @@ iceCreamRouter.put('/:id', jsonParser, (req, res, next) => { }); }); -iceCreamRouter.delete('/:id', (req, res, next) => { +iceCreamRouter.delete('/:id', jwt, (req, res, next) => { let _id = req.params.id; IceCream.findOneAndRemove({_id}, (err) => { if(err) return next(err); diff --git a/vic-class11-assignment/routes/milkshake_routes.js b/vic-class11-assignment/routes/milkshake_routes.js index 8a70a9b..c040b4d 100644 --- a/vic-class11-assignment/routes/milkshake_routes.js +++ b/vic-class11-assignment/routes/milkshake_routes.js @@ -4,6 +4,7 @@ const express = require('express'); const bodyParser = require('body-parser'); const jsonParser = bodyParser.json(); const MilkShake = require('../model/milkshake'); +const jwt = require('../lib/jwt_auth') const milkShakeRouter = module.exports = exports = express.Router(); @@ -15,7 +16,7 @@ milkShakeRouter.get('/', (req, res, next) => { }); }); -milkShakeRouter.post('/', jsonParser, (req, res, next) => { +milkShakeRouter.post('/', jwt, jsonParser, (req, res, next) => { let newMilkshake = new MilkShake(req.body); newMilkshake.save((err, milkshake) => { if(err) return next(err); @@ -23,7 +24,7 @@ milkShakeRouter.post('/', jsonParser, (req, res, next) => { }); }); -milkShakeRouter.put('/:id', jsonParser, (req, res, next) => { +milkShakeRouter.put('/:id', jwt, jsonParser, (req, res, next) => { let _id = req.params.id; MilkShake.findOneAndUpdate({_id}, req.body, (err) => { if(err) return next(err); @@ -32,7 +33,7 @@ milkShakeRouter.put('/:id', jsonParser, (req, res, next) => { }); }); -milkShakeRouter.delete('/:id', (req, res, next) => { +milkShakeRouter.delete('/:id', jwt, (req, res, next) => { let _id = req.params.id; MilkShake.findOneAndRemove({_id}, (err) => { if(err) return next(err); From bd3d3a22be4906873bf6082350256f99e6450bdf Mon Sep 17 00:00:00 2001 From: Victor Benavente Date: Fri, 22 Jul 2016 21:03:18 -0700 Subject: [PATCH 16/18] added require authRouter to server --- vic-class11-assignment/server.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/vic-class11-assignment/server.js b/vic-class11-assignment/server.js index 923ba15..3434a6b 100644 --- a/vic-class11-assignment/server.js +++ b/vic-class11-assignment/server.js @@ -11,7 +11,7 @@ const dbPort = process.env.MONGOLAB_URI || 'mongodb://localhost/dev_db'; mongoose.connect(dbPort); -// const authRouter = require('./routes/auth_routes'); +const authRouter = require('./routes/auth_routes'); const iceCreamRouter = require('./routes/icecream_routes'); const milkShakeRouter = require('./routes/milkshake_routes'); @@ -21,6 +21,7 @@ app.use(morgan('dev')); // app.use('/', authRouter); app.use('/icecream', iceCreamRouter); app.use('/milkshake', milkShakeRouter); +app.use('/', authRouter); app.use(errorHandler); From b60c0e6126edbcf5817d865e28cde8585dfe7382 Mon Sep 17 00:00:00 2001 From: Victor Benavente Date: Fri, 22 Jul 2016 21:39:29 -0700 Subject: [PATCH 17/18] fixed lint error --- vic-class11-assignment/routes/milkshake_routes.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vic-class11-assignment/routes/milkshake_routes.js b/vic-class11-assignment/routes/milkshake_routes.js index c040b4d..aeeb600 100644 --- a/vic-class11-assignment/routes/milkshake_routes.js +++ b/vic-class11-assignment/routes/milkshake_routes.js @@ -4,7 +4,7 @@ const express = require('express'); const bodyParser = require('body-parser'); const jsonParser = bodyParser.json(); const MilkShake = require('../model/milkshake'); -const jwt = require('../lib/jwt_auth') +const jwt = require('../lib/jwt_auth'); const milkShakeRouter = module.exports = exports = express.Router(); From 176c6aef5de7a2bf980ffbeb7a666c9983b39b5f Mon Sep 17 00:00:00 2001 From: Victor Benavente Date: Fri, 22 Jul 2016 22:23:38 -0700 Subject: [PATCH 18/18] found a bug in auth routes --- vic-class11-assignment/routes/auth_routes.js | 2 +- vic-class11-assignment/server.js | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/vic-class11-assignment/routes/auth_routes.js b/vic-class11-assignment/routes/auth_routes.js index 02d6215..ce90010 100644 --- a/vic-class11-assignment/routes/auth_routes.js +++ b/vic-class11-assignment/routes/auth_routes.js @@ -16,7 +16,7 @@ authRouter.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({token:user.generateToken()}); }); }); }); diff --git a/vic-class11-assignment/server.js b/vic-class11-assignment/server.js index 3434a6b..e92c428 100644 --- a/vic-class11-assignment/server.js +++ b/vic-class11-assignment/server.js @@ -18,10 +18,9 @@ const milkShakeRouter = require('./routes/milkshake_routes'); app.use(cors()); app.use(morgan('dev')); -// app.use('/', authRouter); +app.use('/', authRouter); app.use('/icecream', iceCreamRouter); app.use('/milkshake', milkShakeRouter); -app.use('/', authRouter); app.use(errorHandler);