From 10c9811fc534a2738c19d8f74a447ed500b730a2 Mon Sep 17 00:00:00 2001 From: Wu Cheng-Han Date: Thu, 2 Jul 2015 00:10:20 +0800 Subject: Jump to 0.3.1 --- lib/note.js | 153 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 147 insertions(+), 6 deletions(-) (limited to 'lib/note.js') diff --git a/lib/note.js b/lib/note.js index 1212e1a6..dc384b7f 100644 --- a/lib/note.js +++ b/lib/note.js @@ -1,22 +1,56 @@ //note //external modules +var mongoose = require('mongoose'); +var Schema = mongoose.Schema; var LZString = require('lz-string'); var marked = require('marked'); var cheerio = require('cheerio'); +var shortId = require('shortid'); //others var db = require("./db.js"); +var logger = require("./logger.js"); + +//permission types +permissionTypes = ["freely", "editable", "locked"]; + +// create a note model +var model = mongoose.model('note', { + id: String, + shortid: { + type: String, + unique: true, + default: shortId.generate + }, + permission: { + type: String, + enum: permissionTypes + }, + viewcount: { + type: Number, + default: 0 + }, + updated: Date, + created: Date +}); //public var note = { + model: model, + findNote: findNote, + newNote: newNote, + findOrNewNote: findOrNewNote, checkNoteIdValid: checkNoteIdValid, checkNoteExist: checkNoteExist, - getNoteTitle: getNoteTitle + getNoteTitle: getNoteTitle, + generateWebTitle: generateWebTitle, + increaseViewCount: increaseViewCount, + updatePermission: updatePermission }; function checkNoteIdValid(noteId) { try { - //console.log(noteId); + //logger.info(noteId); var id = LZString.decompressFromBase64(noteId); if (!id) return false; var uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i; @@ -26,21 +60,21 @@ function checkNoteIdValid(noteId) { else return false; } catch (err) { - console.error(err); + logger.error(err); return false; } } function checkNoteExist(noteId) { try { - //console.log(noteId); + //logger.info(noteId); var id = LZString.decompressFromBase64(noteId); db.readFromDB(id, function (err, result) { if (err) return false; return true; }); } catch (err) { - console.error(err); + logger.error(err); return false; } } @@ -50,11 +84,118 @@ function getNoteTitle(body) { var $ = cheerio.load(marked(body)); var h1s = $("h1"); var title = ""; - if (h1s.length > 0) + if (h1s.length > 0 && h1s.first().text().split('\n').length == 1) title = h1s.first().text(); else title = "Untitled"; return title; } +//generate note web page title +function generateWebTitle(title) { + title = !title || title == "Untitled" ? "HackMD - Collaborative notes" : title + " - HackMD"; + return title; +} + +function findNote(id, callback) { + model.findOne({ + $or: [ + { + id: id + }, + { + shortid: id + } + ] + }, function (err, note) { + if (err) { + logger.error('find note failed: ' + err); + callback(err, null); + } + if (!err && note) { + callback(null, note); + } else { + logger.error('find note failed: ' + err); + callback(err, null); + }; + }); +} + +function newNote(id, permission, callback) { + var note = new model({ + id: id, + permission: permission, + updated: Date.now(), + created: Date.now() + }); + note.save(function (err) { + if (err) { + logger.error('new note failed: ' + err); + callback(err, null); + } else { + logger.info("new note success: " + note.id); + callback(null, note); + }; + }); +} + +function findOrNewNote(id, permission, callback) { + findNote(id, function (err, note) { + if (err || !note) { + newNote(id, permission, function (err, note) { + if (err) { + logger.error('find or new note failed: ' + err); + callback(err, null); + } else { + callback(null, note); + } + }); + } else { + if (!note.permission) { + note.permission = permission; + note.updated = Date.now(); + note.save(function (err) { + if (err) { + logger.error('add note permission failed: ' + err); + callback(err, null); + } else { + logger.info("add note permission success: " + note.id); + callback(null, note); + }; + }); + } else { + callback(null, note); + } + } + }); +} + +function increaseViewCount(note, callback) { + note.viewcount++; + note.updated = Date.now(); + note.save(function (err) { + if (err) { + logger.error('increase note viewcount failed: ' + err); + callback(err, null); + } else { + logger.info("increase note viewcount success: " + note.id); + callback(null, note); + }; + }); +} + +function updatePermission(note, permission, callback) { + note.permission = permission; + note.updated = Date.now(); + note.save(function (err) { + if (err) { + logger.error('update note permission failed: ' + err); + callback(err, null); + } else { + logger.info("update note permission success: " + note.id); + callback(null, note); + }; + }); +} + module.exports = note; \ No newline at end of file -- cgit v1.2.3