diff options
Diffstat (limited to '')
-rw-r--r-- | lib/realtime.js | 168 |
1 files changed, 124 insertions, 44 deletions
diff --git a/lib/realtime.js b/lib/realtime.js index a9c541cf..484ef12e 100644 --- a/lib/realtime.js +++ b/lib/realtime.js @@ -9,7 +9,6 @@ var shortId = require('shortid'); var randomcolor = require("randomcolor"); var Chance = require('chance'), chance = new Chance(); -var md5 = require("blueimp-md5").md5; var moment = require('moment'); //core @@ -68,7 +67,9 @@ function secure(socket, next) { function emitCheck(note) { var out = { - updatetime: note.updatetime + updatetime: note.updatetime, + lastchangeuser: note.lastchangeuser, + lastchangeuserprofile: note.lastchangeuserprofile }; realtime.io.to(note.id).emit('check', out); /* @@ -89,18 +90,52 @@ var updater = setInterval(function () { if (note.server.isDirty) { if (config.debug) logger.info("updater found dirty note: " + key); - var body = note.server.document; - var title = Note.getNoteTitle(body); - title = LZString.compressToBase64(title); - body = LZString.compressToBase64(body); - db.saveToDB(key, title, body, function (err, result) { - if (err) return; - note.server.isDirty = false; - note.updatetime = Date.now(); - emitCheck(note); + Note.findNote(note.id, function (err, _note) { + if (err || !_note) return callback(err, null); + //mongo update + if (note.lastchangeuser && _note.lastchangeuser != note.lastchangeuser) { + var lastchangeuser = note.lastchangeuser; + var lastchangeuserprofile = null; + User.findUser(lastchangeuser, function (err, user) { + if (err) return callback(err, null); + if (user && user.profile) { + var profile = JSON.parse(user.profile); + if (profile) { + lastchangeuserprofile = { + name: profile.displayName || profile.username, + photo: User.parsePhotoByProfile(profile) + } + note.lastchangeuser = lastchangeuser; + note.lastchangeuserprofile = lastchangeuserprofile; + Note.updateLastChangeUser(_note, lastchangeuser, function (err, result) { + if (err) return callback(err, null); + }); + } + } + }); + } else { + note.lastchangeuser = null; + note.lastchangeuserprofile = null; + Note.updateLastChangeUser(_note, null, function (err, result) { + if (err) return callback(err, null); + }); + } + //postgres update + var body = note.server.document; + var title = Note.getNoteTitle(body); + title = LZString.compressToBase64(title); + body = LZString.compressToBase64(body); + db.saveToDB(key, title, body, function (err, result) { + if (err) return callback(err, null); + note.server.isDirty = false; + note.updatetime = Date.now(); + emitCheck(note); + callback(null, null); + }); }); + } else { + callback(null, null); } - callback(); }, function (err) { if (err) return logger.error('updater error', err); }); @@ -121,7 +156,7 @@ var cleaner = setInterval(function () { disconnectSocketQueue.push(socket); disconnect(socket); } - callback(); + callback(null, null); }, function (err) { if (err) return logger.error('cleaner error', err); }); @@ -250,7 +285,11 @@ function emitRefresh(socket) { socket.emit('refresh', { docmaxlength: config.documentmaxlength, owner: note.owner, + ownerprofile: note.ownerprofile, + lastchangeuser: note.lastchangeuser, + lastchangeuserprofile: note.lastchangeuserprofile, permission: note.permission, + createtime: note.createtime, updatetime: note.updatetime }); } @@ -321,11 +360,15 @@ function startConnection(socket) { isConnectionBusy = false; return logger.error(err); } + var owner = data.rows[0].owner; + var ownerprofile = null; var permission = "freely"; if (owner && owner != "null") { permission = "editable"; } + + //find or new note Note.findOrNewNote(notename, permission, function (err, note) { if (err) { responseError(res, "404", "Not Found", "oops."); @@ -333,20 +376,64 @@ function startConnection(socket) { isConnectionBusy = false; return; } + var body = LZString.decompressFromBase64(data.rows[0].content); //body = LZString.compressToUTF16(body); + var createtime = data.rows[0].create_time; var updatetime = data.rows[0].update_time; var server = new ot.EditorSocketIOServer(body, [], notename, ifMayEdit); + + var lastchangeuser = note.lastchangeuser || null; + var lastchangeuserprofile = null; + notes[notename] = { id: notename, owner: owner, + ownerprofile: ownerprofile, permission: note.permission, + lastchangeuser: lastchangeuser, + lastchangeuserprofile: lastchangeuserprofile, socks: [], users: {}, + createtime: moment(createtime).valueOf(), updatetime: moment(updatetime).valueOf(), server: server }; - finishConnection(socket, notes[notename], users[socket.id]); + + if (lastchangeuser) { + //find last change user profile if lastchangeuser exists + User.findUser(lastchangeuser, function (err, user) { + if (!err && user && user.profile) { + var profile = JSON.parse(user.profile); + if (profile) { + lastchangeuserprofile = { + name: profile.displayName || profile.username, + photo: User.parsePhotoByProfile(profile) + } + notes[notename].lastchangeuserprofile = lastchangeuserprofile; + } + } + }); + } + + if (owner && owner != "null") { + //find owner profile if owner exists + User.findUser(owner, function (err, user) { + if (!err && user && user.profile) { + var profile = JSON.parse(user.profile); + if (profile) { + ownerprofile = { + name: profile.displayName || profile.username, + photo: User.parsePhotoByProfile(profile) + } + notes[notename].ownerprofile = ownerprofile; + } + } + finishConnection(socket, notes[notename], users[socket.id]); + }); + } else { + finishConnection(socket, notes[notename], users[socket.id]); + } }); }); } else { @@ -433,23 +520,7 @@ function updateUserData(socket, user) { //retrieve user data from passport if (socket.request.user && socket.request.user.logged_in) { var profile = JSON.parse(socket.request.user.profile); - var photo = null; - switch (profile.provider) { - case "facebook": - photo = 'https://graph.facebook.com/' + profile.id + '/picture'; - break; - case "twitter": - photo = profile.photos[0].value; - break; - case "github": - photo = 'https://avatars.githubusercontent.com/u/' + profile.id + '?s=48'; - break; - case "dropbox": - //no image api provided, use gravatar - photo = 'https://www.gravatar.com/avatar/' + md5(profile.emails[0].value); - break; - } - user.photo = photo; + user.photo = User.parsePhotoByProfile(profile); user.name = profile.displayName || profile.username; user.userid = socket.request.user._id; user.login = true; @@ -466,19 +537,28 @@ function ifMayEdit(socket, callback) { var note = notes[notename]; var mayEdit = true; switch (note.permission) { - case "freely": - //not blocking anyone - break; - case "editable": - //only login user can change - if (!socket.request.user || !socket.request.user.logged_in) - mayEdit = false; - break; - case "locked": - //only owner can change - if (note.owner != socket.request.user._id) - mayEdit = false; - break; + case "freely": + //not blocking anyone + break; + case "editable": + //only login user can change + if (!socket.request.user || !socket.request.user.logged_in) + mayEdit = false; + break; + case "locked": + //only owner can change + if (note.owner != socket.request.user._id) + mayEdit = false; + break; + } + //if user may edit and this note have owner (not anonymous usage) + if (mayEdit && note.owner && note.owner != "null") { + //save for the last change user id + if (socket.request.user && socket.request.user.logged_in) { + note.lastchangeuser = socket.request.user._id; + } else { + note.lastchangeuser = null; + } } callback(mayEdit); } |