diff --git a/src/notifications.js b/src/notifications.js index 4f6d73f385..7ca9c50277 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -268,6 +268,23 @@ var utils = require('../public/src/utils'); }); }; + Notifications.rescind = function(nid, callback) { + callback = callback || function() {}; + + async.parallel([ + async.apply(db.sortedSetRemove, 'notifications', nid), + async.apply(db.delete, 'notifications:' + nid) + ], function(err) { + if (err) { + winston.error('Encountered error rescinding notification (' + nid + '): ' + err.message); + } else { + winston.verbose('[notifications/rescind] Rescinded notification "' + nid + '"'); + } + + callback(err, nid); + }); + }; + Notifications.markRead = function(nid, uid, callback) { callback = callback || function() {}; if (!parseInt(uid, 10) || !nid) { diff --git a/src/socket.io/helpers.js b/src/socket.io/helpers.js index 68182293f4..dfcecf7f5c 100644 --- a/src/socket.io/helpers.js +++ b/src/socket.io/helpers.js @@ -77,7 +77,7 @@ function filterTidCidIgnorers(uids, tid, cid, callback) { ], callback); } -SocketHelpers.sendNotificationToPostOwner = function(pid, fromuid, notification) { +SocketHelpers.sendNotificationToPostOwner = function(pid, fromuid, command, notification) { if (!pid || !fromuid || !notification) { return; } @@ -107,7 +107,7 @@ SocketHelpers.sendNotificationToPostOwner = function(pid, fromuid, notification) bodyLong: results.postObj.content, pid: pid, path: '/post/' + pid, - nid: 'post:' + pid + ':uid:' + fromuid, + nid: command + ':post:' + pid + ':uid:' + fromuid, from: fromuid, mergeId: notification + '|' + pid, topicTitle: results.topicTitle @@ -124,7 +124,7 @@ SocketHelpers.sendNotificationToPostOwner = function(pid, fromuid, notification) }; -SocketHelpers.sendNotificationToTopicOwner = function(tid, fromuid, notification) { +SocketHelpers.sendNotificationToTopicOwner = function(tid, fromuid, command, notification) { if (!tid || !fromuid || !notification) { return; } @@ -150,7 +150,7 @@ SocketHelpers.sendNotificationToTopicOwner = function(tid, fromuid, notification notifications.create({ bodyShort: '[[' + notification + ', ' + results.username + ', ' + titleEscaped + ']]', path: '/topic/' + results.topicData.slug, - nid: 'tid:' + tid + ':uid:' + fromuid, + nid: command + ':tid:' + tid + ':uid:' + fromuid, from: fromuid }, next); } @@ -164,6 +164,11 @@ SocketHelpers.sendNotificationToTopicOwner = function(tid, fromuid, notification }); }; +SocketHelpers.rescindUpvoteNotification = function(pid, fromuid) { + var nid = 'upvote:post:' + pid + ':uid:' + fromuid; + notifications.rescind(nid); +}; + SocketHelpers.emitToTopicAndCategory = function(event, data) { websockets.in('topic_' + data.tid).emit(event, data); websockets.in('category_' + data.cid).emit(event, data); diff --git a/src/socket.io/posts/favourites.js b/src/socket.io/posts/favourites.js index 3d93afac08..01be736949 100644 --- a/src/socket.io/posts/favourites.js +++ b/src/socket.io/posts/favourites.js @@ -152,7 +152,9 @@ module.exports = function(SocketPosts) { } if (result && notification) { - socketHelpers.sendNotificationToPostOwner(data.pid, socket.uid, notification); + socketHelpers.sendNotificationToPostOwner(data.pid, socket.uid, command, notification); + } else if (result && command === 'unvote') { + socketHelpers.rescindUpvoteNotification(data.pid, socket.uid); } callback(); }); diff --git a/src/socket.io/posts/move.js b/src/socket.io/posts/move.js index 637ef7da1f..e73ad58a9a 100644 --- a/src/socket.io/posts/move.js +++ b/src/socket.io/posts/move.js @@ -28,7 +28,7 @@ module.exports = function(SocketPosts) { topics.movePostToTopic(data.pid, data.tid, next); }, function (next) { - socketHelpers.sendNotificationToPostOwner(data.pid, socket.uid, 'notifications:moved_your_post'); + socketHelpers.sendNotificationToPostOwner(data.pid, socket.uid, 'move', 'notifications:moved_your_post'); next(); } ], callback); diff --git a/src/socket.io/topics/move.js b/src/socket.io/topics/move.js index 80fc2e3772..a25947aab5 100644 --- a/src/socket.io/topics/move.js +++ b/src/socket.io/topics/move.js @@ -40,7 +40,7 @@ module.exports = function(SocketTopics) { socketHelpers.emitToTopicAndCategory('event:topic_moved', topicData); - socketHelpers.sendNotificationToTopicOwner(tid, socket.uid, 'notifications:moved_your_topic'); + socketHelpers.sendNotificationToTopicOwner(tid, socket.uid, 'move', 'notifications:moved_your_topic'); next(); });