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, "
| Published | ${note.published} |