|
|
|
@ -15,19 +15,20 @@ var batch = require('./batch');
|
|
|
|
|
var plugins = require('./plugins');
|
|
|
|
|
var utils = require('./utils');
|
|
|
|
|
|
|
|
|
|
(function (Notifications) {
|
|
|
|
|
Notifications.init = function () {
|
|
|
|
|
var Notifications = module.exports;
|
|
|
|
|
|
|
|
|
|
Notifications.startJobs = function () {
|
|
|
|
|
winston.verbose('[notifications.init] Registering jobs.');
|
|
|
|
|
new cron('*/30 * * * *', Notifications.prune, null, true);
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Notifications.get = function (nid, callback) {
|
|
|
|
|
Notifications.get = function (nid, callback) {
|
|
|
|
|
Notifications.getMultiple([nid], function (err, notifications) {
|
|
|
|
|
callback(err, Array.isArray(notifications) && notifications.length ? notifications[0] : null);
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Notifications.getMultiple = function (nids, callback) {
|
|
|
|
|
Notifications.getMultiple = function (nids, callback) {
|
|
|
|
|
if (!nids.length) {
|
|
|
|
|
return setImmediate(callback, null, []);
|
|
|
|
|
}
|
|
|
|
@ -73,9 +74,9 @@ var utils = require('./utils');
|
|
|
|
|
next(null, notifications);
|
|
|
|
|
},
|
|
|
|
|
], callback);
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Notifications.filterExists = function (nids, callback) {
|
|
|
|
|
Notifications.filterExists = function (nids, callback) {
|
|
|
|
|
async.waterfall([
|
|
|
|
|
function (next) {
|
|
|
|
|
db.isSortedSetMembers('notifications', nids, next);
|
|
|
|
@ -88,9 +89,9 @@ var utils = require('./utils');
|
|
|
|
|
next(null, nids);
|
|
|
|
|
},
|
|
|
|
|
], callback);
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Notifications.findRelated = function (mergeIds, set, callback) {
|
|
|
|
|
Notifications.findRelated = function (mergeIds, set, callback) {
|
|
|
|
|
// A related notification is one in a zset that has the same mergeId
|
|
|
|
|
var _nids;
|
|
|
|
|
|
|
|
|
@ -118,9 +119,9 @@ var utils = require('./utils');
|
|
|
|
|
return mergeIds.indexOf(sets[idx]) !== -1;
|
|
|
|
|
}));
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Notifications.create = function (data, callback) {
|
|
|
|
|
Notifications.create = function (data, callback) {
|
|
|
|
|
if (!data.nid) {
|
|
|
|
|
return callback(new Error('no-notification-id'));
|
|
|
|
|
}
|
|
|
|
@ -149,9 +150,9 @@ var utils = require('./utils');
|
|
|
|
|
callback(err, data);
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Notifications.push = function (notification, uids, callback) {
|
|
|
|
|
Notifications.push = function (notification, uids, callback) {
|
|
|
|
|
callback = callback || function () {};
|
|
|
|
|
|
|
|
|
|
if (!notification || !notification.nid) {
|
|
|
|
@ -181,9 +182,9 @@ var utils = require('./utils');
|
|
|
|
|
}, 1000);
|
|
|
|
|
|
|
|
|
|
callback();
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
function pushToUids(uids, notification, callback) {
|
|
|
|
|
function pushToUids(uids, notification, callback) {
|
|
|
|
|
var oneWeekAgo = Date.now() - 604800000;
|
|
|
|
|
var unreadKeys = [];
|
|
|
|
|
var readKeys = [];
|
|
|
|
@ -224,9 +225,9 @@ var utils = require('./utils');
|
|
|
|
|
next();
|
|
|
|
|
},
|
|
|
|
|
], callback);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Notifications.pushGroup = function (notification, groupName, callback) {
|
|
|
|
|
Notifications.pushGroup = function (notification, groupName, callback) {
|
|
|
|
|
callback = callback || function () {};
|
|
|
|
|
groups.getMembers(groupName, 0, -1, function (err, members) {
|
|
|
|
|
if (err || !Array.isArray(members) || !members.length) {
|
|
|
|
@ -235,9 +236,9 @@ var utils = require('./utils');
|
|
|
|
|
|
|
|
|
|
Notifications.push(notification, members, callback);
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Notifications.pushGroups = function (notification, groupNames, callback) {
|
|
|
|
|
Notifications.pushGroups = function (notification, groupNames, callback) {
|
|
|
|
|
callback = callback || function () {};
|
|
|
|
|
groups.getMembersOfGroups(groupNames, function (err, groupMembers) {
|
|
|
|
|
if (err) {
|
|
|
|
@ -248,9 +249,9 @@ var utils = require('./utils');
|
|
|
|
|
|
|
|
|
|
Notifications.push(notification, members, callback);
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Notifications.rescind = function (nid, callback) {
|
|
|
|
|
Notifications.rescind = function (nid, callback) {
|
|
|
|
|
callback = callback || function () {};
|
|
|
|
|
|
|
|
|
|
async.parallel([
|
|
|
|
@ -265,17 +266,17 @@ var utils = require('./utils');
|
|
|
|
|
|
|
|
|
|
callback(err, nid);
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Notifications.markRead = function (nid, uid, callback) {
|
|
|
|
|
Notifications.markRead = function (nid, uid, callback) {
|
|
|
|
|
callback = callback || function () {};
|
|
|
|
|
if (!parseInt(uid, 10) || !nid) {
|
|
|
|
|
return callback();
|
|
|
|
|
}
|
|
|
|
|
Notifications.markReadMultiple([nid], uid, callback);
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Notifications.markUnread = function (nid, uid, callback) {
|
|
|
|
|
Notifications.markUnread = function (nid, uid, callback) {
|
|
|
|
|
callback = callback || function () {};
|
|
|
|
|
if (!parseInt(uid, 10) || !nid) {
|
|
|
|
|
return callback();
|
|
|
|
@ -292,9 +293,9 @@ var utils = require('./utils');
|
|
|
|
|
async.apply(db.sortedSetAdd, 'uid:' + uid + ':notifications:unread', notification.datetime, nid),
|
|
|
|
|
], callback);
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Notifications.markReadMultiple = function (nids, uid, callback) {
|
|
|
|
|
Notifications.markReadMultiple = function (nids, uid, callback) {
|
|
|
|
|
callback = callback || function () {};
|
|
|
|
|
nids = nids.filter(Boolean);
|
|
|
|
|
if (!Array.isArray(nids) || !nids.length) {
|
|
|
|
@ -357,9 +358,9 @@ var utils = require('./utils');
|
|
|
|
|
callback(err);
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Notifications.markAllRead = function (uid, callback) {
|
|
|
|
|
Notifications.markAllRead = function (uid, callback) {
|
|
|
|
|
db.getSortedSetRevRange('uid:' + uid + ':notifications:unread', 0, 99, function (err, nids) {
|
|
|
|
|
if (err) {
|
|
|
|
|
return callback(err);
|
|
|
|
@ -371,9 +372,9 @@ var utils = require('./utils');
|
|
|
|
|
|
|
|
|
|
Notifications.markReadMultiple(nids, uid, callback);
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Notifications.prune = function () {
|
|
|
|
|
Notifications.prune = function () {
|
|
|
|
|
var week = 604800000;
|
|
|
|
|
|
|
|
|
|
var cutoffTime = Date.now() - week;
|
|
|
|
@ -404,9 +405,9 @@ var utils = require('./utils');
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Notifications.merge = function (notifications, callback) {
|
|
|
|
|
Notifications.merge = function (notifications, callback) {
|
|
|
|
|
// When passed a set of notification objects, merge any that can be merged
|
|
|
|
|
var mergeIds = [
|
|
|
|
|
'notifications:upvoted_your_post_in',
|
|
|
|
@ -509,6 +510,4 @@ var utils = require('./utils');
|
|
|
|
|
}, function (err, data) {
|
|
|
|
|
callback(err, data.notifications);
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
}(exports));
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|