mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-11-12 08:55:47 +01:00
store group member count in group hash
yet another upgrade script
This commit is contained in:
142
src/groups.js
142
src/groups.js
@@ -299,7 +299,7 @@ var async = require('async'),
|
|||||||
};
|
};
|
||||||
|
|
||||||
Groups.getMemberCount = function(groupName, callback) {
|
Groups.getMemberCount = function(groupName, callback) {
|
||||||
db.sortedSetCard('group:' + groupName + ':members', callback);
|
db.getObjectField('group:' + groupName, 'memberCount', callback);
|
||||||
};
|
};
|
||||||
|
|
||||||
Groups.isMemberOfGroupList = function(uid, groupListKey, callback) {
|
Groups.isMemberOfGroupList = function(uid, groupListKey, callback) {
|
||||||
@@ -611,46 +611,56 @@ var async = require('async'),
|
|||||||
};
|
};
|
||||||
|
|
||||||
Groups.join = function(groupName, uid, callback) {
|
Groups.join = function(groupName, uid, callback) {
|
||||||
callback = callback || function() {};
|
function join() {
|
||||||
|
var tasks = [
|
||||||
|
async.apply(db.sortedSetAdd, 'group:' + groupName + ':members', Date.now(), uid),
|
||||||
|
async.apply(db.incrObjectField, 'group:' + groupName, 'memberCount')
|
||||||
|
];
|
||||||
|
|
||||||
Groups.exists(groupName, function(err, exists) {
|
async.waterfall([
|
||||||
if (exists) {
|
function(next) {
|
||||||
var tasks = [
|
user.isAdministrator(uid, next);
|
||||||
async.apply(db.sortedSetAdd, 'group:' + groupName + ':members', Date.now(), uid)
|
},
|
||||||
];
|
function(isAdmin, next) {
|
||||||
|
|
||||||
user.isAdministrator(uid, function(err, isAdmin) {
|
|
||||||
if (isAdmin) {
|
if (isAdmin) {
|
||||||
tasks.push(async.apply(db.setAdd, 'group:' + groupName + ':owners', uid));
|
tasks.push(async.apply(db.setAdd, 'group:' + groupName + ':owners', uid));
|
||||||
}
|
}
|
||||||
|
async.parallel(tasks, next);
|
||||||
async.parallel(tasks, function(err) {
|
}
|
||||||
plugins.fireHook('action:group.join', {
|
], function(err, results) {
|
||||||
groupName: groupName,
|
if (err) {
|
||||||
uid: uid
|
return callback(err);
|
||||||
});
|
}
|
||||||
|
plugins.fireHook('action:group.join', {
|
||||||
callback();
|
groupName: groupName,
|
||||||
});
|
uid: uid
|
||||||
});
|
});
|
||||||
} else {
|
callback();
|
||||||
Groups.create({
|
});
|
||||||
name: groupName,
|
}
|
||||||
description: '',
|
|
||||||
hidden: 1
|
|
||||||
}, function(err) {
|
|
||||||
if (err && err.message !== '[[error:group-already-exists]]') {
|
|
||||||
winston.error('[groups.join] Could not create new hidden group: ' + err.message);
|
|
||||||
return callback(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
db.sortedSetAdd('group:' + groupName + ':members', Date.now(), uid, callback);
|
callback = callback || function() {};
|
||||||
plugins.fireHook('action:group.join', {
|
|
||||||
groupName: groupName,
|
Groups.exists(groupName, function(err, exists) {
|
||||||
uid: uid
|
if (err) {
|
||||||
});
|
return callback(err);
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (exists) {
|
||||||
|
return join();
|
||||||
|
}
|
||||||
|
|
||||||
|
Groups.create({
|
||||||
|
name: groupName,
|
||||||
|
description: '',
|
||||||
|
hidden: 1
|
||||||
|
}, function(err) {
|
||||||
|
if (err && err.message !== '[[error:group-already-exists]]') {
|
||||||
|
winston.error('[groups.join] Could not create new hidden group: ' + err.message);
|
||||||
|
return callback(err);
|
||||||
|
}
|
||||||
|
join();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -692,9 +702,10 @@ var async = require('async'),
|
|||||||
callback = callback || function() {};
|
callback = callback || function() {};
|
||||||
|
|
||||||
var tasks = [
|
var tasks = [
|
||||||
async.apply(db.sortedSetRemove, 'group:' + groupName + ':members', uid),
|
async.apply(db.sortedSetRemove, 'group:' + groupName + ':members', uid),
|
||||||
async.apply(db.setRemove, 'group:' + groupName + ':owners', uid)
|
async.apply(db.setRemove, 'group:' + groupName + ':owners', uid),
|
||||||
];
|
async.apply(db.decrObjectField, 'group:' + groupName, 'memberCount')
|
||||||
|
];
|
||||||
|
|
||||||
async.parallel(tasks, function(err) {
|
async.parallel(tasks, function(err) {
|
||||||
if (err) {
|
if (err) {
|
||||||
@@ -715,7 +726,7 @@ var async = require('async'),
|
|||||||
if (group.hidden && group.memberCount === 0) {
|
if (group.hidden && group.memberCount === 0) {
|
||||||
Groups.destroy(groupName, callback);
|
Groups.destroy(groupName, callback);
|
||||||
} else {
|
} else {
|
||||||
return callback();
|
callback();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -781,51 +792,36 @@ var async = require('async'),
|
|||||||
|
|
||||||
groupData = groupData.filter(function(group) {
|
groupData = groupData.filter(function(group) {
|
||||||
return parseInt(group.hidden, 10) !== 1 && !!group.userTitle;
|
return parseInt(group.hidden, 10) !== 1 && !!group.userTitle;
|
||||||
}).map(function(group) {
|
|
||||||
group.createtimeISO = utils.toISOString(group.createtime);
|
|
||||||
return group;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
async.map(groupData, function(groupObj, next) {
|
var groupSets = groupData.map(function(group) {
|
||||||
Groups.getMemberCount(groupObj.name, function(err, memberCount) {
|
group.labelColor = group.labelColor || '#000000';
|
||||||
if (err) { return next(err); }
|
group.createtimeISO = utils.toISOString(group.createtime);
|
||||||
|
|
||||||
groupObj.memberCount = memberCount;
|
if (!group['cover:url']) {
|
||||||
next(err, groupObj);
|
group['cover:url'] = nconf.get('relative_path') + '/images/cover-default.png';
|
||||||
});
|
group['cover:position'] = '50% 50%';
|
||||||
}, function(err, groupData) {
|
|
||||||
if (err) {
|
|
||||||
return callback(err);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var groupSets = groupData.map(function(group) {
|
return 'group:' + group.name + ':members';
|
||||||
group.labelColor = group.labelColor || '#000000';
|
});
|
||||||
|
|
||||||
if (!group['cover:url']) {
|
async.map(uids, function(uid, next) {
|
||||||
group['cover:url'] = nconf.get('relative_path') + '/images/cover-default.png';
|
db.isMemberOfSortedSets(groupSets, uid, function(err, isMembers) {
|
||||||
group['cover:position'] = '50% 50%';
|
if (err) {
|
||||||
|
return next(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 'group:' + group.name + ':members';
|
var memberOf = [];
|
||||||
});
|
isMembers.forEach(function(isMember, index) {
|
||||||
|
if (isMember) {
|
||||||
async.map(uids, function(uid, next) {
|
memberOf.push(groupData[index]);
|
||||||
db.isMemberOfSortedSets(groupSets, uid, function(err, isMembers) {
|
|
||||||
if (err) {
|
|
||||||
return next(err);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var memberOf = [];
|
|
||||||
isMembers.forEach(function(isMember, index) {
|
|
||||||
if (isMember) {
|
|
||||||
memberOf.push(groupData[index]);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
next(null, memberOf);
|
|
||||||
});
|
});
|
||||||
}, callback);
|
|
||||||
});
|
next(null, memberOf);
|
||||||
|
});
|
||||||
|
}, callback);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ var db = require('./database'),
|
|||||||
schemaDate, thisSchemaDate,
|
schemaDate, thisSchemaDate,
|
||||||
|
|
||||||
// IMPORTANT: REMEMBER TO UPDATE VALUE OF latestSchema
|
// IMPORTANT: REMEMBER TO UPDATE VALUE OF latestSchema
|
||||||
latestSchema = Date.UTC(2015, 0, 21);
|
latestSchema = Date.UTC(2015, 0, 30);
|
||||||
|
|
||||||
Upgrade.check = function(callback) {
|
Upgrade.check = function(callback) {
|
||||||
db.get('schemaDate', function(err, value) {
|
db.get('schemaDate', function(err, value) {
|
||||||
@@ -773,6 +773,41 @@ Upgrade.upgrade = function(callback) {
|
|||||||
winston.info('[2015/01/21] Upgrading groups to sorted set skipped');
|
winston.info('[2015/01/21] Upgrading groups to sorted set skipped');
|
||||||
next();
|
next();
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
function(next) {
|
||||||
|
thisSchemaDate = Date.UTC(2015, 0, 30);
|
||||||
|
if (schemaDate < thisSchemaDate) {
|
||||||
|
updatesMade = true;
|
||||||
|
winston.info('[2015/01/30] Adding group member counts');
|
||||||
|
|
||||||
|
db.getSortedSetRange('groups:createtime', 0, -1, function(err, groupNames) {
|
||||||
|
if (err) {
|
||||||
|
return next(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
var now = Date.now();
|
||||||
|
async.each(groupNames, function(groupName, next) {
|
||||||
|
db.sortedSetCard('group:' + groupName + ':members', function(err, memberCount) {
|
||||||
|
console.log(groupName, memberCount);
|
||||||
|
if (err) {
|
||||||
|
return next(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parseInt(memberCount, 10)) {
|
||||||
|
db.setObjectField('group:' + groupName, 'memberCount', memberCount, next);
|
||||||
|
} else {
|
||||||
|
next();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}, function(err) {
|
||||||
|
winston.info('[2015/01/30] Adding group member counts done');
|
||||||
|
Upgrade.update(thisSchemaDate, next);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
winston.info('[2015/01/30] Adding group member counts skipped');
|
||||||
|
next();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add new schema updates here
|
// Add new schema updates here
|
||||||
|
|||||||
Reference in New Issue
Block a user