refactored topic locking pinning and deleting (and its inverses) so that the privilege check is done not in the method, but in the socket call

v1.18.x
Julian Lam 11 years ago
parent 561ee9e4f1
commit b2fb9aa99f

@ -142,7 +142,7 @@ var RDB = require('./redis.js'),
// Delete the thread if it is the last undeleted post // Delete the thread if it is the last undeleted post
threadTools.getLatestUndeletedPid(postData.tid, function(err, pid) { threadTools.getLatestUndeletedPid(postData.tid, function(err, pid) {
if (err && err.message === 'no-undeleted-pids-found') { if (err && err.message === 'no-undeleted-pids-found') {
threadTools.delete(postData.tid, -1, function(err) { threadTools.delete(postData.tid, function(err) {
if (err) { if (err) {
winston.error('Could not delete topic (tid: ' + postData.tid + ')', err.stack); winston.error('Could not delete topic (tid: ' + postData.tid + ')', err.stack);
} }
@ -163,14 +163,14 @@ var RDB = require('./redis.js'),
posts.getPostField(pid, 'deleted', function(err, deleted) { posts.getPostField(pid, 'deleted', function(err, deleted) {
if(deleted === '1') { if(deleted === '1') {
return callback(new Error('Post already deleted!')); return callback(new Error('Post already deleted!'));
} }
PostTools.privileges(pid, uid, function(privileges) { PostTools.privileges(pid, uid, function(privileges) {
if (privileges.editable) { if (privileges.editable) {
success(); success();
} }
}); });
}); });
} }
@ -210,8 +210,8 @@ var RDB = require('./redis.js'),
posts.getPostField(pid, 'deleted', function(err, deleted) { posts.getPostField(pid, 'deleted', function(err, deleted) {
if(deleted === '0') { if(deleted === '0') {
return callback(new Error('Post already restored')); return callback(new Error('Post already restored'));
} }
PostTools.privileges(pid, uid, function(privileges) { PostTools.privileges(pid, uid, function(privileges) {
if (privileges.editable) { if (privileges.editable) {
success(); success();

@ -47,136 +47,111 @@ var RDB = require('./redis.js'),
}); });
} }
ThreadTools.lock = function(tid, uid, socket) { ThreadTools.lock = function(tid, socket) {
ThreadTools.privileges(tid, uid, function(privileges) { topics.setTopicField(tid, 'locked', 1);
if (privileges.editable) {
topics.setTopicField(tid, 'locked', 1);
if (socket) {
io.sockets. in ('topic_' + tid).emit('event:topic_locked', {
tid: tid,
status: 'ok'
});
socket.emit('api:topic.lock', { if (socket) {
status: 'ok', io.sockets.in('topic_' + tid).emit('event:topic_locked', {
tid: tid tid: tid,
}); status: 'ok'
} });
}
}); socket.emit('api:topic.lock', {
status: 'ok',
tid: tid
});
}
} }
ThreadTools.unlock = function(tid, uid, socket) { ThreadTools.unlock = function(tid, socket) {
ThreadTools.privileges(tid, uid, function(privileges) { topics.setTopicField(tid, 'locked', 0);
if (privileges.editable) {
topics.setTopicField(tid, 'locked', 0);
if (socket) { if (socket) {
io.sockets. in ('topic_' + tid).emit('event:topic_unlocked', { io.sockets.in('topic_' + tid).emit('event:topic_unlocked', {
tid: tid, tid: tid,
status: 'ok' status: 'ok'
}); });
socket.emit('api:topic.unlock', { socket.emit('api:topic.unlock', {
status: 'ok', status: 'ok',
tid: tid tid: tid
}); });
} }
}
});
} }
ThreadTools.delete = function(tid, uid, callback) { ThreadTools.delete = function(tid, callback) {
ThreadTools.privileges(tid, uid, function(privileges) { topics.delete(tid);
if (privileges.editable || uid === -1) {
topics.delete(tid);
RDB.decr('totaltopiccount'); RDB.decr('totaltopiccount');
ThreadTools.lock(tid, uid); ThreadTools.lock(tid);
topicSearch.remove(tid); topicSearch.remove(tid);
io.sockets. in ('topic_' + tid).emit('event:topic_deleted', {
tid: tid,
status: 'ok'
});
callback(null); io.sockets.in('topic_' + tid).emit('event:topic_deleted', {
} else callback(new Error('not-enough-privs')); tid: tid,
status: 'ok'
}); });
}
ThreadTools.restore = function(tid, uid, socket, callback) {
ThreadTools.privileges(tid, uid, function(privileges) {
if (privileges.editable) {
topics.restore(tid); if (callback) {
RDB.incr('totaltopiccount'); callback(null);
ThreadTools.unlock(tid, uid); }
}
io.sockets. in ('topic_' + tid).emit('event:topic_restored', {
tid: tid,
status: 'ok'
});
topics.getTopicField(tid, 'title', function(err, title) { ThreadTools.restore = function(tid, socket, callback) {
topicSearch.index(title, tid); topics.restore(tid);
}); RDB.incr('totaltopiccount');
ThreadTools.unlock(tid);
if(callback) io.sockets.in('topic_' + tid).emit('event:topic_restored', {
callback(null); tid: tid,
} status: 'ok'
}); });
}
ThreadTools.pin = function(tid, uid, socket) {
ThreadTools.privileges(tid, uid, function(privileges) {
if (privileges.editable) {
topics.setTopicField(tid, 'pinned', 1); topics.getTopicField(tid, 'title', function(err, title) {
topics.getTopicField(tid, 'cid', function(err, cid) { topicSearch.index(title, tid);
RDB.zadd('categories:' + cid + ':tid', Math.pow(2, 53), tid); });
});
if (socket) { if(callback) {
io.sockets. in ('topic_' + tid).emit('event:topic_pinned', { callback(null);
tid: tid, }
status: 'ok' }
});
socket.emit('api:topic.pin', { ThreadTools.pin = function(tid, socket) {
status: 'ok', topics.setTopicField(tid, 'pinned', 1);
tid: tid topics.getTopicField(tid, 'cid', function(err, cid) {
}); RDB.zadd('categories:' + cid + ':tid', Math.pow(2, 53), tid);
}
}
}); });
}
ThreadTools.unpin = function(tid, uid, socket) { if (socket) {
ThreadTools.privileges(tid, uid, function(privileges) { io.sockets.in('topic_' + tid).emit('event:topic_pinned', {
if (privileges.editable) { tid: tid,
status: 'ok'
});
topics.setTopicField(tid, 'pinned', 0); socket.emit('api:topic.pin', {
topics.getTopicFields(tid, ['cid', 'lastposttime'], function(err, topicData) { status: 'ok',
RDB.zadd('categories:' + topicData.cid + ':tid', topicData.lastposttime, tid); tid: tid
}); });
if (socket) { }
io.sockets. in ('topic_' + tid).emit('event:topic_unpinned', { }
tid: tid,
status: 'ok'
});
socket.emit('api:topic.unpin', { ThreadTools.unpin = function(tid, socket) {
status: 'ok', topics.setTopicField(tid, 'pinned', 0);
tid: tid topics.getTopicFields(tid, ['cid', 'lastposttime'], function(err, topicData) {
}); RDB.zadd('categories:' + topicData.cid + ':tid', topicData.lastposttime, tid);
}
}
}); });
if (socket) {
io.sockets.in('topic_' + tid).emit('event:topic_unpinned', {
tid: tid,
status: 'ok'
});
socket.emit('api:topic.unpin', {
status: 'ok',
tid: tid
});
}
} }
ThreadTools.move = function(tid, cid, socket) { ThreadTools.move = function(tid, cid, socket) {
@ -213,7 +188,7 @@ var RDB = require('./redis.js'),
status: 'ok' status: 'ok'
}); });
io.sockets. in ('topic_' + tid).emit('event:topic_moved', { io.sockets.in('topic_' + tid).emit('event:topic_moved', {
tid: tid tid: tid
}); });
} else { } else {

@ -491,42 +491,66 @@ module.exports.init = function(io) {
}); });
socket.on('api:topic.delete', function(data) { socket.on('api:topic.delete', function(data) {
threadTools.delete(data.tid, uid, function(err) { threadTools.privileges(data.tid, uid, function(privileges) {
if (!err) { if (privileges.editable) {
posts.getTopicPostStats(); threadTools.delete(data.tid, function(err) {
socket.emit('api:topic.delete', { if (!err) {
status: 'ok', posts.getTopicPostStats();
tid: data.tid socket.emit('api:topic.delete', {
status: 'ok',
tid: data.tid
});
}
}); });
} }
}); });
}); });
socket.on('api:topic.restore', function(data) { socket.on('api:topic.restore', function(data) {
threadTools.restore(data.tid, uid, socket, function(err) { threadTools.privileges(data.tid, uid, function(privileges) {
posts.getTopicPostStats(); if (privileges.editable) {
threadTools.restore(data.tid, socket, function(err) {
socket.emit('api:topic.restore', { posts.getTopicPostStats();
status: 'ok',
tid: data.tid socket.emit('api:topic.restore', {
}); status: 'ok',
tid: data.tid
});
});
}
}); });
}); });
socket.on('api:topic.lock', function(data) { socket.on('api:topic.lock', function(data) {
threadTools.lock(data.tid, uid, socket); threadTools.privileges(data.tid, uid, function(privileges) {
if (privileges.editable) {
threadTools.lock(data.tid, socket);
}
});
}); });
socket.on('api:topic.unlock', function(data) { socket.on('api:topic.unlock', function(data) {
threadTools.unlock(data.tid, uid, socket); threadTools.privileges(data.tid, uid, function(privileges) {
if (privileges.editable) {
threadTools.unlock(data.tid, socket);
}
});
}); });
socket.on('api:topic.pin', function(data) { socket.on('api:topic.pin', function(data) {
threadTools.pin(data.tid, uid, socket); threadTools.privileges(data.tid, uid, function(privileges) {
if (privileges.editable) {
threadTools.pin(data.tid, socket);
}
});
}); });
socket.on('api:topic.unpin', function(data) { socket.on('api:topic.unpin', function(data) {
threadTools.unpin(data.tid, uid, socket); threadTools.privileges(data.tid, uid, function(privileges) {
if (privileges.editable) {
threadTools.unpin(data.tid, socket);
}
});
}); });
socket.on('api:topic.move', function(data) { socket.on('api:topic.move', function(data) {

Loading…
Cancel
Save