From 676eb95a4ba4a8ad0557e6d8866e4c0261163b54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20M=C3=BCller?= Date: Sun, 18 Oct 2015 11:44:02 +0200 Subject: [PATCH] stats counting implemented --- server.js | 56 +++++++++++++++++++++++++++++++++++------------------ src/view.js | 8 ++++---- 2 files changed, 41 insertions(+), 23 deletions(-) diff --git a/server.js b/server.js index 49eb2ae..80ac174 100644 --- a/server.js +++ b/server.js @@ -9,7 +9,14 @@ var app = express(); app.use(bodyParser.urlencoded({ extended: true })); -var CACHE = new LRU(30); +var MODELS = {}; +var CACHE = new LRU({ + max: 50, + dispose: key => { + MODELS[key].save(); + delete MODELS[key]; + } +}); var getTimeStamp = () => { var timestamp = new Date().getTime(); @@ -24,17 +31,17 @@ app.get('/new', function (req, res) { }); app.post('/note', function (req, res) { - var body = req.body, - session = body.session, - note = body.note, - password = md5(body.password); + var body = req.body, + session = body.session, + note = body.note, + password = md5(body.password); var goToNote = note => res.redirect("/" + note.id); if (session.indexOf(getTimeStamp()) != 0) return sendResponse(res, 400, "Session expired"); var expectedSignature = md5(session + note.replace(/[\n\r]/g, "")); if (expectedSignature != body.signature) return sendResponse(res, 400, "Signature mismatch"); - console.log(body) + console.log(body) if (body.action == "POST") storage.addNote(note, password).then(goToNote); else @@ -53,42 +60,53 @@ app.get("/:year/:month/:day/:title", function (req, res) { app.get(/\/([a-z0-9]+\/edit)/, function (req, res) { var link = req.params["0"].replace("/edit", ""); - storage.getNote(link).then(note => res.send(note - ? view.editNotePage(getTimeStamp() + md5(Math.random()), note) - : notFound(res))); + storage.getNote(link).then(note => res.send(note + ? view.editNotePage(getTimeStamp() + md5(Math.random()), note) + : notFound(res))); }); app.get(/\/([a-z0-9]+\/export)/, function (req, res) { var link = req.params["0"].replace("/export", ""); res.set({ 'Content-Type': 'text/plain', 'Charset': 'utf-8' }); - storage.getNote(link).then(note => note - ? res.send(note.text) - : notFound(res)); + storage.getNote(link).then(note => note + ? res.send(note.text) + : notFound(res)); }); app.get(/\/([a-z0-9]+\/stats)/, function (req, res) { var link = req.params["0"].replace("/stats", ""); - storage.getNote(link).then(note => note - ? res.send(view.buildStats(note)) - : notFound(res)); + var promise = link in MODELS + ? new Promise(resolve => resolve(MODELS[link])) + : storage.getNote(link); + promise.then(note => note + ? res.send(view.renderStats(note)) + : notFound(res)); }); app.get(/\/([a-z0-9]+)/, function (req, res) { var link = req.params["0"]; - if (CACHE.has(link)) res.send(CACHE.get(link)); - else storage.getNote(link).then(note => { + if (CACHE.has(link)) { + (link in MODELS) && MODELS[link].views++; + res.send(CACHE.get(link)); + } else storage.getNote(link).then(note => { if (!note) return notFound(res); - var content = view.buildNote(note); + var content = view.renderNote(note); CACHE.set(link, content); + MODELS[link] = note; res.send(content); }); }); var sendResponse = (res, code, message) => - res.status(code).send(view.buildPage(message, "

" + message + "

", "")); + res.status(code).send(view.renderPage(message, "

" + message + "

", "")); var notFound = res => sendResponse(res, 404, "Not found"); var server = app.listen(3000, function () { console.log('NoteHub server listening on port %s', server.address().port); }); + +setInterval(() => { + console.log("saving stats..."); + Object.keys(MODELS).forEach(id => MODELS[id].save()) +}, 60 * 5 * 1000); \ No newline at end of file diff --git a/src/view.js b/src/view.js index 35b00c6..df81a65 100644 --- a/src/view.js +++ b/src/view.js @@ -9,14 +9,14 @@ var deriveTitle = text => text .split(/[\n\r]/)[0].slice(0,25) .replace(/[^a-zA-Z0-9\s]/g, ""); -var buildPage = (title, content, footer) => pageTemplate +var renderPage = (title, content, footer) => pageTemplate .replace("%TITLE%", title) .replace("%CONTENT%", content) .replace("%FOOTER%", footer); -module.exports.buildPage = buildPage; +module.exports.renderPage = renderPage; -module.exports.buildStats = note => buildPage(deriveTitle(note.text), +module.exports.renderStats = note => renderPage(deriveTitle(note.text), `

Statistics

@@ -25,7 +25,7 @@ module.exports.buildStats = note => buildPage(deriveTitle(note.text),
Published${note.published}
`, ""); -module.exports.buildNote = note => buildPage(deriveTitle(note.text), +module.exports.renderNote = note => renderPage(deriveTitle(note.text), marked(note.text), footerTemplate.replace(/%LINK%/g, note.id));