Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
119 changes: 113 additions & 6 deletions app.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,42 +9,149 @@ 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,
message: `Could not ${req.method} ${req.path}`
})
})

//err handler
app.use((err, req, res, next) => {
const { message, status } = err
res.status(status).json({ message })
Expand Down
18 changes: 9 additions & 9 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -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]

Expand Down
6 changes: 3 additions & 3 deletions src/helpers.js
Original file line number Diff line number Diff line change
@@ -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()
}
Expand Down