summaryrefslogtreecommitdiff
path: root/lib/note.js
diff options
context:
space:
mode:
authorWu Cheng-Han2015-07-02 00:10:20 +0800
committerWu Cheng-Han2015-07-02 00:10:20 +0800
commit10c9811fc534a2738c19d8f74a447ed500b730a2 (patch)
tree8e46f99f36660d9c011d135fc6ce736733a5876b /lib/note.js
parentf7f8c901f4bc39c3ed0a2bdfe1cbaa1ee6957999 (diff)
Jump to 0.3.1
Diffstat (limited to '')
-rw-r--r--lib/note.js153
1 files changed, 147 insertions, 6 deletions
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