From f8d3a2a3238f5cc54af73038e98c9a5c2d9df417 Mon Sep 17 00:00:00 2001 From: Claudio Maggioni Date: Mon, 28 Oct 2019 08:35:04 +0100 Subject: [PATCH] hw5: mastery check edits --- .DS_Store | Bin 10244 -> 0 bytes .../README.md | 0 .../jsverify-util.js | 0 .../qunit-compat.js | 0 .../resources/jsverify.standalone.js | 0 .../resources/lodash.js | 0 .../resources/qunit-2.4.0.js | 0 .../resources/qunit.css | 0 .../script.js | 0 .../test.html | 0 .../test.js | 0 hw5/Claudio_Maggioni/app.js | 12 ++- hw5/Claudio_Maggioni/readme.md | 3 + .../routes/favourites/router.js | 100 +++++++++++------- .../views/favourite_partial.dust | 5 + hw5/Claudio_Maggioni/views/favourites.dust | 2 +- 16 files changed, 80 insertions(+), 42 deletions(-) delete mode 100644 .DS_Store rename hw2/{claudio_maggioni => Claudio_Maggioni}/README.md (100%) rename hw2/{claudio_maggioni => Claudio_Maggioni}/jsverify-util.js (100%) rename hw2/{claudio_maggioni => Claudio_Maggioni}/qunit-compat.js (100%) rename hw2/{claudio_maggioni => Claudio_Maggioni}/resources/jsverify.standalone.js (100%) rename hw2/{claudio_maggioni => Claudio_Maggioni}/resources/lodash.js (100%) rename hw2/{claudio_maggioni => Claudio_Maggioni}/resources/qunit-2.4.0.js (100%) rename hw2/{claudio_maggioni => Claudio_Maggioni}/resources/qunit.css (100%) rename hw2/{claudio_maggioni => Claudio_Maggioni}/script.js (100%) rename hw2/{claudio_maggioni => Claudio_Maggioni}/test.html (100%) rename hw2/{claudio_maggioni => Claudio_Maggioni}/test.js (100%) create mode 100644 hw5/Claudio_Maggioni/readme.md diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index c5ea1ff5835263c58859204ef9834db8b874187e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10244 zcmeHMYiu0V6~3SCBr}t7JPrhVH;H#+*Ll@Ryx#Szd9CdY!Nh6Y*ui!Z;_P~-@xpp{ z*;(63jKQ=&+NweP0UAxZa>ilxp-Gw0rO?qlwm@7(X+JB%^3k4Alrc^P90-CP%rhJg^)*K%C7lWwn&f)A4}g0mlP55AgZHOE;H6 zTTV$SrVe_DEda?9Qj3ey22YUm+A?U%DJjW97i3kEvMTH?24r>8d+l;TTTV$St25Y} z57<4!-l0JBPVIX|afYCj&eQRL&M z+j)BA-1&*yC-1l@2LyXkU}XgZd|-BTacitYo=y}!6G_R@y_FrEs;$;b-8XdJct}4y zXsjKh7eA89#F7c?CNpi395l)-8f@oKGSQtjxxH^F86O=dE5@4{=+BsEGu$@M)PLMcrZXL)u|dNawalX?wG|sPL)4E5g zVv)Gnn+T7X#-CJGRH}5j-TkAH*lnY+%sHb*QD)W})~XSHy9Nb zca{4SigJSMJJKdSrCQ(O-liI1rPrdDlTFm=J5|F{dvB$0E35i+zhXqyWASjrj7wFM z-l7=R*%wx!nU? z-xiIUQAJT|vY);txK$==_Ww~P#Q4>kV7*;LVH;Tk3$ZSCnx)wUyPI8P)9eX$nLWjx zV=uAS*;V#i_8xnm{e^wN{t7^Yj#8{a1uEgjdTfOc4e(<>Za^mvp$nhEah$--IE5j^ zF@hvg7{i^I!sqaLd>QxRK3v2Dco@@o4By4~@I(9yzaURZ|$}n4b6MnasVj!=5t_~ zk3|7Li7$b>EUv^ipCPQT->^~l93w=UXBUePV-?4qB1&(n_IL~qI+_5P;6030y0d*6$Uru2KetdD91QU^UH#>LvE^6 zr}cFkt2ckLzVTE0Lo=l!UN!B*QcgKK2>;hrRF=Bjt_@i>DvUyfI4H+QqK_(%OPdq$ zA_95uH6E8MKl&*axq8c1mnJ3x5sq9_w?os!d>}%QYkUowOU@G_NV%%1S#xFQ3lW=K zxqFZ1%FRM@Uf}9ro6A)&Cy7ZyjLzdas3>`Cl%pWYJOSl7!cGG#Vvw(5*R1ixl7Q_1)Fp(;SoG8V)rtBglBODKf_D-CEmi@5|25;DU98# zc`%+OoKp*d)qVXzE%dR1^-Z0BDZVUPS5>ohNj}L3(UKH02ZtQX#3 zJF!bFb^_RoeT2L=bkK6=FmXvYj?$9nByq_gamg(WPgE^vtQSd%f|!7@>RV2{Qtn> z|NocI3p;P(c);<%NA3ZXgnB~l)NJG2M*wB`alAN( nAzSv`h1Uy`p35mIDMi=+{Aa-2^D$@t@9h86_QCW2&Hn#CaW;cU 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.