From 20ea40133bbaabb21a12070cf2f843144abddc93 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 14 Nov 2014 17:31:39 -0500 Subject: [PATCH] added four new hooks: filter:categories.recent, filter:privileges.categories.get, filter:privileges.posts.filter, filter:privileges.topics.filter --- src/categories/recentreplies.js | 10 +++++-- src/posts/summary.js | 4 +++ src/privileges/categories.js | 10 ++++--- src/privileges/posts.js | 12 +++++++-- src/privileges/topics.js | 9 ++++++- src/topics/unread.js | 46 +++++++++++++++++---------------- 6 files changed, 60 insertions(+), 31 deletions(-) diff --git a/src/categories/recentreplies.js b/src/categories/recentreplies.js index 80421bde7d..9539e5962d 100644 --- a/src/categories/recentreplies.js +++ b/src/categories/recentreplies.js @@ -8,7 +8,8 @@ var async = require('async'), db = require('../database'), posts = require('../posts'), topics = require('../topics'), - privileges = require('../privileges'); + privileges = require('../privileges'), + plugins = require('../plugins'); module.exports = function(Categories) { Categories.getRecentReplies = function(cid, uid, count, callback) { @@ -25,7 +26,12 @@ module.exports = function(Categories) { return callback(err, []); } - posts.getPostSummaryByPids(pids, uid, {stripTags: true}, callback); + plugins.fireHook('filter:categories.recent', { + uid: uid, + pids: pids + }, function(err, data) { + posts.getPostSummaryByPids(data.pids, uid, {stripTags: true}, callback); + }); }); }); }; diff --git a/src/posts/summary.js b/src/posts/summary.js index 3728818911..5f7e5867de 100644 --- a/src/posts/summary.js +++ b/src/posts/summary.js @@ -16,6 +16,10 @@ var async = require('async'), module.exports = function(Posts) { Posts.getPostSummaryByPids = function(pids, uid, options, callback) { + if (!pids || !Array.isArray(pids) || !pids.length) { + return callback(null, []); + } + options.stripTags = options.hasOwnProperty('stripTags') ? options.stripTags : false; options.parse = options.hasOwnProperty('parse') ? options.parse : true; options.extraFields = options.hasOwnProperty('extraFields') ? options.extraFields : []; diff --git a/src/privileges/categories.js b/src/privileges/categories.js index 94b09ad599..449ec40e6f 100644 --- a/src/privileges/categories.js +++ b/src/privileges/categories.js @@ -6,8 +6,8 @@ var async = require('async'), user = require('../user'), categories = require('../categories'), groups = require('../groups'), - helpers = require('./helpers'); - + helpers = require('./helpers'), + plugins = require('../plugins'); module.exports = function(privileges) { @@ -34,12 +34,14 @@ module.exports = function(privileges) { var isAdminOrMod = results.isAdministrator || results.isModerator; - callback(null, { + plugins.fireHook('filter:privileges.categories.get', { + cid: cid, + uid: uid, 'topics:create': results['topics:create'][0] || isAdminOrMod, editable: isAdminOrMod, view_deleted: isAdminOrMod, read: results.read[0] || isAdminOrMod - }); + }, callback); }); }; diff --git a/src/privileges/posts.js b/src/privileges/posts.js index ec61bf826c..5983af74e6 100644 --- a/src/privileges/posts.js +++ b/src/privileges/posts.js @@ -9,7 +9,8 @@ var async = require('async'), user = require('../user'), helpers = require('./helpers'), groups = require('../groups'), - categories = require('../categories'); + categories = require('../categories'), + plugins = require('../plugins'); module.exports = function(privileges) { @@ -94,7 +95,14 @@ module.exports = function(privileges) { }).map(function(post) { return post.pid; }); - callback(null, pids); + + plugins.fireHook('filter:privileges.posts.filter', { + privilege: privilege, + uid: uid, + pids: pids + }, function(err, data) { + callback(null, data.pids); + }); }); }); }; diff --git a/src/privileges/topics.js b/src/privileges/topics.js index 743d64f102..2e3708a694 100644 --- a/src/privileges/topics.js +++ b/src/privileges/topics.js @@ -91,7 +91,14 @@ module.exports = function(privileges) { }).map(function(topic) { return topic.tid; }); - callback(null, tids); + + plugins.fireHook('filter:privileges.topics.filter', { + privilege: privilege, + uid: uid, + tids: tids + }, function(err, data) { + callback(null, data.tids); + }); }); }); }; diff --git a/src/topics/unread.js b/src/topics/unread.js index 621ca5d65b..af1a58d779 100644 --- a/src/topics/unread.js +++ b/src/topics/unread.js @@ -115,37 +115,39 @@ module.exports = function(Topics) { return callback(null, tids); } - var keys = tids.map(function(tid) { - return 'topic:' + tid; - }); - - db.getObjectsFields(keys, ['tid', 'cid'], function(err, topics) { - if (err) { - return callback(err); - } - - var topicCids = topics.filter(function(topic) { - return topic && topic.cid; - }).map(function(topic) { - return topic.cid.toString(); + privileges.topics.filter('read', tids, uid, function(err, tids) { + var keys = tids.map(function(tid) { + return 'topic:' + tid; }); - topicCids = topicCids.filter(function(cid) { - return ignoredCids.indexOf(cid) === -1; - }); - - privileges.categories.filterCids('read', topicCids, uid, function(err, readableCids) { + db.getObjectsFields(keys, ['tid', 'cid'], function(err, topics) { if (err) { return callback(err); } - topics = topics.filter(function(topic) { - return topic.cid && readableCids.indexOf(topic.cid.toString()) !== -1; + var topicCids = topics.filter(function(topic) { + return topic && topic.cid; }).map(function(topic) { - return topic.tid; + return topic.cid.toString(); + }); + + topicCids = topicCids.filter(function(cid) { + return ignoredCids.indexOf(cid) === -1; }); - callback(null, topics); + privileges.categories.filterCids('read', topicCids, uid, function(err, readableCids) { + if (err) { + return callback(err); + } + + topics = topics.filter(function(topic) { + return topic.cid && readableCids.indexOf(topic.cid.toString()) !== -1; + }).map(function(topic) { + return topic.tid; + }); + + callback(null, topics); + }); }); }); }