diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index c5ea1ff..0000000 Binary files a/.DS_Store and /dev/null differ diff --git a/hw2/claudio_maggioni/README.md b/hw2/Claudio_Maggioni/README.md similarity index 100% rename from hw2/claudio_maggioni/README.md rename to hw2/Claudio_Maggioni/README.md diff --git a/hw2/claudio_maggioni/jsverify-util.js b/hw2/Claudio_Maggioni/jsverify-util.js similarity index 100% rename from hw2/claudio_maggioni/jsverify-util.js rename to hw2/Claudio_Maggioni/jsverify-util.js diff --git a/hw2/claudio_maggioni/qunit-compat.js b/hw2/Claudio_Maggioni/qunit-compat.js similarity index 100% rename from hw2/claudio_maggioni/qunit-compat.js rename to hw2/Claudio_Maggioni/qunit-compat.js diff --git a/hw2/claudio_maggioni/resources/jsverify.standalone.js b/hw2/Claudio_Maggioni/resources/jsverify.standalone.js similarity index 100% rename from hw2/claudio_maggioni/resources/jsverify.standalone.js rename to hw2/Claudio_Maggioni/resources/jsverify.standalone.js diff --git a/hw2/claudio_maggioni/resources/lodash.js b/hw2/Claudio_Maggioni/resources/lodash.js similarity index 100% rename from hw2/claudio_maggioni/resources/lodash.js rename to hw2/Claudio_Maggioni/resources/lodash.js diff --git a/hw2/claudio_maggioni/resources/qunit-2.4.0.js b/hw2/Claudio_Maggioni/resources/qunit-2.4.0.js similarity index 100% rename from hw2/claudio_maggioni/resources/qunit-2.4.0.js rename to hw2/Claudio_Maggioni/resources/qunit-2.4.0.js diff --git a/hw2/claudio_maggioni/resources/qunit.css b/hw2/Claudio_Maggioni/resources/qunit.css similarity index 100% rename from hw2/claudio_maggioni/resources/qunit.css rename to hw2/Claudio_Maggioni/resources/qunit.css diff --git a/hw2/claudio_maggioni/script.js b/hw2/Claudio_Maggioni/script.js similarity index 100% rename from hw2/claudio_maggioni/script.js rename to hw2/Claudio_Maggioni/script.js diff --git a/hw2/claudio_maggioni/test.html b/hw2/Claudio_Maggioni/test.html similarity index 100% rename from hw2/claudio_maggioni/test.html rename to hw2/Claudio_Maggioni/test.html diff --git a/hw2/claudio_maggioni/test.js b/hw2/Claudio_Maggioni/test.js similarity index 100% rename from hw2/claudio_maggioni/test.js rename to hw2/Claudio_Maggioni/test.js diff --git a/hw5/Claudio_Maggioni/app.js b/hw5/Claudio_Maggioni/app.js index f071055..926df66 100644 --- a/hw5/Claudio_Maggioni/app.js +++ b/hw5/Claudio_Maggioni/app.js @@ -50,10 +50,18 @@ fs.readFile(__dirname + '/db.json', { encoding: 'utf8' }, (e, data) => { app.use('/bookmarked', routers.bookmarked); }); -app.locals.writeFavs = () => { - fs.writeFile(__dirname + '/db.json', JSON.stringify(app.locals.favourites), +let writing = false; +app.locals.writeFavs = (done) => { + if (writing) { + setTimeout(() => app.locals.writeFavs(done), 100); + return; + } + writing = true; + fs.writeFile(__dirname + '/db.json', JSON.stringify(app.locals.favourites), { encoding: 'utf8' }, err => { if (err) console.error(err); + writing = false; + done(); }); } diff --git a/hw5/Claudio_Maggioni/readme.md b/hw5/Claudio_Maggioni/readme.md new file mode 100644 index 0000000..4e13e9d --- /dev/null +++ b/hw5/Claudio_Maggioni/readme.md @@ -0,0 +1,3 @@ +# Bonuses implemented: +- *Excercise 6*, Bookmarks +- *Excercise 7*, Persistent favourites diff --git a/hw5/Claudio_Maggioni/routes/favourites/router.js b/hw5/Claudio_Maggioni/routes/favourites/router.js index c7b8461..98e6f59 100644 --- a/hw5/Claudio_Maggioni/routes/favourites/router.js +++ b/hw5/Claudio_Maggioni/routes/favourites/router.js @@ -8,8 +8,9 @@ const router = express.Router(); let id = 1; -function nextId() { - return id++; +function nextId(favs) { + while (favs.some((newId => e => e._id == newId)(++id))); + return id; } function createFav(req, res) { @@ -20,26 +21,39 @@ function createFav(req, res) { } const favourite = { - _id: req.body._id ? req.body._id : nextId(), + _id: req.body._id ? req.body._id : nextId(req.app.locals.favourites), name: req.body.name, dataURL: req.body.dataURL, bookmarked: req.body.bookmarked, }; req.app.locals.favourites.push(favourite); - req.app.locals.writeFavs(); - - res.status = 201; - renderFav(req, res, favourite, false); + req.app.locals.writeFavs(() => { + res.status = 201; + renderFav(req, res, favourite, false); + }); } router.post('/', createFav); 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)); + let ctx; + if (list) { + const f = []; + for (const e of favs) { + f.push(Object.assign({ + b: e.bookmarked === 'true' || e.bookmarked === true + }, e)); + } + ctx = {favs: f}; + } else { + ctx = Object.assign({ + b: favs.bookmarked === 'true' || favs.bookmarked === true + }, favs); + } + + res.render(list ? 'favourites.dust' : 'favourite.dust', ctx); } else if (req.accepts('json')) { res.json(favs); } else { @@ -76,30 +90,38 @@ router.get('/:id', (req, res) => { } }); -router.put('/:id', (req, res) => { - const edit = req.app.locals.favourites - .find(e => e._id == req.params.id); +function handleUpdate(partial = false) { + return (req, res) => { + const edit = req.app.locals.favourites + .find(e => e._id == req.params.id); - if (!edit) { - createFav(req, res); - } else { - for (const key of ['dataURL', 'name']) { - if (req.body[key]) { - edit[key] = req.body[key]; - } else { - res.writeHead(400, { 'Content-Type': 'text/plain' }); - res.end('Bad PUT form parameters'); - return; + if (!edit) { + createFav(req, res); + } else { + for (const key of ['dataURL', 'name']) { + if (req.body[key]) { + edit[key] = req.body[key]; + } else if (!partial) { + res.writeHead(400, { 'Content-Type': 'text/plain' }); + res.end('Bad PUT form parameters'); + return; + } } + + if (req.body.bookmarked !== undefined) { + edit.bookmarked = req.body.bookmarked; + } + req.app.locals.writeFavs(() => { + res.status = 200; + renderFav(req, res, edit, false); + }); } + }; +} - edit.bookmarked = !!req.body.bookmarked; - req.app.locals.writeFavs(); +router.put('/:id', handleUpdate()); +router.patch('/:id', handleUpdate(true)); - res.status = 200; - renderFav(req, res, edit, false); - } -}); router.delete('/:id', (req, res) => { let idx = -1; @@ -116,13 +138,13 @@ router.delete('/:id', (req, res) => { return; } else { req.app.locals.favourites.splice(idx, 1); - req.app.locals.writeFavs(); - - res.format({ - json: () => res.writeHead(204), - html: () => res.writeHead(302, { 'Location': '/favorites' }) + req.app.locals.writeFavs(() => { + res.format({ + json: () => res.writeHead(204), + html: () => res.writeHead(302, { 'Location': '/favorites' }) + }); + res.end(); }); - res.end(); } }); @@ -138,10 +160,10 @@ router.put('/:id/bookmarked', (req, res) => { 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); + req.app.locals.writeFavs(() => { + res.status = 200; + renderFav(req, res, edit, false); + }); } }); diff --git a/hw5/Claudio_Maggioni/views/favourite_partial.dust b/hw5/Claudio_Maggioni/views/favourite_partial.dust index c01bcc0..a431d83 100644 --- a/hw5/Claudio_Maggioni/views/favourite_partial.dust +++ b/hw5/Claudio_Maggioni/views/favourite_partial.dust @@ -2,6 +2,11 @@

{name}

{name} +{?b} +

+ Bookmarked +

+{/b} {?details} Details {:else} diff --git a/hw5/Claudio_Maggioni/views/favourites.dust b/hw5/Claudio_Maggioni/views/favourites.dust index ba29203..271d285 100644 --- a/hw5/Claudio_Maggioni/views/favourites.dust +++ b/hw5/Claudio_Maggioni/views/favourites.dust @@ -17,7 +17,7 @@ {/bookmarked} {#favs}
- {>"favourite_partial" name=name dataURL=dataURL _id=_id details="true" /} + {>"favourite_partial" name=name dataURL=dataURL _id=_id b=b details="true" /}
{:else} No favourites.