From 7e46f8c6ce1bf2a0f2ac00af4c52abf34ed94c23 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 23 May 2013 13:48:42 -0400 Subject: [PATCH] uniqueId support in notifications --- src/notifications.js | 48 ++++++++++++++++++++++++++++++++++++++++---- src/webserver.js | 14 ++++++------- 2 files changed, 51 insertions(+), 11 deletions(-) diff --git a/src/notifications.js b/src/notifications.js index 2938b19694..3eb6ff4dd2 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -5,13 +5,14 @@ var config = require('../config.js'), (function(Notifications) { Notifications.get = function(nid, callback) { - RDB.hmget('notifications:' + nid, 'text', 'score', 'path', 'datetime', function(err, notification) { + RDB.hmget('notifications:' + nid, 'text', 'score', 'path', 'datetime', 'uniqueId', function(err, notification) { callback({ nid: nid, text: notification[0], score: notification[1], path: notification[2], - datetime: notification[3] + datetime: notification[3], + uniqueId: notification[4] }); }); } @@ -51,13 +52,52 @@ var config = require('../config.js'), Notifications.get(nid, function(notif_data) { for(x=0;x 0) { - RDB.zadd('uid:' + uids[x] + ':notifications:unread', notif_data.score, nid); - if (callback) callback(true); + (function(uid) { + Notifications.remove_by_uniqueId(notif_data.uniqueId, uid, function() { + RDB.zadd('uid:' + uid + ':notifications:unread', notif_data.score, nid); + if (callback) callback(true); + }); + })(uids[x]); } } }); } + Notifications.remove_by_uniqueId = function(uniqueId, uid, callback) { + async.parallel([ + function(next) { + RDB.zrange('uid:' + uid + ':notifications:unread', 0, -1, function(err, nids) { + if (nids && nids.length > 0) { + async.each(nids, function(nid, next) { + Notifications.get(nid, function(nid_info) { + if (nid_info.uniqueId === uniqueId) RDB.zrem('uid:' + uid + ':notifications:unread', nid); + next(); + }); + }, function(err) { + next(); + }); + } else next(); + }); + }, + function(next) { + RDB.zrange('uid:' + uid + ':notifications:read', 0, -1, function(err, nids) { + if (nids && nids.length > 0) { + async.each(nids, function(nid, next) { + Notifications.get(nid, function(nid_info) { + if (nid_info.uniqueId === uniqueId) RDB.zrem('uid:' + uid + ':notifications:read', nid); + next(); + }); + }, function(err) { + next(); + }); + } else next(); + }); + } + ], function(err) { + if (!err) callback(true); + }); + } + Notifications.mark_read = function(nid, uid, callback) { if (parseInt(uid) > 0) { Notifications.get(nid, function(notif_data) { diff --git a/src/webserver.js b/src/webserver.js index 3ffd47e01e..10405a7cd6 100644 --- a/src/webserver.js +++ b/src/webserver.js @@ -240,14 +240,14 @@ var express = require('express'), app.get('/api/:method/:id*', api_method); app.get('/test', function(req, res) { - notifications.mark_read_multiple([1, 2], 1, function(success) { - res.send('mark: ' + success); - }); - // notifications.create('some text', 5, '/category/2/general-discussion', function(nid) { - // notifications.push(nid, 1, function() { - // res.send('nid: ', nid) - // }); + // notifications.remove_by_uniqueId('foobar', 1, function(success) { + // res.send('remove: ' + success); // }); + notifications.create('a bunch more text', 5, '/category/2/general-discussion', 'foobar', function(nid) { + notifications.push(nid, 1, function() { + res.send('nid: ' + nid) + }); + }); });