From ae36c91445e194f76bcd7abe1c17c9e9293bce8c Mon Sep 17 00:00:00 2001 From: Colin Griffiths Date: Mon, 8 Jul 2019 22:55:41 -0700 Subject: [PATCH 1/3] Trying lodash for partial filter --- api/fruits.js | 0 api/vegetables.js | 33 +++++++++++++++++++++++++++++++++ app.js | 12 +++++++++++- package-lock.json | 3 +-- package.json | 1 + 5 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 api/fruits.js create mode 100644 api/vegetables.js diff --git a/api/fruits.js b/api/fruits.js new file mode 100644 index 0000000..e69de29 diff --git a/api/vegetables.js b/api/vegetables.js new file mode 100644 index 0000000..f9b8f83 --- /dev/null +++ b/api/vegetables.js @@ -0,0 +1,33 @@ +const express = require('express'); +const router = express.Router(); +const { generate: generateId } = require('shortid') +const helpers = require('../src/helpers'); +const data = require('../app') + +router.get('/', (req, res, next) => { + const { vegetables } = data + res.json(vegetables) +}) + +router.get('/:id', (req, res, next) => { + const { vegetables } = data + const { id } = req.params + const vegetable = vegetables.find(veggie => veggie.id === id) + + if (!vegetable) { + const message = `Could not find vegetable with ID of ${id}` + next({ status: 404, message }) + } + + res.json(vegetable) +}) + +router.post('/', helpers.validate, (req, res, next) => { + const { vegetables } = data + const vegetable = { id: generateId(), ...req.body } + + vegetables.push(vegetable) + res.status(201).json(vegetable) +}) + +module.exports = router; \ No newline at end of file diff --git a/app.js b/app.js index d2e92a4..109964a 100644 --- a/app.js +++ b/app.js @@ -3,18 +3,28 @@ const express = require('express') const { generate: generateId } = require('shortid') const helpers = require('./src/helpers') const app = express() +const lodash = require('lodash'); if (NODE_ENV === 'development') app.use(require('morgan')('dev')) app.use(require('body-parser').json()) +const vegetableRoutes = require('./api/vegetables') +const fruitRoutes = require('./api/fruits') + const data = { fruits: [], vegetables: [] } + app.get('/vegetables', (req, res, next) => { const { vegetables } = data - res.json(vegetables) + if(req.query.name ) { + let matches = lodash.find(vegetables, ['name',req.query.name]); + res.json(matches) + } else { + res.json(vegetables) + } }) app.get('/vegetables/:id', (req, res, next) => { diff --git a/package-lock.json b/package-lock.json index 29ea0a1..69bd894 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2658,8 +2658,7 @@ "lodash": { "version": "4.17.11", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" }, "loose-envify": { "version": "1.4.0", diff --git a/package.json b/package.json index e6b4c3e..eb025a3 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "dependencies": { "body-parser": "^1.19.0", "express": "^4.17.1", + "lodash": "^4.17.11", "morgan": "^1.9.1", "shortid": "^2.2.14" } From 3baa250318400adc82f01c1966ede2360cb13e24 Mon Sep 17 00:00:00 2001 From: Colin Griffiths Date: Tue, 9 Jul 2019 14:57:14 -0700 Subject: [PATCH 2/3] All routes less PUT --- app.js | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- mock.js | 38 +++++++++++++++++++++++ readme.md | 14 ++++----- 3 files changed, 131 insertions(+), 12 deletions(-) create mode 100644 mock.js diff --git a/app.js b/app.js index 109964a..e4da8e5 100644 --- a/app.js +++ b/app.js @@ -3,7 +3,7 @@ const express = require('express') const { generate: generateId } = require('shortid') const helpers = require('./src/helpers') const app = express() -const lodash = require('lodash'); +const _ = require('lodash'); if (NODE_ENV === 'development') app.use(require('morgan')('dev')) app.use(require('body-parser').json()) @@ -11,16 +11,29 @@ app.use(require('body-parser').json()) const vegetableRoutes = require('./api/vegetables') const fruitRoutes = require('./api/fruits') -const data = { - fruits: [], - vegetables: [] +if (NODE_ENV === 'development') { + const data = require('./mock'); +} else { + const data = { + fruits: [], + vegetables: [] + } } +/** + * Vegetable Routes + */ + +// GET /vegetables +// GET /vegetables?name=[partial] +// TODO: [ ] Make search case insensitive app.get('/vegetables', (req, res, next) => { const { vegetables } = data if(req.query.name ) { - let matches = lodash.find(vegetables, ['name',req.query.name]); + let matches = _.filter(vegetables, (vegetable) => { + return vegetable.name.indexOf(req.query.name) > -1; + }); res.json(matches) } else { res.json(vegetables) @@ -48,6 +61,74 @@ app.post('/vegetables', helpers.validate, (req, res, next) => { res.status(201).json(vegetable) }) +app.delete('/vegetables/:id', (req, res, next) => { + const { vegetables } = data + const { id } = req.params + const vegetableIdx = vegetables.findIndex(veggie => veggie.id == id) + console.log(`vegetable index is ${vegetableIdx}`); + if (vegetableIdx < 0) { + const message = `Could not find vegetable with ID of ${id}` + next({ status: 404, message }) + } + + const vegetable = vegetables.splice(vegetableIdx,1); + res.json(vegetable) +}) + + + +// GET /fruits +// GET /fruits?name=[partial] +// TODO: [ ] Make search case insensitive + +app.get('/fruits', (req, res, next) => { + const { fruits } = data + if(req.query.name ) { + let matches = _.filter(fruits, (fruit) => { + return fruit.name.indexOf(req.query.name) > -1; + }); + res.json(matches) + } else { + res.json(fruits) + } +}) + +app.get('/fruits/:id', (req, res, next) => { + const { fruits } = data + const { id } = req.params + const fruit = fruits.find(fruit => fruit.id === id) + + if (!fruit) { + const message = `Could not find fruit with ID of ${id}` + next({ status: 404, message }) + } + + res.json(fruit) +}) + +app.post('/fruits', helpers.validate, (req, res, next) => { + const { fruits } = data + const fruit = { id: generateId(), ...req.body } + + fruits.push(fruit) + res.status(201).json(fruit) +}) + +app.delete('/fruits/:id', (req, res, next) => { + const { fruits } = data + const { id } = req.params + const fruitIdx = fruits.findIndex(fruit => fruit.id == id) + console.log(`fruit index is ${fruitIdx}`); + if (fruitIdx < 0) { + const message = `Could not find fruit with ID of ${id}` + next({ status: 404, message }) + } + + const fruit = fruits.splice(fruitIdx,1); + res.json(fruit) +}) + + app.use((req, res, next) => { next({ status: 404, diff --git a/mock.js b/mock.js new file mode 100644 index 0000000..719dc28 --- /dev/null +++ b/mock.js @@ -0,0 +1,38 @@ +data = { + fruits: [ + { + "id": "m527HRMm5", + "name": "Red Cherry", + "price": ".49" + }, + { + "id": "yCpYogn1Z", + "name": "Rainier Cherry", + "price": "1.29" + }, + { + "id": "dX0iYFMDu", + "name": "Bing Cherry", + "price": ".99" + } + ], + vegetables: [ + { + "id": "7HRMm52m5", + "name": "Potato (5lb bag)", + "price": "3.49" + }, + { + "id": "yCgn1ZpYo", + "name": "Potato", + "price": ".89" + }, + { + "id": "FMDudX0iY", + "name": "Red Potato", + "price": ".89" + } + ] +} + +module.exports = data; \ No newline at end of file diff --git a/readme.md b/readme.md index cc9fe47..a16a356 100644 --- a/readme.md +++ b/readme.md @@ -12,14 +12,14 @@ This exercise will assess your ability to build upon an already existing Express Improve upon and/or build the following routes as specified. -- [ ] [GET /vegetables?name=[partial-query]](#get-vegetablesnamepartial-query) -- [ ] [DELETE /vegetables/[id]](#delete-vegetablesid) +- [X] [GET /vegetables?name=[partial-query]](#get-vegetablesnamepartial-query) +- [X] [DELETE /vegetables/[id]](#delete-vegetablesid) - [ ] [PUT /vegetables/[id]](#put-vegetablesid) -- [ ] [GET /fruits](#get-fruits) -- [ ] [GET /fruits?name=[partial-query]](#get-fruitsnamepartial-query) -- [ ] [GET /fruits/[id]](#get-fruitsid) -- [ ] [POST /fruits](#post-fruitsid) -- [ ] [DELETE /fruits/[id]](#delete-fruitsid) +- [X] [GET /fruits](#get-fruits) +- [X] [GET /fruits?name=[partial-query]](#get-fruitsnamepartial-query) +- [X] [GET /fruits/[id]](#get-fruitsid) +- [X] [POST /fruits](#post-fruitsid) +- [X] [DELETE /fruits/[id]](#delete-fruitsid) - [ ] [PUT /fruits/[id]](#put-fruitsid) ### GET /vegetables?name=[partial-query] From 2824d70be0949eaaf0b0c0b8623a547aed6a24f2 Mon Sep 17 00:00:00 2001 From: Colin Griffiths Date: Tue, 9 Jul 2019 22:00:36 -0700 Subject: [PATCH 3/3] Final routes for PUT methods --- api/fruits.js | 0 api/vegetables.js | 33 --------------------------------- app.js | 43 ++++++++++++++++++++++++++++++------------- readme.md | 4 ++-- 4 files changed, 32 insertions(+), 48 deletions(-) delete mode 100644 api/fruits.js delete mode 100644 api/vegetables.js diff --git a/api/fruits.js b/api/fruits.js deleted file mode 100644 index e69de29..0000000 diff --git a/api/vegetables.js b/api/vegetables.js deleted file mode 100644 index f9b8f83..0000000 --- a/api/vegetables.js +++ /dev/null @@ -1,33 +0,0 @@ -const express = require('express'); -const router = express.Router(); -const { generate: generateId } = require('shortid') -const helpers = require('../src/helpers'); -const data = require('../app') - -router.get('/', (req, res, next) => { - const { vegetables } = data - res.json(vegetables) -}) - -router.get('/:id', (req, res, next) => { - const { vegetables } = data - const { id } = req.params - const vegetable = vegetables.find(veggie => veggie.id === id) - - if (!vegetable) { - const message = `Could not find vegetable with ID of ${id}` - next({ status: 404, message }) - } - - res.json(vegetable) -}) - -router.post('/', helpers.validate, (req, res, next) => { - const { vegetables } = data - const vegetable = { id: generateId(), ...req.body } - - vegetables.push(vegetable) - res.status(201).json(vegetable) -}) - -module.exports = router; \ No newline at end of file diff --git a/app.js b/app.js index e4da8e5..070a138 100644 --- a/app.js +++ b/app.js @@ -2,15 +2,15 @@ const { NODE_ENV = 'development', PORT = 5000 } = process.env const express = require('express') const { generate: generateId } = require('shortid') const helpers = require('./src/helpers') -const app = express() const _ = require('lodash'); +const app = express() + if (NODE_ENV === 'development') app.use(require('morgan')('dev')) app.use(require('body-parser').json()) -const vegetableRoutes = require('./api/vegetables') -const fruitRoutes = require('./api/fruits') +// Use Mock Data if in development enviro if (NODE_ENV === 'development') { const data = require('./mock'); } else { @@ -24,10 +24,6 @@ if (NODE_ENV === 'development') { * Vegetable Routes */ -// GET /vegetables -// GET /vegetables?name=[partial] -// TODO: [ ] Make search case insensitive - app.get('/vegetables', (req, res, next) => { const { vegetables } = data if(req.query.name ) { @@ -65,21 +61,31 @@ app.delete('/vegetables/:id', (req, res, next) => { const { vegetables } = data const { id } = req.params const vegetableIdx = vegetables.findIndex(veggie => veggie.id == id) - console.log(`vegetable index is ${vegetableIdx}`); if (vegetableIdx < 0) { const message = `Could not find vegetable with ID of ${id}` next({ status: 404, message }) } - const vegetable = vegetables.splice(vegetableIdx,1); res.json(vegetable) }) +app.put('/vegetables/:id', helpers.validate, (req, res, next) => { + const { vegetables } = data + const { id } = req.params + const vegetableIdx = vegetables.findIndex(vegetable => vegetable.id == id) + if (vegetableIdx < 0) { + const message = `Could not find vegetable with ID of ${id}` + next({ status: 404, message }) + } + const vegetable = {id: req.params.id, name: req.body.name, price:req.body.price} + vegetables.splice(vegetableIdx,1,vegetable); + res.json(vegetable) +}) -// GET /fruits -// GET /fruits?name=[partial] -// TODO: [ ] Make search case insensitive +/** + * Fruit Routes + */ app.get('/fruits', (req, res, next) => { const { fruits } = data @@ -118,7 +124,6 @@ app.delete('/fruits/:id', (req, res, next) => { const { fruits } = data const { id } = req.params const fruitIdx = fruits.findIndex(fruit => fruit.id == id) - console.log(`fruit index is ${fruitIdx}`); if (fruitIdx < 0) { const message = `Could not find fruit with ID of ${id}` next({ status: 404, message }) @@ -128,6 +133,18 @@ app.delete('/fruits/:id', (req, res, next) => { res.json(fruit) }) +app.put('/fruits/:id', helpers.validate, (req, res, next) => { + const { fruits } = data + const { id } = req.params + const fruitIdx = fruits.findIndex(fruit => fruit.id == id) + if (fruitIdx < 0) { + const message = `Could not find fruit with ID of ${id}` + next({ status: 404, message }) + } + const fruit = {id: req.params.id, name: req.body.name, price:req.body.price} + fruits.splice(fruitIdx,1,fruit); + res.json(fruit) +}) app.use((req, res, next) => { next({ diff --git a/readme.md b/readme.md index a16a356..9e28c82 100644 --- a/readme.md +++ b/readme.md @@ -14,13 +14,13 @@ Improve upon and/or build the following routes as specified. - [X] [GET /vegetables?name=[partial-query]](#get-vegetablesnamepartial-query) - [X] [DELETE /vegetables/[id]](#delete-vegetablesid) -- [ ] [PUT /vegetables/[id]](#put-vegetablesid) +- [X] [PUT /vegetables/[id]](#put-vegetablesid) - [X] [GET /fruits](#get-fruits) - [X] [GET /fruits?name=[partial-query]](#get-fruitsnamepartial-query) - [X] [GET /fruits/[id]](#get-fruitsid) - [X] [POST /fruits](#post-fruitsid) - [X] [DELETE /fruits/[id]](#delete-fruitsid) -- [ ] [PUT /fruits/[id]](#put-fruitsid) +- [X] [PUT /fruits/[id]](#put-fruitsid) ### GET /vegetables?name=[partial-query]