mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-10-28 17:46:16 +01:00
closes #2594
This commit is contained in:
@@ -1,9 +1,43 @@
|
||||
define('forum/account/followers', ['forum/account/header'], function(header) {
|
||||
'use strict';
|
||||
|
||||
/* globals define, socket, utils */
|
||||
|
||||
define('forum/account/followers', ['forum/account/header', 'forum/infinitescroll'], function(header, infinitescroll) {
|
||||
var Followers = {};
|
||||
|
||||
Followers.init = function() {
|
||||
header.init();
|
||||
|
||||
infinitescroll.init(function(direction) {
|
||||
Followers.loadMore(direction, 'account/followers', 'followers:' + $('.account-username-box').attr('data-uid'));
|
||||
});
|
||||
};
|
||||
|
||||
Followers.loadMore = function(direction, tpl, set) {
|
||||
if (direction < 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
infinitescroll.loadMore('user.loadMore', {
|
||||
set: set,
|
||||
after: $('#users-container').attr('data-nextstart')
|
||||
}, function(data, done) {
|
||||
if (data.users && data.users.length) {
|
||||
onUsersLoaded(tpl, data.users, done);
|
||||
$('#users-container').attr('data-nextstart', data.nextStart);
|
||||
} else {
|
||||
done();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
function onUsersLoaded(tpl, users, callback) {
|
||||
infinitescroll.parseAndTranslate(tpl, 'users', {users: users}, function(html) {
|
||||
$('#users-container').append(html);
|
||||
utils.addCommasToNumbers(html.find('.formatted-number'));
|
||||
callback();
|
||||
});
|
||||
}
|
||||
|
||||
return Followers;
|
||||
});
|
||||
|
||||
@@ -1,8 +1,16 @@
|
||||
define('forum/account/following', ['forum/account/header'], function(header) {
|
||||
'use strict';
|
||||
|
||||
/* globals define */
|
||||
|
||||
define('forum/account/following', ['forum/account/header', 'forum/infinitescroll', 'forum/account/followers'], function(header, infinitescroll, followers) {
|
||||
var Following = {};
|
||||
|
||||
Following.init = function() {
|
||||
header.init();
|
||||
|
||||
infinitescroll.init(function(direction) {
|
||||
followers.loadMore(direction, 'account/following', 'following:' + $('.account-username-box').attr('data-uid'));
|
||||
});
|
||||
};
|
||||
|
||||
return Following;
|
||||
|
||||
@@ -45,9 +45,6 @@ function getUserDataByUserSlug(userslug, callerUID, callback) {
|
||||
isAdmin : function(next) {
|
||||
user.isAdministrator(callerUID, next);
|
||||
},
|
||||
followStats: function(next) {
|
||||
user.getFollowStats(uid, next);
|
||||
},
|
||||
ips: function(next) {
|
||||
user.getIPs(uid, 4, next);
|
||||
},
|
||||
@@ -97,8 +94,8 @@ function getUserDataByUserSlug(userslug, callerUID, callback) {
|
||||
userData.status = websockets.isUserOnline(userData.uid) ? (userData.status || 'online') : 'offline';
|
||||
userData.banned = parseInt(userData.banned, 10) === 1;
|
||||
userData.websiteName = userData.website.replace(validator.escape('http://'), '').replace(validator.escape('https://'), '');
|
||||
userData.followingCount = results.followStats.followingCount;
|
||||
userData.followerCount = results.followStats.followerCount;
|
||||
userData.followingCount = parseInt(userData.followingCount, 10) || 0;
|
||||
userData.followerCount = parseInt(userData.followerCount, 10) || 0;
|
||||
|
||||
callback(null, userData);
|
||||
});
|
||||
@@ -206,14 +203,15 @@ function getFollow(tpl, name, req, res, next) {
|
||||
return helpers.notFound(req, res);
|
||||
}
|
||||
var method = name === 'following' ? 'getFollowing' : 'getFollowers';
|
||||
user[method](userData.uid, next);
|
||||
user[method](userData.uid, 0, 49, next);
|
||||
}
|
||||
], function(err, users) {
|
||||
if(err) {
|
||||
return next(err);
|
||||
}
|
||||
userData[name] = users;
|
||||
userData[name + 'Count'] = users.length;
|
||||
|
||||
userData.users = users;
|
||||
userData.nextStart = 50;
|
||||
|
||||
res.render(tpl, userData);
|
||||
});
|
||||
|
||||
@@ -329,27 +329,28 @@ SocketUser.loadMore = function(socket, data, callback) {
|
||||
return callback(new Error('[[error:no-privileges]]'));
|
||||
}
|
||||
|
||||
var start = data.after,
|
||||
var start = parseInt(data.after, 10),
|
||||
end = start + 19;
|
||||
|
||||
user.getUsersFromSet(data.set, start, end, function(err, userData) {
|
||||
if(err) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
user.isAdministrator(socket.uid, function (err, isAdministrator) {
|
||||
if(err) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
if(!isAdministrator && data.set === 'users:online') {
|
||||
if (!isAdministrator && data.set === 'users:online') {
|
||||
userData = userData.filter(function(item) {
|
||||
return item.status !== 'offline';
|
||||
});
|
||||
}
|
||||
|
||||
callback(null, {
|
||||
users: userData
|
||||
users: userData,
|
||||
nextStart: end + 1
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -21,7 +21,7 @@ var db = require('./database'),
|
||||
schemaDate, thisSchemaDate,
|
||||
|
||||
// IMPORTANT: REMEMBER TO UPDATE VALUE OF latestSchema
|
||||
latestSchema = Date.UTC(2015, 0, 13);
|
||||
latestSchema = Date.UTC(2015, 0, 14);
|
||||
|
||||
Upgrade.check = function(callback) {
|
||||
db.get('schemaDate', function(err, value) {
|
||||
@@ -566,6 +566,70 @@ Upgrade.upgrade = function(callback) {
|
||||
winston.info('[2015/01/13] Creating uid:followed_tids sorted set skipped');
|
||||
next();
|
||||
}
|
||||
},
|
||||
function(next) {
|
||||
thisSchemaDate = Date.UTC(2015, 0, 14);
|
||||
if (schemaDate < thisSchemaDate) {
|
||||
winston.info('[2015/01/14] Upgrading follow sets to sorted sets');
|
||||
|
||||
db.getSortedSetRange('users:joindate', 0, -1, function(err, uids) {
|
||||
if (err) {
|
||||
winston.error('[2014/01/14] Error encountered while Upgrading follow sets to sorted sets');
|
||||
return next(err);
|
||||
}
|
||||
|
||||
var now = Date.now();
|
||||
|
||||
async.eachLimit(uids, 50, function(uid, next) {
|
||||
async.parallel({
|
||||
following: function(next) {
|
||||
db.getSetMembers('following:' + uid, next);
|
||||
},
|
||||
followers: function(next) {
|
||||
db.getSetMembers('followers:' + uid, next);
|
||||
}
|
||||
}, function(err, results) {
|
||||
function updateToSortedSet(set, uids, callback) {
|
||||
async.eachLimit(uids, 50, function(uid, next) {
|
||||
if (parseInt(uid, 10)) {
|
||||
db.sortedSetAdd(set, now, uid, next);
|
||||
} else {
|
||||
next();
|
||||
}
|
||||
}, callback);
|
||||
}
|
||||
if (err) {
|
||||
return next(err);
|
||||
}
|
||||
|
||||
async.parallel([
|
||||
async.apply(db.delete, 'following:' + uid),
|
||||
async.apply(db.delete, 'followers:' + uid)
|
||||
], function(err) {
|
||||
if (err) {
|
||||
return next(err);
|
||||
}
|
||||
async.parallel([
|
||||
async.apply(updateToSortedSet, 'following:' + uid, results.following),
|
||||
async.apply(updateToSortedSet, 'followers:' + uid, results.followers),
|
||||
async.apply(db.setObjectField, 'user:' + uid, 'followingCount', results.following.length),
|
||||
async.apply(db.setObjectField, 'user:' + uid, 'followerCount', results.followers.length),
|
||||
], next);
|
||||
});
|
||||
});
|
||||
}, function(err) {
|
||||
if (err) {
|
||||
winston.error('[2015/01/14] Error encountered while Upgrading follow sets to sorted sets');
|
||||
return next(err);
|
||||
}
|
||||
winston.info('[2015/01/14] Upgrading follow sets to sorted sets done');
|
||||
Upgrade.update(thisSchemaDate, next);
|
||||
});
|
||||
});
|
||||
} else {
|
||||
winston.info('[2015/01/14] Upgrading follow sets to sorted sets skipped');
|
||||
next();
|
||||
}
|
||||
}
|
||||
|
||||
// Add new schema updates here
|
||||
|
||||
@@ -23,29 +23,40 @@ module.exports = function(User) {
|
||||
return callback(new Error('[[error:you-cant-follow-yourself]]'));
|
||||
}
|
||||
|
||||
var command = type === 'follow' ? 'setAdd' : 'setRemove';
|
||||
db[command]('following:' + uid, theiruid, function(err) {
|
||||
if(err) {
|
||||
return callback(err);
|
||||
}
|
||||
db[command]('followers:' + theiruid, uid, callback);
|
||||
});
|
||||
var now = Date.now();
|
||||
|
||||
if (type === 'follow') {
|
||||
async.parallel([
|
||||
async.apply(db.sortedSetAdd, 'following:' + uid, now, theiruid),
|
||||
async.apply(db.sortedSetAdd, 'followers:' + theiruid, now, uid),
|
||||
async.apply(User.incrementUserFieldBy, uid, 'followingCount', 1),
|
||||
async.apply(User.incrementUserFieldBy, theiruid, 'followerCount', 1)
|
||||
], callback);
|
||||
|
||||
} else {
|
||||
async.parallel([
|
||||
async.apply(db.sortedSetRemove, 'following:' + uid, theiruid),
|
||||
async.apply(db.sortedSetRemove, 'followers:' + theiruid, uid),
|
||||
async.apply(User.decrementUserFieldBy, uid, 'followingCount', 1),
|
||||
async.apply(User.decrementUserFieldBy, theiruid, 'followerCount', 1)
|
||||
], callback);
|
||||
}
|
||||
}
|
||||
|
||||
User.getFollowing = function(uid, callback) {
|
||||
getFollow(uid, 'following:' + uid, callback);
|
||||
User.getFollowing = function(uid, start, end, callback) {
|
||||
getFollow(uid, 'following:' + uid, start, end, callback);
|
||||
};
|
||||
|
||||
User.getFollowers = function(uid, callback) {
|
||||
getFollow(uid, 'followers:' + uid, callback);
|
||||
User.getFollowers = function(uid, start, end, callback) {
|
||||
getFollow(uid, 'followers:' + uid, start, end, callback);
|
||||
};
|
||||
|
||||
function getFollow(uid, set, callback) {
|
||||
function getFollow(uid, set, start, end, callback) {
|
||||
if (!parseInt(uid, 10)) {
|
||||
return callback(null, []);
|
||||
}
|
||||
|
||||
db.getSetMembers(set, function(err, uids) {
|
||||
db.getSortedSetRevRange(set, start, end, function(err, uids) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
@@ -54,36 +65,11 @@ module.exports = function(User) {
|
||||
});
|
||||
}
|
||||
|
||||
User.getFollowingCount = function(uid, callback) {
|
||||
if (!parseInt(uid, 10)) {
|
||||
return callback(null, 0);
|
||||
}
|
||||
db.setCount('following:' + uid, callback);
|
||||
};
|
||||
|
||||
User.getFollowerCount = function(uid, callback) {
|
||||
if (!parseInt(uid, 10)) {
|
||||
return callback(null, 0);
|
||||
}
|
||||
db.setCount('followers:' + uid, callback);
|
||||
};
|
||||
|
||||
User.getFollowStats = function (uid, callback) {
|
||||
async.parallel({
|
||||
followingCount: function(next) {
|
||||
User.getFollowingCount(uid, next);
|
||||
},
|
||||
followerCount : function(next) {
|
||||
User.getFollowerCount(uid, next);
|
||||
}
|
||||
}, callback);
|
||||
};
|
||||
|
||||
User.isFollowing = function(uid, theirid, callback) {
|
||||
if (!parseInt(uid, 10) || !parseInt(theirid, 10)) {
|
||||
return callback(null, false);
|
||||
}
|
||||
db.isSetMember('following:' + uid, theirid, callback);
|
||||
db.isSortedSetMember('following:' + uid, theirid, callback);
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user