exposing thread tools to users in the "administrators" set, fixing up

Topics methods to call the "editable" method first instead of just
checking rep thresholds.

Also changed the limit on thread length from 10 to infinity (for now,
until infinite scrolling makes it in)
This commit is contained in:
Julian Lam
2013-05-17 21:14:58 -04:00
parent dd515ef831
commit 1a38644eb8
3 changed files with 65 additions and 21 deletions

View File

@@ -15,7 +15,7 @@ marked.setOptions({
Posts.get = function(callback, tid, current_user, start, end) { Posts.get = function(callback, tid, current_user, start, end) {
if (start == null) start = 0; if (start == null) start = 0;
if (end == null) end = start + 10; if (end == null) end = -1;//start + 10;
var post_data, user_data, thread_data, vote_data, viewer_data; var post_data, user_data, thread_data, vote_data, viewer_data;
@@ -30,8 +30,11 @@ marked.setOptions({
var posts = [], var posts = [],
main_posts = [], main_posts = [],
manage_content = viewer_data.reputation >= config.privilege_thresholds.manage_content; manage_content = (
viewer_data.reputation >= config.privilege_thresholds.manage_content ||
viewer_data.isModerator ||
viewer_data.isAdministrator
);
for (var i=0, ii= post_data.pid.length; i<ii; i++) { for (var i=0, ii= post_data.pid.length; i<ii; i++) {
var uid = post_data.uid[i], var uid = post_data.uid[i],
@@ -70,7 +73,7 @@ marked.setOptions({
'deleted': parseInt(thread_data.deleted) || 0, 'deleted': parseInt(thread_data.deleted) || 0,
'pinned': parseInt(thread_data.pinned) || 0, 'pinned': parseInt(thread_data.pinned) || 0,
'topic_id': tid, 'topic_id': tid,
'expose_tools': (manage_content || viewer_data.isModerator) ? 1 : 0, 'expose_tools': manage_content ? 1 : 0,
'posts': posts, 'posts': posts,
'main_posts': main_posts 'main_posts': main_posts
}); });
@@ -174,8 +177,15 @@ marked.setOptions({
callback(null); callback(null);
}); });
}) })
},
function(callback) {
user.isAdministrator(current_user, function(isAdmin) {
viewer_data = viewer_data || {};
viewer_data.isAdministrator = isAdmin;
callback(null);
});
} }
], function(err, results) { ], function(err) {
generateThread(); generateThread();
}); });
} }
@@ -201,6 +211,10 @@ marked.setOptions({
}); });
}); });
}); });
}, function(next) {
user.isAdministrator(uid, function(err, isAdmin) {
next(null, isAdmin);
});
} }
], function(err, results) { ], function(err, results) {
// If any return true, allow the edit // If any return true, allow the edit

View File

@@ -2,7 +2,7 @@ var RDB = require('./redis.js'),
posts = require('./posts.js'), posts = require('./posts.js'),
utils = require('./utils.js'), utils = require('./utils.js'),
user = require('./user.js'), user = require('./user.js'),
configs = require('../config.js'), config = require('../config.js'),
categories = require('./categories.js'), categories = require('./categories.js'),
marked = require('marked'), marked = require('marked'),
async = require('async'); async = require('async');
@@ -169,6 +169,30 @@ marked.setOptions({
}); });
} }
Topics.editable = function(tid, uid, callback) {
async.parallel([
function(next) {
user.getUserField(uid, 'reputation', function(reputation) {
next(null, reputation >= config.privilege_thresholds.manage_thread);
});
},
function(next) {
Topics.get_cid_by_tid(tid, function(cid) {
user.isModerator(uid, cid, function(isMod) {
next(null, isMod);
});
});
}, function(next) {
user.isAdministrator(uid, function(isAdmin) {
next(null, isAdmin);
});
}
], function(err, results) {
// If any return true, allow the edit
if (results.indexOf(true) !== -1) callback(true);
});
}
Topics.get_topic = function(tid, uid, callback) { Topics.get_topic = function(tid, uid, callback) {
var topicData = {}; var topicData = {};
@@ -223,7 +247,7 @@ marked.setOptions({
} }
Topics.get_cid_by_tid = function(tid, callback) { Topics.get_cid_by_tid = function(tid, callback) {
RDB.get('tid:' + pid + ':cid', function(err, cid) { RDB.get('tid:' + tid + ':cid', function(err, cid) {
if (cid && parseInt(cid) > 0) callback(cid); if (cid && parseInt(cid) > 0) callback(cid);
else callback(false); else callback(false);
}); });
@@ -359,8 +383,8 @@ marked.setOptions({
}; };
Topics.lock = function(tid, uid, socket) { Topics.lock = function(tid, uid, socket) {
user.getUserField(uid, 'reputation', function(rep) { Topics.editable(tid, uid, function(editable) {
if (rep >= configs.privilege_thresholds.manage_thread) { if (editable) {
// Mark thread as locked // Mark thread as locked
RDB.set('tid:' + tid + ':locked', 1); RDB.set('tid:' + tid + ':locked', 1);
@@ -375,8 +399,8 @@ marked.setOptions({
} }
Topics.unlock = function(tid, uid, socket) { Topics.unlock = function(tid, uid, socket) {
user.getUserField(uid, 'reputation', function(rep) { Topics.editable(tid, uid, function(editable) {
if (rep >= configs.privilege_thresholds.manage_thread) { if (editable) {
// Mark thread as unlocked // Mark thread as unlocked
RDB.del('tid:' + tid + ':locked'); RDB.del('tid:' + tid + ':locked');
@@ -391,8 +415,8 @@ marked.setOptions({
} }
Topics.delete = function(tid, uid, socket) { Topics.delete = function(tid, uid, socket) {
user.getUserField(uid, 'reputation', function(rep) { Topics.editable(tid, uid, function(editable) {
if (rep >= configs.privilege_thresholds.manage_thread) { if (editable) {
// Mark thread as deleted // Mark thread as deleted
RDB.set('tid:' + tid + ':deleted', 1); RDB.set('tid:' + tid + ':deleted', 1);
Topics.lock(tid, uid); Topics.lock(tid, uid);
@@ -408,8 +432,8 @@ marked.setOptions({
} }
Topics.restore = function(tid, uid, socket) { Topics.restore = function(tid, uid, socket) {
user.getUserField(uid, 'reputation', function(rep) { Topics.editable(tid, uid, function(editable) {
if (rep >= configs.privilege_thresholds.manage_thread) { if (editable) {
// Mark thread as restored // Mark thread as restored
RDB.del('tid:' + tid + ':deleted'); RDB.del('tid:' + tid + ':deleted');
Topics.unlock(tid, uid); Topics.unlock(tid, uid);
@@ -425,8 +449,8 @@ marked.setOptions({
} }
Topics.pin = function(tid, uid, socket) { Topics.pin = function(tid, uid, socket) {
user.getUserField(uid, 'reputation', function(rep) { Topics.editable(tid, uid, function(editable) {
if (rep >= configs.privilege_thresholds.manage_thread) { if (editable) {
// Mark thread as pinned // Mark thread as pinned
RDB.set('tid:' + tid + ':pinned', 1); RDB.set('tid:' + tid + ':pinned', 1);
@@ -441,8 +465,8 @@ marked.setOptions({
} }
Topics.unpin = function(tid, uid, socket) { Topics.unpin = function(tid, uid, socket) {
user.getUserField(uid, 'reputation', function(rep) { Topics.editable(tid, uid, function(editable) {
if (rep >= configs.privilege_thresholds.manage_thread) { if (editable) {
// Mark thread as unpinned // Mark thread as unpinned
RDB.del('tid:' + tid + ':pinned'); RDB.del('tid:' + tid + ':pinned');

View File

@@ -264,7 +264,7 @@ var config = require('../config.js'),
User.exists(username, function(exists) { User.exists(username, function(exists) {
RDB.incr('global:next_user_id', function(err, uid) { RDB.incr('global:next_user_id', function(err, uid) {
RDB.handle(err); RDB.handfle(err);
var gravatar = User.createGravatarURLFromEmail(email); var gravatar = User.createGravatarURLFromEmail(email);
@@ -524,7 +524,13 @@ var config = require('../config.js'),
User.isModerator = function(uid, cid, callback) { User.isModerator = function(uid, cid, callback) {
RDB.sismember('cid:' + cid + ':moderators', uid, function(err, exists) { RDB.sismember('cid:' + cid + ':moderators', uid, function(err, exists) {
callback(exists); callback(!!exists);
});
}
User.isAdministrator = function(uid, callback) {
RDB.sismember('administrators', uid, function(err, exists) {
callback(!!exists);
}); });
} }