Merge pull request #4 from NodeBB/master

123
v1.18.x
Сергей Савельев 10 years ago
commit 63db2a539e

@ -5,7 +5,8 @@
"recent": "Recent Topics", "recent": "Recent Topics",
"users": "Registered Users", "users": "Registered Users",
"notifications": "Notifications", "notifications": "Notifications",
"tags": "Topics tagged under \"%1\"", "tags": "Tags",
"tag": "Topics tagged under \"%1\"",
"user.edit": "Editing \"%1\"", "user.edit": "Editing \"%1\"",
"user.following": "People %1 Follows", "user.following": "People %1 Follows",
"user.followers": "People who Follow %1", "user.followers": "People who Follow %1",

@ -19,6 +19,7 @@ define('forum/account/favourites', ['forum/account/header', 'forum/infinitescrol
} }
infinitescroll.loadMore('posts.loadMoreFavourites', { infinitescroll.loadMore('posts.loadMoreFavourites', {
uid: ajaxify.variables.get('theirid'),
after: $('.user-favourite-posts').attr('data-nextstart') after: $('.user-favourite-posts').attr('data-nextstart')
}, function(data, done) { }, function(data, done) {
if (data.posts && data.posts.length) { if (data.posts && data.posts.length) {

@ -28,7 +28,7 @@ var async = require('async'),
var batch = options.batch || DEFAULT_BATCH_SIZE; var batch = options.batch || DEFAULT_BATCH_SIZE;
var start = 0; var start = 0;
var end = batch; var stop = batch;
var done = false; var done = false;
async.whilst( async.whilst(
@ -36,11 +36,11 @@ var async = require('async'),
return !done; return !done;
}, },
function(next) { function(next) {
db.getSortedSetRange(setKey, start, end, function(err, ids) { db.getSortedSetRange(setKey, start, stop, function(err, ids) {
if (err) { if (err) {
return next(err); return next(err);
} }
if (!ids.length || options.doneIf(start, end, ids)) { if (!ids.length || options.doneIf(start, stop, ids)) {
done = true; done = true;
return next(); return next();
} }
@ -49,7 +49,7 @@ var async = require('async'),
return next(err); return next(err);
} }
start += utils.isNumber(options.alwaysStartAt) ? options.alwaysStartAt : batch + 1; start += utils.isNumber(options.alwaysStartAt) ? options.alwaysStartAt : batch + 1;
end = start + batch; stop = start + batch;
next(); next();
}); });
}); });

@ -38,14 +38,7 @@ var async = require('async'),
async.parallel({ async.parallel({
topics: function(next) { topics: function(next) {
Categories.getCategoryTopics({ Categories.getCategoryTopics(data, next);
cid: data.cid,
set: data.set,
reverse: data.reverse,
start: data.start,
stop: data.end,
uid: data.uid
}, next);
}, },
pageCount: function(next) { pageCount: function(next) {
Categories.getPageCount(data.cid, data.uid, next); Categories.getPageCount(data.cid, data.uid, next);

@ -120,8 +120,7 @@ accountsController.getUserByUID = function(req, res, next) {
}; };
accountsController.getAccount = function(req, res, next) { accountsController.getAccount = function(req, res, next) {
var lowercaseSlug = req.params.userslug.toLowerCase(), var lowercaseSlug = req.params.userslug.toLowerCase();
callerUID = req.user ? parseInt(req.user.uid, 10) : 0;
if (req.params.userslug !== lowercaseSlug) { if (req.params.userslug !== lowercaseSlug) {
if (res.locals.isAPI) { if (res.locals.isAPI) {
@ -131,7 +130,7 @@ accountsController.getAccount = function(req, res, next) {
} }
} }
getUserDataByUserSlug(req.params.userslug, callerUID, function (err, userData) { getUserDataByUserSlug(req.params.userslug, req.uid, function (err, userData) {
if (err) { if (err) {
return next(err); return next(err);
} }
@ -140,19 +139,19 @@ accountsController.getAccount = function(req, res, next) {
return helpers.notFound(req, res); return helpers.notFound(req, res);
} }
if (callerUID !== parseInt(userData.uid, 10)) { if (req.uid !== parseInt(userData.uid, 10)) {
user.incrementUserFieldBy(userData.uid, 'profileviews', 1); user.incrementUserFieldBy(userData.uid, 'profileviews', 1);
} }
async.parallel({ async.parallel({
isFollowing: function(next) { isFollowing: function(next) {
user.isFollowing(callerUID, userData.theirid, next); user.isFollowing(req.uid, userData.theirid, next);
}, },
posts: function(next) { posts: function(next) {
posts.getPostsFromSet('uid:' + userData.theirid + ':posts', callerUID, 0, 9, next); posts.getPostsFromSet('uid:' + userData.theirid + ':posts', req.uid, 0, 9, next);
}, },
signature: function(next) { signature: function(next) {
postTools.parseSignature(userData, callerUID, next); postTools.parseSignature(userData, req.uid, next);
} }
}, function(err, results) { }, function(err, results) {
if(err) { if(err) {
@ -170,7 +169,7 @@ accountsController.getAccount = function(req, res, next) {
userData.profileviews = 1; userData.profileviews = 1;
} }
plugins.fireHook('filter:user.account', {userData: userData, uid: callerUID}, function(err, data) { plugins.fireHook('filter:user.account', {userData: userData, uid: req.uid}, function(err, data) {
if (err) { if (err) {
return next(err); return next(err);
} }
@ -189,12 +188,11 @@ accountsController.getFollowers = function(req, res, next) {
}; };
function getFollow(tpl, name, req, res, next) { function getFollow(tpl, name, req, res, next) {
var callerUID = req.user ? parseInt(req.user.uid, 10) : 0;
var userData; var userData;
async.waterfall([ async.waterfall([
function(next) { function(next) {
getUserDataByUserSlug(req.params.userslug, callerUID, next); getUserDataByUserSlug(req.params.userslug, req.uid, next);
}, },
function(data, next) { function(data, next) {
userData = data; userData = data;
@ -205,7 +203,7 @@ function getFollow(tpl, name, req, res, next) {
user[method](userData.uid, 0, 49, next); user[method](userData.uid, 0, 49, next);
} }
], function(err, users) { ], function(err, users) {
if(err) { if (err) {
return next(err); return next(err);
} }
@ -233,9 +231,7 @@ accountsController.getTopics = function(req, res, next) {
}; };
accountsController.getGroups = function(req, res, next) { accountsController.getGroups = function(req, res, next) {
var callerUID = req.user ? parseInt(req.user.uid, 10) : 0; accountsController.getBaseUser(req.params.userslug, req.uid, function(err, userData) {
accountsController.getBaseUser(req.params.userslug, callerUID, function(err, userData) {
if (err) { if (err) {
return next(err); return next(err);
} }
@ -257,9 +253,7 @@ accountsController.getGroups = function(req, res, next) {
}; };
function getFromUserSet(tpl, set, method, type, req, res, next) { function getFromUserSet(tpl, set, method, type, req, res, next) {
var callerUID = req.user ? parseInt(req.user.uid, 10) : 0; accountsController.getBaseUser(req.params.userslug, req.uid, function(err, userData) {
accountsController.getBaseUser(req.params.userslug, callerUID, function(err, userData) {
if (err) { if (err) {
return next(err); return next(err);
} }
@ -268,7 +262,7 @@ function getFromUserSet(tpl, set, method, type, req, res, next) {
return helpers.notFound(req, res); return helpers.notFound(req, res);
} }
method('uid:' + userData.uid + ':' + set, callerUID, 0, 19, function(err, data) { method('uid:' + userData.uid + ':' + set, req.uid, 0, 19, function(err, data) {
if (err) { if (err) {
return next(err); return next(err);
} }
@ -317,11 +311,10 @@ accountsController.getBaseUser = function(userslug, callerUID, callback) {
}; };
accountsController.accountEdit = function(req, res, next) { accountsController.accountEdit = function(req, res, next) {
var callerUID = req.user ? parseInt(req.user.uid, 10) : 0;
var userData; var userData;
async.waterfall([ async.waterfall([
function(next) { function(next) {
getUserDataByUserSlug(req.params.userslug, callerUID, next); getUserDataByUserSlug(req.params.userslug, req.uid, next);
}, },
function(data, next) { function(data, next) {
userData = data; userData = data;
@ -339,9 +332,7 @@ accountsController.accountEdit = function(req, res, next) {
}; };
accountsController.accountSettings = function(req, res, next) { accountsController.accountSettings = function(req, res, next) {
var callerUID = req.user ? parseInt(req.user.uid, 10) : 0; accountsController.getBaseUser(req.params.userslug, req.uid, function(err, userData) {
accountsController.getBaseUser(req.params.userslug, callerUID, function(err, userData) {
if (err) { if (err) {
return next(err); return next(err);
} }
@ -380,7 +371,7 @@ accountsController.uploadPicture = function (req, res, next) {
var userPhoto = req.files.files[0]; var userPhoto = req.files.files[0];
var uploadSize = parseInt(meta.config.maximumProfileImageSize, 10) || 256; var uploadSize = parseInt(meta.config.maximumProfileImageSize, 10) || 256;
var extension = path.extname(userPhoto.name); var extension = path.extname(userPhoto.name);
var updateUid = req.user ? req.user.uid : 0; var updateUid = req.uid;
var imageDimension = parseInt(meta.config.profileImageDimension, 10) || 128; var imageDimension = parseInt(meta.config.profileImageDimension, 10) || 128;
var convertToPNG = parseInt(meta.config['profile:convertProfileImageToPNG'], 10) === 1; var convertToPNG = parseInt(meta.config['profile:convertProfileImageToPNG'], 10) === 1;
@ -412,7 +403,7 @@ accountsController.uploadPicture = function (req, res, next) {
return next(); return next();
} }
user.isAdministrator(req.user.uid, function(err, isAdmin) { user.isAdministrator(req.uid, function(err, isAdmin) {
if (err) { if (err) {
return next(err); return next(err);
} }
@ -471,7 +462,7 @@ accountsController.uploadPicture = function (req, res, next) {
}; };
accountsController.getNotifications = function(req, res, next) { accountsController.getNotifications = function(req, res, next) {
user.notifications.getAll(req.user.uid, 40, function(err, notifications) { user.notifications.getAll(req.uid, 40, function(err, notifications) {
if (err) { if (err) {
return next(err); return next(err);
} }

@ -144,11 +144,10 @@ adminController.categories.get = function(req, res, next) {
}; };
adminController.categories.getAll = function(req, res, next) { adminController.categories.getAll = function(req, res, next) {
var uid = req.user ? parseInt(req.user.uid, 10) : 0, var active = [],
active = [],
disabled = []; disabled = [];
categories.getAllCategories(uid, function (err, categoryData) { categories.getAllCategories(req.uid, function (err, categoryData) {
if (err) { if (err) {
return next(err); return next(err);
} }
@ -179,19 +178,19 @@ adminController.flags.get = function(req, res, next) {
if (err) { if (err) {
return next(err); return next(err);
} }
res.render('admin/manage/flags', {posts: posts, next: end + 1, byUsername: byUsername}); res.render('admin/manage/flags', {posts: posts, next: stop + 1, byUsername: byUsername});
} }
var uid = req.user ? parseInt(req.user.uid, 10) : 0;
var sortBy = req.query.sortBy || 'count'; var sortBy = req.query.sortBy || 'count';
var byUsername = req.query.byUsername || ''; var byUsername = req.query.byUsername || '';
var start = 0; var start = 0;
var end = 19; var stop = 19;
if (byUsername) { if (byUsername) {
posts.getUserFlags(byUsername, sortBy, uid, start, end, done); posts.getUserFlags(byUsername, sortBy, req.uid, start, stop, done);
} else { } else {
var set = sortBy === 'count' ? 'posts:flags:count' : 'posts:flagged'; var set = sortBy === 'count' ? 'posts:flags:count' : 'posts:flagged';
posts.getFlags(set, uid, start, end, done); posts.getFlags(set, req.uid, start, stop, done);
} }
}; };

@ -31,8 +31,7 @@ usersController.banned = function(req, res, next) {
}; };
function getUsers(set, req, res, next) { function getUsers(set, req, res, next) {
var uid = req.user ? parseInt(req.user.uid, 10) : 0; user.getUsersFromSet(set, req.uid, 0, 49, function(err, users) {
user.getUsersFromSet(set, uid, 0, 49, function(err, users) {
if (err) { if (err) {
return next(err); return next(err);
} }
@ -45,7 +44,7 @@ function getUsers(set, req, res, next) {
search_display: 'hidden', search_display: 'hidden',
loadmore_display: 'block', loadmore_display: 'block',
users: users, users: users,
yourid: req.user.uid, yourid: req.uid,
requireEmailConfirmation: parseInt(meta.config.requireEmailConfirmation, 10) === 1 requireEmailConfirmation: parseInt(meta.config.requireEmailConfirmation, 10) === 1
}); });
}); });

@ -98,7 +98,6 @@ apiController.getConfig = function(req, res, next) {
apiController.renderWidgets = function(req, res, next) { apiController.renderWidgets = function(req, res, next) {
var async = require('async'), var async = require('async'),
uid = req.user ? req.user.uid : 0,
areas = { areas = {
template: req.query.template, template: req.query.template,
locations: req.query.locations, locations: req.query.locations,
@ -110,7 +109,7 @@ apiController.renderWidgets = function(req, res, next) {
return res.status(200).json({}); return res.status(200).json({});
} }
widgets.render(uid, { widgets.render(req.uid, {
template: areas.template, template: areas.template,
url: areas.url, url: areas.url,
locations: areas.locations locations: areas.locations

@ -17,9 +17,8 @@ var categoriesController = {},
utils = require('../../public/src/utils'); utils = require('../../public/src/utils');
categoriesController.recent = function(req, res, next) { categoriesController.recent = function(req, res, next) {
var uid = req.user ? req.user.uid : 0; var stop = (parseInt(meta.config.topicsPerList, 10) || 20) - 1;
var end = (parseInt(meta.config.topicsPerList, 10) || 20) - 1; topics.getTopicsFromSet('topics:recent', req.uid, 0, stop, function(err, data) {
topics.getTopicsFromSet('topics:recent', uid, 0, end, function(err, data) {
if (err) { if (err) {
return next(err); return next(err);
} }
@ -34,7 +33,6 @@ categoriesController.recent = function(req, res, next) {
var anonCache = {}, lastUpdateTime = 0; var anonCache = {}, lastUpdateTime = 0;
categoriesController.popular = function(req, res, next) { categoriesController.popular = function(req, res, next) {
var uid = req.user ? req.user.uid : 0;
var terms = { var terms = {
daily: 'day', daily: 'day',
weekly: 'week', weekly: 'week',
@ -43,13 +41,13 @@ categoriesController.popular = function(req, res, next) {
}; };
var term = terms[req.params.term] || 'day'; var term = terms[req.params.term] || 'day';
if (uid === 0) { if (!req.uid) {
if (anonCache[term] && (Date.now() - lastUpdateTime) < 60 * 60 * 1000) { if (anonCache[term] && (Date.now() - lastUpdateTime) < 60 * 60 * 1000) {
return res.render('popular', anonCache[term]); return res.render('popular', anonCache[term]);
} }
} }
topics.getPopular(term, uid, meta.config.topicsPerList, function(err, topics) { topics.getPopular(term, req.uid, meta.config.topicsPerList, function(err, topics) {
if (err) { if (err) {
return next(err); return next(err);
} }
@ -61,7 +59,7 @@ categoriesController.popular = function(req, res, next) {
breadcrumbs: helpers.buildBreadcrumbs([{text: '[[global:header.popular]]'}]) breadcrumbs: helpers.buildBreadcrumbs([{text: '[[global:header.popular]]'}])
}; };
if (uid === 0) { if (!req.uid) {
anonCache[term] = data; anonCache[term] = data;
lastUpdateTime = Date.now(); lastUpdateTime = Date.now();
} }
@ -71,9 +69,8 @@ categoriesController.popular = function(req, res, next) {
}; };
categoriesController.unread = function(req, res, next) { categoriesController.unread = function(req, res, next) {
var uid = req.user ? req.user.uid : 0; var stop = (parseInt(meta.config.topicsPerList, 10) || 20) - 1;
var end = (parseInt(meta.config.topicsPerList, 10) || 20) - 1; topics.getUnreadTopics(req.uid, 0, stop, function (err, data) {
topics.getUnreadTopics(uid, 0, end, function (err, data) {
if (err) { if (err) {
return next(err); return next(err);
} }
@ -84,10 +81,8 @@ categoriesController.unread = function(req, res, next) {
}; };
categoriesController.unreadTotal = function(req, res, next) { categoriesController.unreadTotal = function(req, res, next) {
var uid = req.user ? req.user.uid : 0; topics.getTotalUnread(req.uid, function (err, data) {
if (err) {
topics.getTotalUnread(uid, function (err, data) {
if(err) {
return next(err); return next(err);
} }
@ -122,11 +117,10 @@ categoriesController.list = function(req, res, next) {
next(null); next(null);
}, },
categories: function (next) { categories: function (next) {
var uid = req.user ? req.user.uid : 0;
var categoryData; var categoryData;
async.waterfall([ async.waterfall([
function(next) { function(next) {
categories.getCategoriesByPrivilege(uid, 'find', next); categories.getCategoriesByPrivilege(req.uid, 'find', next);
}, },
function(_categoryData, next) { function(_categoryData, next) {
categoryData = _categoryData; categoryData = _categoryData;
@ -143,7 +137,7 @@ categoriesController.list = function(req, res, next) {
return category && !category.parent; return category && !category.parent;
}); });
categories.getRecentTopicReplies(allCategories, uid, next); categories.getRecentTopicReplies(allCategories, req.uid, next);
} }
], function(err) { ], function(err) {
next(err, categoryData); next(err, categoryData);
@ -166,7 +160,6 @@ categoriesController.list = function(req, res, next) {
categoriesController.get = function(req, res, next) { categoriesController.get = function(req, res, next) {
var cid = req.params.category_id, var cid = req.params.category_id,
page = req.query.page || 1, page = req.query.page || 1,
uid = req.user ? req.user.uid : 0,
userPrivileges; userPrivileges;
if (req.params.topic_index && !utils.isNumber(req.params.topic_index)) { if (req.params.topic_index && !utils.isNumber(req.params.topic_index)) {
@ -183,10 +176,10 @@ categoriesController.get = function(req, res, next) {
categories.getCategoryFields(cid, ['slug', 'disabled', 'topic_count'], next); categories.getCategoryFields(cid, ['slug', 'disabled', 'topic_count'], next);
}, },
privileges: function(next) { privileges: function(next) {
privileges.categories.get(cid, uid, next); privileges.categories.get(cid, req.uid, next);
}, },
userSettings: function(next) { userSettings: function(next) {
user.getSettings(uid, next); user.getSettings(req.uid, next);
} }
}, next); }, next);
}, },
@ -232,15 +225,15 @@ categoriesController.get = function(req, res, next) {
} }
var start = (page - 1) * settings.topicsPerPage + topicIndex, var start = (page - 1) * settings.topicsPerPage + topicIndex,
end = start + settings.topicsPerPage - 1; stop = start + settings.topicsPerPage - 1;
next(null, { next(null, {
cid: cid, cid: cid,
set: set, set: set,
reverse: reverse, reverse: reverse,
start: start, start: start,
end: end, stop: stop,
uid: uid uid: req.uid
}); });
}, },
function(payload, next) { function(payload, next) {
@ -276,7 +269,7 @@ categoriesController.get = function(req, res, next) {
}); });
}, },
function(categoryData, next) { function(categoryData, next) {
categories.getRecentTopicReplies(categoryData.children, uid, function(err) { categories.getRecentTopicReplies(categoryData.children, req.uid, function(err) {
next(err, categoryData); next(err, categoryData);
}); });
}, },
@ -303,7 +296,7 @@ categoriesController.get = function(req, res, next) {
} }
]; ];
if(categoryData.backgroundImage) { if (categoryData.backgroundImage) {
res.locals.metaTags.push({ res.locals.metaTags.push({
name: 'og:image', name: 'og:image',
content: categoryData.backgroundImage content: categoryData.backgroundImage

@ -12,7 +12,7 @@ groupsController.list = function(req, res, next) {
groups.list({ groups.list({
truncateUserList: true, truncateUserList: true,
expand: true, expand: true,
uid: req.user ? parseInt(req.user.uid, 10) : 0 uid: req.uid
}, function(err, groups) { }, function(err, groups) {
if (err) { if (err) {
return next(err); return next(err);
@ -25,12 +25,12 @@ groupsController.list = function(req, res, next) {
}; };
groupsController.details = function(req, res, next) { groupsController.details = function(req, res, next) {
var uid = req.user ? parseInt(req.user.uid, 10) : 0;
async.waterfall([ async.waterfall([
async.apply(groups.exists, res.locals.groupName), async.apply(groups.exists, res.locals.groupName),
function(exists, next) { function(exists, next) {
if (!exists) { return next(undefined, null); } if (!exists) {
return next(undefined, null);
}
// Ensure the group isn't hidden either // Ensure the group isn't hidden either
groups.isHidden(res.locals.groupName, next); groups.isHidden(res.locals.groupName, next);
@ -43,8 +43,8 @@ groupsController.details = function(req, res, next) {
} else { } else {
// If not, only members are granted access // If not, only members are granted access
async.parallel([ async.parallel([
async.apply(groups.isMember, uid, res.locals.groupName), async.apply(groups.isMember, req.uid, res.locals.groupName),
async.apply(groups.isInvited, uid, res.locals.groupName) async.apply(groups.isInvited, req.uid, res.locals.groupName)
], function(err, checks) { ], function(err, checks) {
next(err, checks[0] || checks[1]); next(err, checks[0] || checks[1]);
}); });
@ -63,11 +63,11 @@ groupsController.details = function(req, res, next) {
group: function(next) { group: function(next) {
groups.get(res.locals.groupName, { groups.get(res.locals.groupName, {
expand: true, expand: true,
uid: uid uid: req.uid
}, next); }, next);
}, },
posts: function(next) { posts: function(next) {
groups.getLatestMemberPosts(res.locals.groupName, 10, uid, next); groups.getLatestMemberPosts(res.locals.groupName, 10, req.uid, next);
} }
}, function(err, results) { }, function(err, results) {
if (err) { if (err) {
@ -84,13 +84,12 @@ groupsController.details = function(req, res, next) {
}; };
groupsController.members = function(req, res, next) { groupsController.members = function(req, res, next) {
var uid = req.user ? parseInt(req.user.uid, 10) : 0;
async.waterfall([ async.waterfall([
function(next) { function(next) {
groups.getGroupNameByGroupSlug(req.params.slug, next); groups.getGroupNameByGroupSlug(req.params.slug, next);
}, },
function(groupName, next) { function(groupName, next) {
user.getUsersFromSet('group:' + groupName + ':members', uid, 0, 49, next); user.getUsersFromSet('group:' + groupName + ':members', req.uid, 0, 49, next);
}, },
], function(err, users) { ], function(err, users) {
if (err) { if (err) {

@ -26,13 +26,11 @@ helpers.notFound = function(req, res, error) {
}; };
helpers.notAllowed = function(req, res, error) { helpers.notAllowed = function(req, res, error) {
var uid = req.user ? req.user.uid : 0; if (req.uid) {
if (uid) {
if (res.locals.isAPI) { if (res.locals.isAPI) {
res.status(403).json({path: req.path.replace(/^\/api/, ''), loggedIn: !!uid, error: error}); res.status(403).json({path: req.path.replace(/^\/api/, ''), loggedIn: !!req.uid, error: error});
} else { } else {
res.status(403).render('403', {path: req.path, loggedIn: !!uid, error: error}); res.status(403).render('403', {path: req.path, loggedIn: !!req.uid, error: error});
} }
} else { } else {
if (res.locals.isAPI) { if (res.locals.isAPI) {

@ -8,10 +8,9 @@ var async = require('async'),
postsController = {}; postsController = {};
postsController.getPost = function(req, res, next) { postsController.getPost = function(req, res, next) {
var uid = req.user ? parseInt(req.user.uid) : 0;
async.parallel({ async.parallel({
canRead: function(next) { canRead: function(next) {
privileges.posts.can('read', req.params.pid, uid, next); privileges.posts.can('read', req.params.pid, req.uid, next);
}, },
postData: function(next) { postData: function(next) {
posts.getPostData(req.params.pid, next); posts.getPostData(req.params.pid, next);

@ -15,10 +15,9 @@ searchController.search = function(req, res, next) {
return helpers.notFound(req, res); return helpers.notFound(req, res);
} }
var uid = req.user ? req.user.uid : 0;
var breadcrumbs = helpers.buildBreadcrumbs([{text: '[[global:search]]'}]); var breadcrumbs = helpers.buildBreadcrumbs([{text: '[[global:search]]'}]);
categories.getCategoriesByPrivilege(uid, 'read', function(err, categories) { categories.getCategoriesByPrivilege(req.uid, 'read', function(err, categories) {
if (err) { if (err) {
return next(err); return next(err);
} }
@ -42,7 +41,7 @@ searchController.search = function(req, res, next) {
sortBy: req.query.sortBy, sortBy: req.query.sortBy,
sortDirection: req.query.sortDirection, sortDirection: req.query.sortDirection,
page: page, page: page,
uid: uid uid: req.uid
}; };
search.search(data, function(err, results) { search.search(data, function(err, results) {

@ -10,10 +10,9 @@ var tagsController = {},
tagsController.getTag = function(req, res, next) { tagsController.getTag = function(req, res, next) {
var tag = validator.escape(req.params.tag); var tag = validator.escape(req.params.tag);
var uid = req.user ? req.user.uid : 0; var stop = (parseInt(meta.config.topicsPerList, 10) || 20) - 1;
var end = (parseInt(meta.config.topicsPerList, 10) || 20) - 1;
topics.getTagTids(tag, 0, end, function(err, tids) { topics.getTagTids(tag, 0, stop, function(err, tids) {
if (err) { if (err) {
return next(err); return next(err);
} }
@ -23,7 +22,7 @@ tagsController.getTag = function(req, res, next) {
return res.render('tag', {topics: [], tag: tag}); return res.render('tag', {topics: [], tag: tag});
} }
topics.getTopics(tids, uid, function(err, topics) { topics.getTopics(tids, req.uid, function(err, topics) {
if (err) { if (err) {
return next(err); return next(err);
} }
@ -45,7 +44,7 @@ tagsController.getTag = function(req, res, next) {
var data = { var data = {
topics: topics, topics: topics,
tag: tag, tag: tag,
nextStart: end + 1, nextStart: stop + 1,
breadcrumbs: helpers.buildBreadcrumbs([{text: '[[tags:tags]]', url: '/tags'}, {text: tag}]) breadcrumbs: helpers.buildBreadcrumbs([{text: '[[tags:tags]]', url: '/tags'}, {text: tag}])
}; };
res.render('tag', data); res.render('tag', data);

@ -20,7 +20,6 @@ topicsController.get = function(req, res, next) {
var tid = req.params.topic_id, var tid = req.params.topic_id,
page = 1, page = 1,
sort = req.query.sort, sort = req.query.sort,
uid = req.user ? req.user.uid : 0,
userPrivileges; userPrivileges;
if (req.params.post_index && !utils.isNumber(req.params.post_index)) { if (req.params.post_index && !utils.isNumber(req.params.post_index)) {
@ -31,10 +30,10 @@ topicsController.get = function(req, res, next) {
function (next) { function (next) {
async.parallel({ async.parallel({
privileges: function(next) { privileges: function(next) {
privileges.topics.get(tid, uid, next); privileges.topics.get(tid, req.uid, next);
}, },
settings: function(next) { settings: function(next) {
user.getSettings(uid, next); user.getSettings(req.uid, next);
}, },
topic: function(next) { topic: function(next) {
topics.getTopicFields(tid, ['slug', 'postcount', 'deleted'], next); topics.getTopicFields(tid, ['slug', 'postcount', 'deleted'], next);
@ -106,9 +105,9 @@ topicsController.get = function(req, res, next) {
} }
var start = (page - 1) * settings.postsPerPage + postIndex, var start = (page - 1) * settings.postsPerPage + postIndex,
end = start + settings.postsPerPage - 1; stop = start + settings.postsPerPage - 1;
topics.getTopicWithPosts(tid, set, uid, start, end, reverse, function (err, topicData) { topics.getTopicWithPosts(tid, set, req.uid, start, stop, reverse, function (err, topicData) {
if (err && err.message === '[[error:no-topic]]' && !topicData) { if (err && err.message === '[[error:no-topic]]' && !topicData) {
return helpers.notFound(req, res); return helpers.notFound(req, res);
} }
@ -255,7 +254,7 @@ topicsController.get = function(req, res, next) {
data['reputation:disabled'] = parseInt(meta.config['reputation:disabled'], 10) === 1; data['reputation:disabled'] = parseInt(meta.config['reputation:disabled'], 10) === 1;
data['downvote:disabled'] = parseInt(meta.config['downvote:disabled'], 10) === 1; data['downvote:disabled'] = parseInt(meta.config['downvote:disabled'], 10) === 1;
data['feeds:disableRSS'] = parseInt(meta.config['feeds:disableRSS'], 10) === 1; data['feeds:disableRSS'] = parseInt(meta.config['feeds:disableRSS'], 10) === 1;
data['rssFeedUrl'] = nconf.get('relative_path') + '/topic/' + data.tid + '.rss'; data.rssFeedUrl = nconf.get('relative_path') + '/topic/' + data.tid + '.rss';
data.pagination = pagination.create(data.currentPage, data.pageCount); data.pagination = pagination.create(data.currentPage, data.pageCount);
data.pagination.rel.forEach(function(rel) { data.pagination.rel.forEach(function(rel) {
res.locals.linkTags.push(rel); res.locals.linkTags.push(rel);
@ -274,42 +273,36 @@ topicsController.get = function(req, res, next) {
topicsController.teaser = function(req, res, next) { topicsController.teaser = function(req, res, next) {
var tid = req.params.topic_id; var tid = req.params.topic_id;
var uid = req.user ? parseInt(req.user.uid, 10) : 0;
if (!utils.isNumber(tid)) { if (!utils.isNumber(tid)) {
return next(new Error('[[error:invalid-tid]]')); return next(new Error('[[error:invalid-tid]]'));
} }
privileges.topics.can('read', tid, uid, function(err, canRead) { async.waterfall([
if (err) { function(next) {
return next(err); privileges.topics.can('read', tid, req.uid, next);
} },
function(canRead, next) {
if (!canRead) { if (!canRead) {
return res.status(403).json('[[error:no-privileges]]'); return res.status(403).json('[[error:no-privileges]]');
}
topics.getLatestUndeletedPid(tid, function(err, pid) {
if (err) {
return next(err);
} }
topics.getLatestUndeletedPid(tid, next);
},
function(pid, next) {
if (!pid) { if (!pid) {
return res.status(404).json('not-found'); return res.status(404).json('not-found');
} }
posts.getPostSummaryByPids([pid], req.uid, {stripTags: false}, next);
}
], function(err, posts) {
if (err) {
return next(err);
}
posts.getPostSummaryByPids([pid], uid, {stripTags: false}, function(err, posts) { if (!Array.isArray(posts) || !posts.length) {
if (err) { return res.status(404).json('not-found');
return next(err); }
} res.json(posts[0]);
if (!Array.isArray(posts) || !posts.length) {
return res.status(404).json('not-found');
}
res.json(posts[0]);
});
});
}); });
}; };

@ -11,18 +11,17 @@ var async = require('async'),
usersController.getOnlineUsers = function(req, res, next) { usersController.getOnlineUsers = function(req, res, next) {
var websockets = require('../socket.io'); var websockets = require('../socket.io');
var uid = req.user ? req.user.uid : 0;
async.parallel({ async.parallel({
users: function(next) { users: function(next) {
user.getUsersFromSet('users:online', uid, 0, 49, next); user.getUsersFromSet('users:online', req.uid, 0, 49, next);
}, },
count: function(next) { count: function(next) {
var now = Date.now(); var now = Date.now();
db.sortedSetCount('users:online', now - 300000, now, next); db.sortedSetCount('users:online', now - 300000, now, next);
}, },
isAdministrator: function(next) { isAdministrator: function(next) {
user.isAdministrator(uid, next); user.isAdministrator(req.uid, next);
} }
}, function(err, results) { }, function(err, results) {
if (err) { if (err) {
@ -62,9 +61,7 @@ usersController.getUsersSortedByJoinDate = function(req, res, next) {
}; };
usersController.getUsers = function(set, count, req, res, next) { usersController.getUsers = function(set, count, req, res, next) {
var uid = req.user ? req.user.uid : 0; getUsersAndCount(set, req.uid, count, function(err, data) {
getUsersAndCount(set, uid, count, function(err, data) {
if (err) { if (err) {
return next(err); return next(err);
} }
@ -102,10 +99,9 @@ function getUsersAndCount(set, uid, count, callback) {
} }
usersController.getUsersForSearch = function(req, res, next) { usersController.getUsersForSearch = function(req, res, next) {
var resultsPerPage = parseInt(meta.config.userSearchResultsPerPage, 10) || 20, var resultsPerPage = parseInt(meta.config.userSearchResultsPerPage, 10) || 20;
uid = req.user ? req.user.uid : 0;
getUsersAndCount('users:joindate', uid, resultsPerPage, function(err, data) { getUsersAndCount('users:joindate', req.uid, resultsPerPage, function(err, data) {
if (err) { if (err) {
return next(err); return next(err);
} }

@ -93,8 +93,8 @@ var async = require('async'),
}); });
}; };
Groups.getGroups = function(start, end, callback) { Groups.getGroups = function(start, stop, callback) {
db.getSortedSetRevRange('groups:createtime', start, end, callback); db.getSortedSetRevRange('groups:createtime', start, stop, callback);
}; };
Groups.get = function(groupName, options, callback) { Groups.get = function(groupName, options, callback) {
@ -315,8 +315,8 @@ var async = require('async'),
}); });
}; };
Groups.getMembers = function(groupName, start, end, callback) { Groups.getMembers = function(groupName, start, stop, callback) {
db.getSortedSetRevRange('group:' + groupName + ':members', start, end, callback); db.getSortedSetRevRange('group:' + groupName + ':members', start, stop, callback);
}; };
Groups.getMembersOfGroups = function(groupNames, callback) { Groups.getMembersOfGroups = function(groupNames, callback) {

@ -225,10 +225,10 @@ var db = require('./database'),
db.sortedSetAdd('uid:' + uid + ':chats', Date.now(), toUid, callback); db.sortedSetAdd('uid:' + uid + ':chats', Date.now(), toUid, callback);
}; };
Messaging.getRecentChats = function(uid, start, end, callback) { Messaging.getRecentChats = function(uid, start, stop, callback) {
var websockets = require('./socket.io'); var websockets = require('./socket.io');
db.getSortedSetRevRange('uid:' + uid + ':chats', start, end, function(err, uids) { db.getSortedSetRevRange('uid:' + uid + ':chats', start, stop, function(err, uids) {
if (err) { if (err) {
return callback(err); return callback(err);
} }
@ -250,7 +250,7 @@ var db = require('./database'),
}); });
if (!results.users.length) { if (!results.users.length) {
return callback(null, {users: [], nextStart: end + 1}); return callback(null, {users: [], nextStart: stop + 1});
} }
results.users.forEach(function(user, index) { results.users.forEach(function(user, index) {
@ -260,7 +260,7 @@ var db = require('./database'),
} }
}); });
callback(null, {users: results.users, nextStart: end + 1}); callback(null, {users: results.users, nextStart: stop + 1});
}); });
}); });
}; };

@ -40,7 +40,7 @@ module.exports = function(Meta) {
}; };
Meta.title.parseFragment = function (urlFragment, language, locals, callback) { Meta.title.parseFragment = function (urlFragment, language, locals, callback) {
var translated = ['', 'recent', 'unread', 'users', 'notifications']; var translated = ['', 'recent', 'unread', 'users', 'notifications', 'popular', 'tags'];
if (translated.indexOf(urlFragment) !== -1) { if (translated.indexOf(urlFragment) !== -1) {
if (!urlFragment.length) { if (!urlFragment.length) {
urlFragment = 'home'; urlFragment = 'home';
@ -60,7 +60,7 @@ module.exports = function(Meta) {
} else if (tests.isTag.test(urlFragment)) { } else if (tests.isTag.test(urlFragment)) {
var tag = urlFragment.match(/tags\/([\s\S]+)/)[1]; var tag = urlFragment.match(/tags\/([\s\S]+)/)[1];
translator.translate('[[pages:tags, ' + tag + ']]', language, function(translated) { translator.translate('[[pages:tag, ' + tag + ']]', language, function(translated) {
callback(null, translated); callback(null, translated);
}); });
} else if (tests.isUserPage.test(urlFragment)) { } else if (tests.isUserPage.test(urlFragment)) {

@ -53,19 +53,17 @@ middleware.buildHeader = function(req, res, next) {
}; };
middleware.renderHeader = function(req, res, next) { middleware.renderHeader = function(req, res, next) {
var uid = req.user ? req.user.uid : 0;
var custom_header = { var custom_header = {
'plugins': [], 'plugins': [],
'authentication': [] 'authentication': []
}; };
user.getUserFields(uid, ['username', 'userslug', 'email', 'picture', 'email:confirmed'], function(err, userData) { user.getUserFields(req.uid, ['username', 'userslug', 'email', 'picture', 'email:confirmed'], function(err, userData) {
if (err) { if (err) {
return next(err); return next(err);
} }
userData.uid = uid; userData.uid = req.uid;
userData['email:confirmed'] = parseInt(userData['email:confirmed'], 10) === 1; userData['email:confirmed'] = parseInt(userData['email:confirmed'], 10) === 1;
async.parallel({ async.parallel({

@ -124,9 +124,7 @@ middleware.checkGlobalPrivacySettings = function(req, res, next) {
middleware.checkAccountPermissions = function(req, res, next) { middleware.checkAccountPermissions = function(req, res, next) {
// This middleware ensures that only the requested user and admins can pass // This middleware ensures that only the requested user and admins can pass
var callerUID = req.user ? parseInt(req.user.uid, 10) : 0; if (!req.uid) {
if (callerUID === 0) {
return controllers.helpers.notAllowed(req, res); return controllers.helpers.notAllowed(req, res);
} }
@ -139,11 +137,11 @@ middleware.checkAccountPermissions = function(req, res, next) {
return controllers.helpers.notFound(req, res); return controllers.helpers.notFound(req, res);
} }
if (parseInt(uid, 10) === callerUID) { if (parseInt(uid, 10) === req.uid) {
return next(); return next();
} }
user.isAdministrator(callerUID, function(err, isAdmin) { user.isAdministrator(req.uid, function(err, isAdmin) {
if (err || isAdmin) { if (err || isAdmin) {
return next(err); return next(err);
} }
@ -201,8 +199,6 @@ middleware.buildHeader = function(req, res, next) {
}; };
middleware.renderHeader = function(req, res, callback) { middleware.renderHeader = function(req, res, callback) {
var uid = req.user ? parseInt(req.user.uid, 10) : 0;
navigation.get(function(err, menuItems) { navigation.get(function(err, menuItems) {
if (err) { if (err) {
return callback(err); return callback(err);
@ -284,8 +280,8 @@ middleware.renderHeader = function(req, res, callback) {
next(null, templateValues.useCustomJS ? meta.config.customJS : ''); next(null, templateValues.useCustomJS ? meta.config.customJS : '');
}, },
title: function(next) { title: function(next) {
if (uid) { if (req.uid) {
user.getSettings(uid, function(err, settings) { user.getSettings(req.uid, function(err, settings) {
if (err) { if (err) {
return next(err); return next(err);
} }
@ -296,11 +292,11 @@ middleware.renderHeader = function(req, res, callback) {
} }
}, },
isAdmin: function(next) { isAdmin: function(next) {
user.isAdministrator(uid, next); user.isAdministrator(req.uid, next);
}, },
user: function(next) { user: function(next) {
if (uid) { if (req.uid) {
user.getUserFields(uid, ['username', 'userslug', 'email', 'picture', 'status', 'email:confirmed', 'banned'], next); user.getUserFields(req.uid, ['username', 'userslug', 'email', 'picture', 'status', 'email:confirmed', 'banned'], next);
} else { } else {
next(null, { next(null, {
username: '[[global:guest]]', username: '[[global:guest]]',
@ -527,7 +523,7 @@ middleware.exposeUid = function(req, res, next) {
res.locals.uid = uid; res.locals.uid = uid;
next(); next();
}) });
} else { } else {
next(); next();
} }

@ -26,11 +26,11 @@ var async = require('async'),
db.isSortedSetMember('posts:pid', pid, callback); db.isSortedSetMember('posts:pid', pid, callback);
}; };
Posts.getPidsFromSet = function(set, start, end, reverse, callback) { Posts.getPidsFromSet = function(set, start, stop, reverse, callback) {
if (isNaN(start) || isNaN(end)) { if (isNaN(start) || isNaN(stop)) {
return callback(null, []); return callback(null, []);
} }
db[reverse ? 'getSortedSetRevRange' : 'getSortedSetRange'](set, start, end, callback); db[reverse ? 'getSortedSetRevRange' : 'getSortedSetRange'](set, start, stop, callback);
}; };
Posts.getPostsByPids = function(pids, uid, callback) { Posts.getPostsByPids = function(pids, uid, callback) {
@ -73,10 +73,10 @@ var async = require('async'),
}); });
}; };
Posts.getPostsFromSet = function(set, uid, start, end, callback) { Posts.getPostsFromSet = function(set, uid, start, stop, callback) {
async.waterfall([ async.waterfall([
function(next) { function(next) {
db.getSortedSetRevRange(set, start, end, next); db.getSortedSetRevRange(set, start, stop, next);
}, },
function(pids, next) { function(pids, next) {
privileges.posts.filter('read', pids, uid, next); privileges.posts.filter('read', pids, uid, next);
@ -85,7 +85,7 @@ var async = require('async'),
Posts.getPostSummaryByPids(pids, uid, {stripTags: false}, next); Posts.getPostSummaryByPids(pids, uid, {stripTags: false}, next);
}, },
function(posts, next) { function(posts, next) {
next(null, {posts: posts, nextStart: end + 1}); next(null, {posts: posts, nextStart: stop + 1});
} }
], callback); ], callback);
}; };

@ -90,8 +90,8 @@ module.exports = function(Posts) {
db.delete('posts:flagged', callback); db.delete('posts:flagged', callback);
}; };
Posts.getFlags = function(set, uid, start, end, callback) { Posts.getFlags = function(set, uid, start, stop, callback) {
db.getSortedSetRevRange(set, start, end, function(err, pids) { db.getSortedSetRevRange(set, start, stop, function(err, pids) {
if (err) { if (err) {
return callback(err); return callback(err);
} }
@ -100,7 +100,7 @@ module.exports = function(Posts) {
}); });
}; };
Posts.getUserFlags = function(byUsername, sortBy, callerUID, start, end, callback) { Posts.getUserFlags = function(byUsername, sortBy, callerUID, start, stop, callback) {
async.waterfall([ async.waterfall([
function(next) { function(next) {
user.getUidByUsername(byUsername, next); user.getUidByUsername(byUsername, next);
@ -120,7 +120,7 @@ module.exports = function(Posts) {
return b.flags - a.flags; return b.flags - a.flags;
}); });
} }
next(null, posts.slice(start, end)); next(null, posts.slice(start, stop));
} }
], callback); ], callback);
}; };

@ -33,10 +33,10 @@ module.exports = function(Posts) {
], callback); ], callback);
}; };
Posts.getRecentPosterUids = function(start, end, callback) { Posts.getRecentPosterUids = function(start, stop, callback) {
async.waterfall([ async.waterfall([
function(next) { function(next) {
db.getSortedSetRevRange('posts:pid', start, end, next); db.getSortedSetRevRange('posts:pid', start, stop, next);
}, },
function(pids, next) { function(pids, next) {
Posts.getPostsFields(pids, ['uid'], next); Posts.getPostsFields(pids, ['uid'], next);

@ -6,8 +6,8 @@ var async = require('async'),
module.exports = function(Posts) { module.exports = function(Posts) {
Posts.getPostsByTid = function(tid, set, start, end, uid, reverse, callback) { Posts.getPostsByTid = function(tid, set, start, stop, uid, reverse, callback) {
Posts.getPidsFromSet(set, start, end, reverse, function(err, pids) { Posts.getPidsFromSet(set, start, stop, reverse, function(err, pids) {
if (err) { if (err) {
return callback(err); return callback(err);
} }

@ -35,10 +35,8 @@ function getModerators(req, res, next) {
function getRecentPosts(req, res, next) { function getRecentPosts(req, res, next) {
var uid = (req.user) ? req.user.uid : 0; posts.getRecentPosts(req.uid, 0, 19, req.params.term, function (err, data) {
if (err) {
posts.getRecentPosts(uid, 0, 19, req.params.term, function (err, data) {
if(err) {
return next(err); return next(err);
} }

@ -23,6 +23,11 @@
app.use(passport.initialize()); app.use(passport.initialize());
app.use(passport.session()); app.use(passport.session());
app.use(function(req, res, next) {
req.uid = req.user ? parseInt(req.user.uid) : 0;
next();
});
Auth.app = app; Auth.app = app;
Auth.middleware = middleware; Auth.middleware = middleware;
}; };

@ -25,9 +25,7 @@ function hasCategoryPrivileges(req, res, next) {
} }
function hasPrivileges(method, id, req, res, next) { function hasPrivileges(method, id, req, res, next) {
var uid = req.user ? req.user.uid || 0 : 0; method('read', id, req.uid, function(err, canRead) {
method('read', id, uid, function(err, canRead) {
if (err) { if (err) {
return next(err); return next(err);
} }
@ -42,14 +40,13 @@ function hasPrivileges(method, id, req, res, next) {
function generateForTopic(req, res, next) { function generateForTopic(req, res, next) {
var tid = req.params.topic_id; var tid = req.params.topic_id;
var uid = req.user ? req.user.uid : 0;
privileges.topics.get(tid, uid, function(err, userPrivileges) { privileges.topics.get(tid, req.uid, function(err, userPrivileges) {
if (err) { if (err) {
return next(err); return next(err);
} }
topics.getTopicWithPosts(tid, 'tid:' + tid + ':posts', uid, 0, 25, false, function (err, topicData) { topics.getTopicWithPosts(tid, 'tid:' + tid + ':posts', req.uid, 0, 25, false, function (err, topicData) {
if (err) { if (err) {
return next(err); return next(err);
} }
@ -122,14 +119,14 @@ function generateForUserTopics(req, res, next) {
function generateForCategory(req, res, next) { function generateForCategory(req, res, next) {
var cid = req.params.category_id; var cid = req.params.category_id;
var uid = req.user ? req.user.uid : 0;
categories.getCategoryById({ categories.getCategoryById({
cid: cid, cid: cid,
set: 'cid:' + cid + ':tids', set: 'cid:' + cid + ':tids',
reverse: true, reverse: true,
start: 0, start: 0,
end: 25, stop: 25,
uid: uid uid: req.uid
}, function (err, categoryData) { }, function (err, categoryData) {
if (err) { if (err) {
return next(err); return next(err);
@ -159,7 +156,6 @@ function generateForRecent(req, res, next) {
} }
function generateForPopular(req, res, next) { function generateForPopular(req, res, next) {
var uid = req.user ? req.user.uid : 0;
var terms = { var terms = {
daily: 'day', daily: 'day',
weekly: 'week', weekly: 'week',
@ -168,7 +164,7 @@ function generateForPopular(req, res, next) {
}; };
var term = terms[req.params.term] || 'day'; var term = terms[req.params.term] || 'day';
topics.getPopular(term, uid, 19, function(err, topics) { topics.getPopular(term, req.uid, 19, function(err, topics) {
if (err) { if (err) {
return next(err); return next(err);
} }
@ -196,8 +192,7 @@ function disabledRSS(req, res, next) {
} }
function generateForTopics(options, set, req, res, next) { function generateForTopics(options, set, req, res, next) {
var uid = req.user ? req.user.uid : 0; topics.getTopicsFromSet(set, req.uid, 0, 19, function (err, data) {
topics.getTopicsFromSet(set, uid, 0, 19, function (err, data) {
if (err) { if (err) {
return next(err); return next(err);
} }
@ -239,8 +234,7 @@ function generateTopicsFeed(feedOptions, feedTopics, callback) {
} }
function generateForRecentPosts(req, res, next) { function generateForRecentPosts(req, res, next) {
var uid = req.user ? req.user.uid : 0; posts.getRecentPosts(req.uid, 0, 19, 'month', function(err, posts) {
posts.getRecentPosts(uid, 0, 19, 'month', function(err, posts) {
if (err) { if (err) {
return next(err); return next(err);
} }
@ -257,7 +251,6 @@ function generateForRecentPosts(req, res, next) {
} }
function generateForCategoryRecentPosts(req, res, next) { function generateForCategoryRecentPosts(req, res, next) {
var uid = req.user ? req.user.uid : 0;
var cid = req.params.category_id; var cid = req.params.category_id;
async.parallel({ async.parallel({
@ -265,7 +258,7 @@ function generateForCategoryRecentPosts(req, res, next) {
categories.getCategoryData(cid, next); categories.getCategoryData(cid, next);
}, },
posts: function(next) { posts: function(next) {
categories.getRecentReplies(cid, uid, 20, next); categories.getRecentReplies(cid, req.uid, 20, next);
} }
}, function(err, results) { }, function(err, results) {
if (err) { if (err) {

@ -304,12 +304,12 @@ SocketAdmin.getMoreEvents = function(socket, next, callback) {
if (start < 0) { if (start < 0) {
return callback(null, {data: [], next: next}); return callback(null, {data: [], next: next});
} }
var end = start + 10; var stop = start + 10;
events.getEvents(start, end, function(err, events) { events.getEvents(start, stop, function(err, events) {
if (err) { if (err) {
return callback(err); return callback(err);
} }
callback(null, {events: events, next: end + 1}); callback(null, {events: events, next: stop + 1});
}); });
}; };
@ -336,15 +336,15 @@ SocketAdmin.getMoreFlags = function(socket, data, callback) {
var sortBy = data.sortBy || 'count'; var sortBy = data.sortBy || 'count';
var byUsername = data.byUsername || ''; var byUsername = data.byUsername || '';
var start = parseInt(data.after, 10); var start = parseInt(data.after, 10);
var end = start + 19; var stop = start + 19;
if (byUsername) { if (byUsername) {
posts.getUserFlags(byUsername, sortBy, socket.uid, start, end, function(err, posts) { posts.getUserFlags(byUsername, sortBy, socket.uid, start, stop, function(err, posts) {
callback(err, {posts: posts, next: end + 1}); callback(err, {posts: posts, next: stop + 1});
}); });
} else { } else {
var set = sortBy === 'count' ? 'posts:flags:count' : 'posts:flagged'; var set = sortBy === 'count' ? 'posts:flags:count' : 'posts:flagged';
posts.getFlags(set, socket.uid, start, end, function(err, posts) { posts.getFlags(set, socket.uid, start, stop, function(err, posts) {
callback(err, {posts: posts, next: end + 1}); callback(err, {posts: posts, next: stop + 1});
}); });
} }
}; };

@ -58,7 +58,7 @@ SocketCategories.loadMore = function(socket, data, callback) {
} }
var start = parseInt(data.after, 10), var start = parseInt(data.after, 10),
end = start + results.settings.topicsPerPage - 1; stop = start + results.settings.topicsPerPage - 1;
if (results.targetUid) { if (results.targetUid) {
set = 'cid:' + data.cid + ':uid:' + results.targetUid + ':tids'; set = 'cid:' + data.cid + ':uid:' + results.targetUid + ':tids';
@ -69,7 +69,7 @@ SocketCategories.loadMore = function(socket, data, callback) {
set: set, set: set,
reverse: reverse, reverse: reverse,
start: start, start: start,
stop: end, stop: stop,
uid: socket.uid, uid: socket.uid,
targetUid: results.targetUid targetUid: results.targetUid
}, function(err, data) { }, function(err, data) {

@ -249,9 +249,9 @@ SocketModules.chats.getRecentChats = function(socket, data, callback) {
return callback(new Error('[[error:invalid-data]]')); return callback(new Error('[[error:invalid-data]]'));
} }
var start = parseInt(data.after, 10), var start = parseInt(data.after, 10),
end = start + 9; stop = start + 9;
Messaging.getRecentChats(socket.uid, start, end, callback); Messaging.getRecentChats(socket.uid, start, stop, callback);
}; };

@ -511,27 +511,23 @@ SocketPosts.flag = function(socket, pid, callback) {
}; };
SocketPosts.loadMoreFavourites = function(socket, data, callback) { SocketPosts.loadMoreFavourites = function(socket, data, callback) {
if(!data || !data.after) { loadMorePosts('uid:' + data.uid + ':favourites', socket.uid, data, callback);
return callback(new Error('[[error:invalid-data]]'));
}
var start = parseInt(data.after, 10),
end = start + 9;
posts.getPostsFromSet('uid:' + socket.uid + ':favourites', socket.uid, start, end, callback);
}; };
SocketPosts.loadMoreUserPosts = function(socket, data, callback) { SocketPosts.loadMoreUserPosts = function(socket, data, callback) {
if(!data || !data.uid || !utils.isNumber(data.after)) { loadMorePosts('uid:' + data.uid + ':posts', socket.uid, data, callback);
};
function loadMorePosts(set, uid, data, callback) {
if (!data || !utils.isNumber(data.uid) || !utils.isNumber(data.after)) {
return callback(new Error('[[error:invalid-data]]')); return callback(new Error('[[error:invalid-data]]'));
} }
var start = Math.max(0, parseInt(data.after, 10)), var start = Math.max(0, parseInt(data.after, 10)),
end = start + 9; stop = start + 9;
posts.getPostsFromSet('uid:' + data.uid + ':posts', socket.uid, start, end, callback);
};
posts.getPostsFromSet(set, uid, start, stop, callback);
}
SocketPosts.getRecentPosts = function(socket, data, callback) { SocketPosts.getRecentPosts = function(socket, data, callback) {
if(!data || !data.count) { if(!data || !data.count) {

@ -470,11 +470,11 @@ SocketTopics.loadMore = function(socket, data, callback) {
} }
} }
var end = start + results.settings.postsPerPage - 1; var stop = start + results.settings.postsPerPage - 1;
async.parallel({ async.parallel({
posts: function(next) { posts: function(next) {
topics.getTopicPosts(data.tid, set, start, end, socket.uid, reverse, next); topics.getTopicPosts(data.tid, set, start, stop, socket.uid, reverse, next);
}, },
privileges: function(next) { privileges: function(next) {
next(null, results.privileges); next(null, results.privileges);
@ -490,33 +490,33 @@ SocketTopics.loadMore = function(socket, data, callback) {
}; };
SocketTopics.loadMoreUnreadTopics = function(socket, data, callback) { SocketTopics.loadMoreUnreadTopics = function(socket, data, callback) {
if(!data || !data.after) { if (!data || !data.after) {
return callback(new Error('[[error:invalid-data]]')); return callback(new Error('[[error:invalid-data]]'));
} }
var start = parseInt(data.after, 10), var start = parseInt(data.after, 10),
end = start + 9; stop = start + 9;
topics.getUnreadTopics(socket.uid, start, end, callback); topics.getUnreadTopics(socket.uid, start, stop, callback);
}; };
SocketTopics.loadMoreFromSet = function(socket, data, callback) { SocketTopics.loadMoreFromSet = function(socket, data, callback) {
if(!data || !data.after || !data.set) { if (!data || !data.after || !data.set) {
return callback(new Error('[[error:invalid-data]]')); return callback(new Error('[[error:invalid-data]]'));
} }
var start = parseInt(data.after, 10), var start = parseInt(data.after, 10),
end = start + 9; stop = start + 9;
topics.getTopicsFromSet(data.set, socket.uid, start, end, callback); topics.getTopicsFromSet(data.set, socket.uid, start, stop, callback);
}; };
SocketTopics.loadTopics = function(socket, data, callback) { SocketTopics.loadTopics = function(socket, data, callback) {
if(!data || !data.set || !utils.isNumber(data.start) || !utils.isNumber(data.end)) { if (!data || !data.set || !utils.isNumber(data.start) || !utils.isNumber(data.stop)) {
return callback(new Error('[[error:invalid-data]]')); return callback(new Error('[[error:invalid-data]]'));
} }
topics.getTopicsFromSet(data.set, socket.uid, data.start, data.end, callback); topics.getTopicsFromSet(data.set, socket.uid, data.start, data.stop, callback);
}; };
SocketTopics.getPageCount = function(socket, tid, callback) { SocketTopics.getPageCount = function(socket, tid, callback) {
@ -544,14 +544,14 @@ SocketTopics.loadMoreTags = function(socket, data, callback) {
} }
var start = parseInt(data.after, 10), var start = parseInt(data.after, 10),
end = start + 99; stop = start + 99;
topics.getTags(start, end, function(err, tags) { topics.getTags(start, stop, function(err, tags) {
if (err) { if (err) {
return callback(err); return callback(err);
} }
callback(null, {tags: tags, nextStart: end + 1}); callback(null, {tags: tags, nextStart: stop + 1});
}); });
}; };

@ -397,7 +397,7 @@ SocketUser.getUnreadChatCount = function(socket, data, callback) {
}; };
SocketUser.loadMore = function(socket, data, callback) { SocketUser.loadMore = function(socket, data, callback) {
if(!data || !data.set || parseInt(data.after, 10) < 0) { if (!data || !data.set || parseInt(data.after, 10) < 0) {
return callback(new Error('[[error:invalid-data]]')); return callback(new Error('[[error:invalid-data]]'));
} }
@ -406,28 +406,30 @@ SocketUser.loadMore = function(socket, data, callback) {
} }
var start = parseInt(data.after, 10), var start = parseInt(data.after, 10),
end = start + 19; stop = start + 19;
user.getUsersFromSet(data.set, socket.uid, start, end, function(err, userData) { async.parallel({
isAdmin: function(next) {
user.isAdministrator(socket.uid, next);
},
users: function(next) {
user.getUsersFromSet(data.set, socket.uid, start, stop, next);
}
}, function(err, results) {
if (err) { if (err) {
return callback(err); return callback(err);
} }
user.isAdministrator(socket.uid, function (err, isAdministrator) {
if (err) {
return callback(err);
}
if (!isAdministrator && data.set === 'users:online') {
userData = userData.filter(function(item) {
return item.status !== 'offline';
});
}
callback(null, { if (!results.isAdmin && data.set === 'users:online') {
users: userData, results.users = results.users.filter(function(user) {
nextStart: end + 1 return user.status !== 'offline';
}); });
}
callback(null, {
users: results.users,
nextStart: stop + 1
}); });
}); });
}; };

@ -112,16 +112,16 @@ var async = require('async'),
}); });
}; };
Topics.getTopicsFromSet = function(set, uid, start, end, callback) { Topics.getTopicsFromSet = function(set, uid, start, stop, callback) {
async.waterfall([ async.waterfall([
function(next) { function(next) {
db.getSortedSetRevRange(set, start, end, next); db.getSortedSetRevRange(set, start, stop, next);
}, },
function(tids, next) { function(tids, next) {
Topics.getTopics(tids, uid, next); Topics.getTopics(tids, uid, next);
}, },
function(topics, next) { function(topics, next) {
next(null, {topics: topics, nextStart: end + 1}); next(null, {topics: topics, nextStart: stop + 1});
} }
], callback); ], callback);
}; };
@ -209,14 +209,14 @@ var async = require('async'),
}); });
}; };
Topics.getTopicWithPosts = function(tid, set, uid, start, end, reverse, callback) { Topics.getTopicWithPosts = function(tid, set, uid, start, stop, reverse, callback) {
Topics.getTopicData(tid, function(err, topicData) { Topics.getTopicData(tid, function(err, topicData) {
if (err || !topicData) { if (err || !topicData) {
return callback(err || new Error('[[error:no-topic]]')); return callback(err || new Error('[[error:no-topic]]'));
} }
async.parallel({ async.parallel({
posts: async.apply(getMainPostAndReplies, topicData, set, uid, start, end, reverse), posts: async.apply(getMainPostAndReplies, topicData, set, uid, start, stop, reverse),
category: async.apply(Topics.getCategoryData, tid), category: async.apply(Topics.getCategoryData, tid),
threadTools: async.apply(plugins.fireHook, 'filter:topic.thread_tools', {topic: topicData, uid: uid, tools: []}), threadTools: async.apply(plugins.fireHook, 'filter:topic.thread_tools', {topic: topicData, uid: uid, tools: []}),
tags: async.apply(Topics.getTopicTagsObjects, tid), tags: async.apply(Topics.getTopicTagsObjects, tid),
@ -244,10 +244,10 @@ var async = require('async'),
}); });
}; };
function getMainPostAndReplies(topic, set, uid, start, end, reverse, callback) { function getMainPostAndReplies(topic, set, uid, start, stop, reverse, callback) {
async.waterfall([ async.waterfall([
function(next) { function(next) {
posts.getPidsFromSet(set, start, end, reverse, next); posts.getPidsFromSet(set, start, stop, reverse, next);
}, },
function(pids, next) { function(pids, next) {
if ((!Array.isArray(pids) || !pids.length) && !topic.mainPid) { if ((!Array.isArray(pids) || !pids.length) && !topic.mainPid) {
@ -268,7 +268,7 @@ var async = require('async'),
posts[0].index = 0; posts[0].index = 0;
} }
var indices = Topics.calculatePostIndices(start, end, topic.postcount, reverse); var indices = Topics.calculatePostIndices(start, stop, topic.postcount, reverse);
for (var i=1; i<posts.length; ++i) { for (var i=1; i<posts.length; ++i) {
if (posts[i]) { if (posts[i]) {
posts[i].index = indices[i - 1]; posts[i].index = indices[i - 1];

@ -29,11 +29,11 @@ module.exports = function(Topics) {
], callback); ], callback);
}; };
Topics.getTopicPosts = function(tid, set, start, end, uid, reverse, callback) { Topics.getTopicPosts = function(tid, set, start, stop, uid, reverse, callback) {
callback = callback || function() {}; callback = callback || function() {};
async.parallel({ async.parallel({
posts: function(next) { posts: function(next) {
posts.getPostsByTid(tid, set, start, end, uid, reverse, next); posts.getPostsByTid(tid, set, start, stop, uid, reverse, next);
}, },
postCount: function(next) { postCount: function(next) {
Topics.getTopicField(tid, 'postcount', next); Topics.getTopicField(tid, 'postcount', next);
@ -43,7 +43,7 @@ module.exports = function(Topics) {
return callback(err); return callback(err);
} }
var indices = Topics.calculatePostIndices(start, end, results.postCount, reverse); var indices = Topics.calculatePostIndices(start, stop, results.postCount, reverse);
results.posts.forEach(function(post, index) { results.posts.forEach(function(post, index) {
if (post) { if (post) {
post.index = indices[index]; post.index = indices[index];
@ -150,9 +150,9 @@ module.exports = function(Topics) {
}); });
}; };
Topics.calculatePostIndices = function(start, end, postCount, reverse) { Topics.calculatePostIndices = function(start, stop, postCount, reverse) {
var indices = []; var indices = [];
var count = end - start + 1; var count = stop - start + 1;
for(var i=0; i<count; ++i) { for(var i=0; i<count; ++i) {
if (reverse) { if (reverse) {
indices.push(postCount - (start + i + 1)); indices.push(postCount - (start + i + 1));

@ -14,32 +14,32 @@ module.exports = function(Topics) {
year: 31104000000 year: 31104000000
}; };
Topics.getLatestTopics = function(uid, start, end, term, callback) { Topics.getLatestTopics = function(uid, start, stop, term, callback) {
async.waterfall([ async.waterfall([
function (next) { function (next) {
Topics.getLatestTidsFromSet('topics:recent', start, end, term, next); Topics.getLatestTidsFromSet('topics:recent', start, stop, term, next);
}, },
function(tids, next) { function(tids, next) {
Topics.getTopics(tids, uid, next); Topics.getTopics(tids, uid, next);
}, },
function(topics, next) { function(topics, next) {
next(null, {topics: topics, nextStart: end + 1}); next(null, {topics: topics, nextStart: stop + 1});
} }
], callback); ], callback);
}; };
Topics.getLatestTids = function(start, end, term, callback) { Topics.getLatestTids = function(start, stop, term, callback) {
winston.warn('[deprecation warning] please use Topics.getLatestTidsFromSet("topics:recent")'); winston.warn('[deprecation warning] please use Topics.getLatestTidsFromSet("topics:recent")');
Topics.getLatestTidsFromSet('topics:recent', start, end, term, callback); Topics.getLatestTidsFromSet('topics:recent', start, stop, term, callback);
}; };
Topics.getLatestTidsFromSet = function(set, start, end, term, callback) { Topics.getLatestTidsFromSet = function(set, start, stop, term, callback) {
var since = terms.day; var since = terms.day;
if (terms[term]) { if (terms[term]) {
since = terms[term]; since = terms[term];
} }
var count = parseInt(end, 10) === -1 ? end : end - start + 1; var count = parseInt(stop, 10) === -1 ? stop : stop - start + 1;
db.getSortedSetRevRangeByScore(set, start, count, '+inf', Date.now() - since, callback); db.getSortedSetRevRangeByScore(set, start, count, '+inf', Date.now() - since, callback);
}; };

@ -11,7 +11,7 @@ var async = require('async'),
module.exports = function(Topics) { module.exports = function(Topics) {
Topics.getSuggestedTopics = function(tid, uid, start, end, callback) { Topics.getSuggestedTopics = function(tid, uid, start, stop, callback) {
async.parallel({ async.parallel({
tagTids: function(next) { tagTids: function(next) {
getTidsWithSameTags(tid, next); getTidsWithSameTags(tid, next);
@ -29,7 +29,7 @@ module.exports = function(Topics) {
var tids = results.tagTids.concat(results.searchTids).concat(results.categoryTids); var tids = results.tagTids.concat(results.searchTids).concat(results.categoryTids);
tids = tids.filter(function(_tid, index, array) { tids = tids.filter(function(_tid, index, array) {
return parseInt(_tid, 10) !== parseInt(tid, 10) && array.indexOf(_tid) === index; return parseInt(_tid, 10) !== parseInt(tid, 10) && array.indexOf(_tid) === index;
}).slice(start, end + 1); }).slice(start, stop + 1);
Topics.getTopics(tids, uid, callback); Topics.getTopics(tids, uid, callback);
}); });

@ -72,8 +72,8 @@ module.exports = function(Topics) {
}); });
} }
Topics.getTagTids = function(tag, start, end, callback) { Topics.getTagTids = function(tag, start, stop, callback) {
db.getSortedSetRevRange('tag:' + tag + ':topics', start, end, callback); db.getSortedSetRevRange('tag:' + tag + ':topics', start, stop, callback);
}; };
Topics.getTagTopicCount = function(tag, callback) { Topics.getTagTopicCount = function(tag, callback) {
@ -121,8 +121,8 @@ module.exports = function(Topics) {
db.sortedSetRemove('tags:topic:count', tag); db.sortedSetRemove('tags:topic:count', tag);
}; };
Topics.getTags = function(start, end, callback) { Topics.getTags = function(start, stop, callback) {
db.getSortedSetRevRangeWithScores('tags:topic:count', start, end, function(err, tags) { db.getSortedSetRevRangeWithScores('tags:topic:count', start, stop, function(err, tags) {
if (err) { if (err) {
return callback(err); return callback(err);
} }

@ -15,8 +15,8 @@ module.exports = function(User) {
} }
}; };
User.getIPs = function(uid, end, callback) { User.getIPs = function(uid, stop, callback) {
db.getSortedSetRevRange('uid:' + uid + ':ip', 0, end, function(err, ips) { db.getSortedSetRevRange('uid:' + uid + ':ip', 0, stop, function(err, ips) {
if(err) { if(err) {
return callback(err); return callback(err);
} }

@ -53,20 +53,20 @@ module.exports = function(User) {
}); });
} }
User.getFollowing = function(uid, start, end, callback) { User.getFollowing = function(uid, start, stop, callback) {
getFollow(uid, 'following:' + uid, start, end, callback); getFollow(uid, 'following:' + uid, start, stop, callback);
}; };
User.getFollowers = function(uid, start, end, callback) { User.getFollowers = function(uid, start, stop, callback) {
getFollow(uid, 'followers:' + uid, start, end, callback); getFollow(uid, 'followers:' + uid, start, stop, callback);
}; };
function getFollow(uid, set, start, end, callback) { function getFollow(uid, set, start, stop, callback) {
if (!parseInt(uid, 10)) { if (!parseInt(uid, 10)) {
return callback(null, []); return callback(null, []);
} }
db.getSortedSetRevRange(set, start, end, function(err, uids) { db.getSortedSetRevRange(set, start, stop, function(err, uids) {
if (err) { if (err) {
return callback(err); return callback(err);
} }

@ -59,14 +59,14 @@ module.exports = function(User) {
User.paginate = function(page, data) { User.paginate = function(page, data) {
var resultsPerPage = parseInt(meta.config.userSearchResultsPerPage, 10) || 20; var resultsPerPage = parseInt(meta.config.userSearchResultsPerPage, 10) || 20;
var start = Math.max(0, page - 1) * resultsPerPage; var start = Math.max(0, page - 1) * resultsPerPage;
var end = start + resultsPerPage; var stop = start + resultsPerPage;
var pageCount = Math.ceil(data.length / resultsPerPage); var pageCount = Math.ceil(data.length / resultsPerPage);
var currentPage = Math.max(1, Math.ceil((start + 1) / resultsPerPage)); var currentPage = Math.max(1, Math.ceil((start + 1) / resultsPerPage));
return { return {
pagination: pagination.create(currentPage, pageCount), pagination: pagination.create(currentPage, pageCount),
data: data.slice(start, end) data: data.slice(start, stop)
}; };
}; };

Loading…
Cancel
Save