diff --git a/app.js b/app.js index d2e92a4..55128e6 100644 --- a/app.js +++ b/app.js @@ -9,35 +9,141 @@ app.use(require('body-parser').json()) const data = { fruits: [], - vegetables: [] + vegetables: [] } +// GET /vegetables +// implement /vegetables?name=[partial-query] in here app.get('/vegetables', (req, res, next) => { const { vegetables } = data - res.json(vegetables) + const { name } = req.query + if ( name ) { + const filteredVegetables = vegetables.filter(vegetable => vegetable.name.includes(name)) + res.json(filteredVegetables) + } else { + res.json(vegetables) + } + }) +// GET /vegetables/[id] app.get('/vegetables/: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 }) + } else { + res.json(vegetable) } - - res.json(vegetable) }) +//POST /vegetables app.post('/vegetables', helpers.validate, (req, res, next) => { const { vegetables } = data const vegetable = { id: generateId(), ...req.body } - vegetables.push(vegetable) res.status(201).json(vegetable) }) + +// DELETE /vegetables/[id] +app.delete('/vegetables/:id', (req, res, next) => { + const { vegetables } = data + const { id } = req.params + const index = vegetables.findIndex(vegetable => vegetable.id === id) + if (index === -1) { + const message = `Could not find vegetable with ID of ${id}` + next({ status: 404, message }) + } else { + const removed = vegetables.splice(index, 1); + res.json(removed[0]) + } +}) + +// PUT /vegetables/[id] +// helpers.validate helps us with req.body here and returns Bad request if not all keys passed. +app.put('/vegetables/:id', helpers.validate, (req, res, next) => { + const { vegetables } = data + const { id } = req.params + const { name, price } = req.body + const index = vegetables.findIndex(vegetable => vegetable.id === id) + if (index === -1) { + const message = `Could not find vegetable with ID of ${id}` + next({ status: 404, message }) + } else { + const updatedVegetable = {id, name, price} + vegetables.splice(index, 1, updatedVegetable) + res.json(updatedVegetable) + } +}) + +// GET /fruits +// implement /fruits?name=[partial-query] in here +app.get('/fruits', (req, res, next) => { + const { fruits } = data + const { name } = req.query + if (name) { + res.json(fruits.filter(fruit => fruit.name.includes(name))) + } else { + res.json(fruits) + } +}) + +// GET /fruits[id] +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 }) + } else { + res.json(fruit) + } +}) + +//POST /fruits +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) +}) + +// DELETE /fruits/[id] +app.delete('/fruits/:id', (req, res, next) => { + const { fruits } = data + const { id } = req.params + const index = fruits.findIndex(fruit => fruit.id === id) + if (index === -1) { + const message = `Could not find vegetable with ID of ${id}` + next({ status: 404, message }) + } else { + const removed = fruits.splice(index, 1); + res.json(removed[0]) + } +}) + +// PUT /fruits/[id] +// helpers.validate helps us with req.body here and returns Bad request if not all keys passed. +app.put('/fruits/:id', helpers.validate, (req, res, next) => { + const { fruits } = data + const { id } = req.params + const { name, price } = req.body + const index = fruits.findIndex(fruit => fruit.id === id) + //if not throw an error + if (index === -1) { + const message = `Could not find fruit with ID of ${id}` + next({ status: 404, message }) + } else { + const updatedFruit = {id, name, price} + fruits.splice(index, 1, updatedFruit) + res.json(updatedFruit) + } +}) + app.use((req, res, next) => { next({ status: 404, @@ -45,6 +151,7 @@ app.use((req, res, next) => { }) }) +//err handler app.use((err, req, res, next) => { const { message, status } = err res.status(status).json({ message }) diff --git a/readme.md b/readme.md index cc9fe47..59e2d2f 100644 --- a/readme.md +++ b/readme.md @@ -12,15 +12,15 @@ 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) -- [ ] [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) -- [ ] [PUT /fruits/[id]](#put-fruitsid) +- [x] [GET /vegetables?name=[partial-query]](#get-vegetablesnamepartial-query) +- [x] [DELETE /vegetables/[id]](#delete-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) +- [x] [PUT /fruits/[id]](#put-fruitsid) ### GET /vegetables?name=[partial-query] diff --git a/src/helpers.js b/src/helpers.js index 3c761e6..94a3940 100644 --- a/src/helpers.js +++ b/src/helpers.js @@ -1,13 +1,13 @@ const REQUIRED_KEYS = [ 'name', 'price' ] const validate = (req, res, next) => { const error = { status: 400, message: 'Bad request' } - if (!req.body) next(error) + if (!req.body) return next(error) const hasAllKeys = REQUIRED_KEYS.every(key => req.body[key]) - if (!hasAllKeys) next(error) + if (!hasAllKeys) return next(error) const noExtraKeys = Object.keys(req.body).every(key => REQUIRED_KEYS.includes(key)) - if (!noExtraKeys) next(error) + if (!noExtraKeys) return next(error) next() }