diff --git a/hw5/Claudio_Maggioni/app.js b/hw5/Claudio_Maggioni/app.js index 20a23f5..f071055 100644 --- a/hw5/Claudio_Maggioni/app.js +++ b/hw5/Claudio_Maggioni/app.js @@ -46,7 +46,8 @@ fs.readFile(__dirname + '/db.json', { encoding: 'utf8' }, (e, data) => { // Initialize routers here const routers = require('./routes/routers'); app.use('/', routers.root); - app.use('/favourites', routers.favourites); + app.use('/favorites', routers.favourites); + app.use('/bookmarked', routers.bookmarked); }); app.locals.writeFavs = () => { diff --git a/hw5/Claudio_Maggioni/public/scripts/app.js b/hw5/Claudio_Maggioni/public/scripts/app.js index ca4db4e..d5bf617 100644 --- a/hw5/Claudio_Maggioni/public/scripts/app.js +++ b/hw5/Claudio_Maggioni/public/scripts/app.js @@ -49,7 +49,7 @@ class App { const form = document.createElement('form'); form.method = 'POST'; - form.action = '/favourites'; + form.action = '/favorites'; const image = document.createElement('input'); image.type = 'hidden'; diff --git a/hw5/Claudio_Maggioni/routes/bookmarked/router.js b/hw5/Claudio_Maggioni/routes/bookmarked/router.js new file mode 100644 index 0000000..6574209 --- /dev/null +++ b/hw5/Claudio_Maggioni/routes/bookmarked/router.js @@ -0,0 +1,18 @@ +/** @module root/router */ +'use strict'; +// vim: set ts=2 sw=2 et tw=80: + +const express = require('express'); +const router = express.Router(); + +router.get('/', (req, res) => { + const favs = req.app.locals.favourites + .filter(e => e.bookmarked === true || e.bookmarked === 'true'); + res.format({ + html: () => res.render('favourites.dust', { favs: favs, bookmarked: true }), + json: () => res.send(favs) + }); +}); + +/** router for /root */ +module.exports = router; diff --git a/hw5/Claudio_Maggioni/routes/favourites/router.js b/hw5/Claudio_Maggioni/routes/favourites/router.js index 1c14a91..c7b8461 100644 --- a/hw5/Claudio_Maggioni/routes/favourites/router.js +++ b/hw5/Claudio_Maggioni/routes/favourites/router.js @@ -20,65 +20,65 @@ function createFav(req, res) { } const favourite = { - _id: nextId(), + _id: req.body._id ? req.body._id : nextId(), name: req.body.name, - dataURL: req.body.dataURL + dataURL: req.body.dataURL, + bookmarked: req.body.bookmarked, }; req.app.locals.favourites.push(favourite); req.app.locals.writeFavs(); res.status = 201; - renderOne(res, favourite); + renderFav(req, res, favourite, false); } router.post('/', createFav); -function renderAll(res, favs) { - res.format({ - html: () => res.render('favourites.dust', { favs: favs }), - json: () => res.send(favs) - }); -} - -function renderOne(res, fav) { - res.format({ - html: () => res.render('favourite.dust', fav), - json: () => res.send(fav) - }); +function renderFav(req, res, favs, list = true) { + if (req.accepts('html')) { + res.render(list ? 'favourites.dust' : 'favourite.dust', + list ? { favs: favs } : Object.assign({b: favs.bookmarked === 'true' || + favs.bookmarked === true}, favs)); + } else if (req.accepts('json')) { + res.json(favs); + } else { + res.writeHead(406); + res.end(); + } } router.get('/', (req, res) => { - renderAll(res, req.app.locals.favourites); -}); - -router.get('/:id', (req, res) => { - const id = parseInt(req.params.id); - const fav = req.app.locals.favourites.filter(e => e._id === id)[0]; - if (fav) { - renderOne(res, fav); - } else { - res.writeHead(404, {'Content-Type': 'text/plain'}); - res.end('Not found'); - } + renderFav(req, res, req.app.locals.favourites); }); router.get('/search', (req, res) => { const filtered = req.app.locals.favourites.filter(e => { for (const k in req.query) { - if (k != 'dataURL' && req.query[k] != e[k]) { + if (k != 'dataURL' && k != '_method' && req.query[k] != e[k]) { return false; } } return true; }); - renderAll(res, filtered); + renderFav(req, res, filtered); +}); + +router.get('/:id', (req, res) => { + const fav = req.app.locals.favourites + .filter(e => e._id == req.params.id)[0]; + if (fav) { + renderFav(req, res, fav, false); + } else { + res.writeHead(404, {'Content-Type': 'text/plain'}); + res.end('Not found'); + } }); router.put('/:id', (req, res) => { const edit = req.app.locals.favourites - .find(e => e._id === parseInt(req.params.id)); + .find(e => e._id == req.params.id); if (!edit) { createFav(req, res); @@ -93,19 +93,18 @@ router.put('/:id', (req, res) => { } } - edit.bookmarked = !!req.params.bookmarked; + edit.bookmarked = !!req.body.bookmarked; req.app.locals.writeFavs(); res.status = 200; - renderOne(res, edit); + renderFav(req, res, edit, false); } }); router.delete('/:id', (req, res) => { let idx = -1; - const id = parseInt(req.params.id); for (let i = 0; i < req.app.locals.favourites.length; i++) { - if (req.app.locals.favourites[i]._id === id) { + if (req.app.locals.favourites[i]._id == req.params.id) { idx = i; break; } @@ -120,14 +119,31 @@ router.delete('/:id', (req, res) => { req.app.locals.writeFavs(); res.format({ - json: () => res.writeHead(202), - html: () => res.writeHead(302, { 'Location': '/favourites' }) + json: () => res.writeHead(204), + html: () => res.writeHead(302, { 'Location': '/favorites' }) }); res.end(); } }); +router.put('/:id/bookmarked', (req, res) => { + const edit = req.app.locals.favourites + .find(e => e._id == req.params.id); + if (!edit) { + res.writeHead(404, { 'Content-Type': 'text/plain' }); + res.end('Favourite to bookmark not found'); + } else if (!req.body.bookmarked) { + res.writeHead(400, { 'Content-Type': 'text/plain' }); + res.end('Bad PUT bookmark form parameters'); + } else { + edit.bookmarked = req.body.bookmarked; + req.app.locals.writeFavs(); + + res.status = 200; + renderFav(req, res, edit, false); + } +}); /** router for /root */ module.exports = router; diff --git a/hw5/Claudio_Maggioni/test/routes/4.favorite.update.js b/hw5/Claudio_Maggioni/test/routes/4.favorite.update.js index 5ec05e0..81983f2 100644 --- a/hw5/Claudio_Maggioni/test/routes/4.favorite.update.js +++ b/hw5/Claudio_Maggioni/test/routes/4.favorite.update.js @@ -11,6 +11,7 @@ describe('Task 4: Testing Update on /favorites routes', function(){ it('should change the name of an existing favorite', function(done){ let reqBody = {} reqBody[config.form.name] = 'newName' + reqBody[config.form.dataURL] = favs[3][config.form.dataURL] // maggicl: added to comply with assignment request(config.url) .put('/favorites/' + favs[3]._id) diff --git a/hw5/Claudio_Maggioni/views/favourite_partial.dust b/hw5/Claudio_Maggioni/views/favourite_partial.dust index 6656892..c01bcc0 100644 --- a/hw5/Claudio_Maggioni/views/favourite_partial.dust +++ b/hw5/Claudio_Maggioni/views/favourite_partial.dust @@ -3,15 +3,21 @@

{name}

{name} {?details} -Details +Details {:else} -
+

-
- +
+ {?b} + + {:else} + + {/b}
-Favourites list +Favourites list {/details} diff --git a/hw5/Claudio_Maggioni/views/favourites.dust b/hw5/Claudio_Maggioni/views/favourites.dust index 60a7f1d..ba29203 100644 --- a/hw5/Claudio_Maggioni/views/favourites.dust +++ b/hw5/Claudio_Maggioni/views/favourites.dust @@ -3,10 +3,18 @@ + {?bookmarked} + Bookmarked + {:else} Favourites + {/bookmarked} + {?bookmarked} +

Bookmarked

+ {:else}

Favourites

+ {/bookmarked} {#favs}
{>"favourite_partial" name=name dataURL=dataURL _id=_id details="true" /} diff --git a/hw5/Claudio_Maggioni/views/index.dust b/hw5/Claudio_Maggioni/views/index.dust index e7febfa..02c3344 100644 --- a/hw5/Claudio_Maggioni/views/index.dust +++ b/hw5/Claudio_Maggioni/views/index.dust @@ -28,7 +28,7 @@

Favourites

{#favs} - {>"favourite_partial" name=name dataURL=dataURL _id=_id bookmarked=bookmarked details="true" /} + {>"favourite_partial" name=name dataURL=dataURL _id=_id b=b details="true" /} {/favs}