groups.get changes

v1.18.x
Barış Soner Uşaklı 10 years ago
parent 8726e2ccb6
commit 8eab5ac402

@ -63,7 +63,6 @@ groupsController.details = function(req, res, next) {
async.parallel({
group: function(next) {
groups.get(res.locals.groupName, {
expand: true,
uid: req.uid
}, next);
},

@ -100,120 +100,47 @@ var async = require('async'),
};
Groups.get = function(groupName, options, callback) {
var truncated = false,
numUsers;
if (!groupName) {
return callback(new Error('[[error:invalid-group]]'));
}
options.escape = options.hasOwnProperty('escape') ? options.escape : true;
async.parallel({
base: function (next) {
if (ephemeralGroups.indexOf(groupName) === -1) {
db.getObject('group:' + groupName, next);
} else {
next(null, internals.getEphemeralGroup(groupName));
}
},
users: function (next) {
db.getSortedSetRevRange('group:' + groupName + ':members', 0, -1, function (err, uids) {
if (err) {
return next(err);
}
uids = uids.filter(function(uid) {
return uid && parseInt(uid, 10);
});
if (options.truncateUserList) {
var userListCount = parseInt(options.userListCount, 10) || 4;
if (uids.length > userListCount) {
numUsers = uids.length;
uids.length = userListCount;
truncated = true;
}
}
if (options.expand) {
async.waterfall([
async.apply(user.getUsers, uids, options.uid || 0),
function(users, next) {
// Filter out non-matches
users = users.filter(Boolean);
async.mapLimit(users, 10, function(userObj, next) {
Groups.ownership.isOwner(userObj.uid, groupName, function(err, isOwner) {
if (err) {
winston.warn('[groups.get] Could not determine ownership in group `' + groupName + '` for uid `' + userObj.uid + '`: ' + err.message);
return next(null, userObj);
}
userObj.isOwner = isOwner;
next(null, userObj);
});
}, function(err, users) {
if (err) {
return next();
}
next(null, users.sort(function(a, b) {
if (a.isOwner === b.isOwner) {
return 0;
} else {
return a.isOwner && !b.isOwner ? -1 : 1;
}
}));
});
}
], next);
} else {
next(err, uids);
}
});
db.getObject('group:' + groupName, next);
},
pending: function (next) {
db.getSetMembers('group:' + groupName + ':pending', function (err, uids) {
if (err) {
return next(err);
owners: function (next) {
async.waterfall([
function(next) {
db.getSetMembers('group:' + groupName + ':owners', next);
},
function(uids, next) {
user.getUsers(uids, options.uid, next);
}
user.getUsersData(uids, next);
});
], next);
},
isMember: function(next) {
// Retrieve group membership state, if uid is passed in
if (!options.uid) {
return next();
members: function (next) {
var stop = -1;
if (options.truncateUserList) {
stop = (parseInt(options.userListCount, 10) || 4) - 1;
}
Groups.isMember(options.uid, groupName, function(err, isMember) {
if (err) {
winston.warn('[groups.get] Could not determine membership in group `' + groupName + '` for uid `' + options.uid + '`: ' + err.message);
return next();
}
next(null, isMember);
});
user.getUsersFromSet('group:' + groupName + ':members', options.uid, 0, stop, next);
},
isPending: function(next) {
// Retrieve group membership state, if uid is passed in
if (!options.uid) {
return next();
}
db.isSetMember('group:' + groupName + ':pending', options.uid, next);
pending: function (next) {
async.waterfall([
function(next) {
db.getSetMembers('group:' + groupName + ':pending', next);
},
function(uids, next) {
user.getUsersData(uids, next);
}
], next);
},
isMember: async.apply(Groups.isMember, options.uid, groupName),
isPending: async.apply(Groups.isPending, options.uid, groupName),
isInvited: async.apply(Groups.isInvited, options.uid, groupName),
isOwner: function(next) {
// Retrieve group ownership state, if uid is passed in
if (!options.uid) {
return next();
}
Groups.ownership.isOwner(options.uid, groupName, function(err, isOwner) {
if (err) {
winston.warn('[groups.get] Could not determine ownership in group `' + groupName + '` for uid `' + options.uid + '`: ' + err.message);
return next();
}
next(null, isOwner);
});
}
isOwner: async.apply(Groups.ownership.isOwner, options.uid, groupName)
}, function (err, results) {
if (err) {
return callback(err);
@ -227,31 +154,40 @@ var async = require('async'),
results.base['cover:position'] = '50% 50%';
}
var ownerUids = [];
results.owners.forEach(function(user) {
if (user) {
user.isOwner = true;
ownerUids.push(user.uid.toString());
}
});
results.members = results.members.filter(function(user, index, array) {
return user && user.uid && ownerUids.indexOf(user.uid.toString()) === -1;
});
results.members = results.owners.concat(results.members);
plugins.fireHook('filter:parse.raw', results.base.description, function(err, descriptionParsed) {
if (err) {
return callback(err);
}
results.base.name = !options.unescape ? validator.escape(results.base.name) : results.base.name;
results.base.description = !options.unescape ? validator.escape(results.base.description) : results.base.description;
results.base.name = options.escape ? validator.escape(results.base.name) : results.base.name;
results.base.description = options.escape ? validator.escape(results.base.description) : results.base.description;
results.base.descriptionParsed = descriptionParsed;
results.base.userTitle = !options.unescape ? validator.escape(results.base.userTitle) : results.base.userTitle;
results.base.userTitle = options.escape ? validator.escape(results.base.userTitle) : results.base.userTitle;
results.base.userTitleEnabled = results.base.userTitleEnabled ? !!parseInt(results.base.userTitleEnabled, 10) : true;
results.base.createtimeISO = utils.toISOString(results.base.createtime);
results.base.members = results.users.filter(Boolean);
results.base.members = results.members.filter(Boolean);
results.base.pending = results.pending.filter(Boolean);
results.base.count = numUsers || results.base.members.length;
results.base.memberCount = numUsers || results.base.members.length;
results.base.deleted = !!parseInt(results.base.deleted, 10);
results.base.hidden = !!parseInt(results.base.hidden, 10);
results.base.system = !!parseInt(results.base.system, 10);
results.base.private = results.base.private ? !!parseInt(results.base.private, 10) : true;
results.base.truncated = truncated;
results.base.isMember = results.isMember;
results.base.isPending = results.isPending;
results.base.isInvited = results.isInvited;
results.base.isOwner = results.isOwner;
plugins.fireHook('filter:group.get', {group: results.base}, function(err, data) {
callback(err, data ? data.group : null);
});

@ -323,7 +323,16 @@ module.exports = function(Groups) {
};
Groups.isInvited = function(uid, groupName, callback) {
if (!uid) { return callback(null, false); }
if (!uid) {
return callback(null, false);
}
db.isSetMember('group:' + groupName + ':invited', uid, callback);
};
Groups.isPending = function(uid, groupName, callback) {
if (!uid) {
return callback(null, false);
}
db.isSetMember('group:' + groupName + ':pending', uid, callback);
};
};

@ -1,18 +1,16 @@
'use strict';
var db = require('./../database');
var db = require('../database');
module.exports = function(Groups) {
Groups.ownership = {};
Groups.ownership.isOwner = function(uid, groupName, callback) {
// Note: All admins automatically become owners upon joining
if (Array.isArray(uid)) {
db.isSetMembers('group:' + groupName + ':owners', uid, callback);
} else {
db.isSetMember('group:' + groupName + ':owners', uid, callback);
if (!uid) {
return callback(null, false);
}
db.isSetMember('group:' + groupName + ':owners', uid, callback);
};
Groups.ownership.grant = function(toUid, groupName, callback) {
@ -25,6 +23,9 @@ module.exports = function(Groups) {
// If the owners set only contains one member, error out!
db.setCount('group:' + groupName + ':owners', function(err, numOwners) {
if (err) {
return callback(err);
}
if (numOwners <= 1) {
return callback(new Error('[[error:group-needs-owner]]'));
}

@ -17,8 +17,7 @@ Groups.create = function(socket, data, callback) {
Groups.get = function(socket, groupName, callback) {
groups.get(groupName, {
expand: true,
unescape: true,
escape: false,
uid: socket.uid
}, callback);
};

Loading…
Cancel
Save