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({ async.parallel({
group: function(next) { group: function(next) {
groups.get(res.locals.groupName, { groups.get(res.locals.groupName, {
expand: true,
uid: req.uid uid: req.uid
}, next); }, next);
}, },

@ -100,120 +100,47 @@ var async = require('async'),
}; };
Groups.get = function(groupName, options, callback) { Groups.get = function(groupName, options, callback) {
var truncated = false, if (!groupName) {
numUsers; return callback(new Error('[[error:invalid-group]]'));
}
options.escape = options.hasOwnProperty('escape') ? options.escape : true;
async.parallel({ async.parallel({
base: function (next) { base: function (next) {
if (ephemeralGroups.indexOf(groupName) === -1) { db.getObject('group:' + groupName, next);
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);
}
});
}, },
pending: function (next) { owners: function (next) {
db.getSetMembers('group:' + groupName + ':pending', function (err, uids) { async.waterfall([
if (err) { function(next) {
return next(err); db.getSetMembers('group:' + groupName + ':owners', next);
},
function(uids, next) {
user.getUsers(uids, options.uid, next);
} }
user.getUsersData(uids, next); ], next);
});
}, },
isMember: function(next) { members: function (next) {
// Retrieve group membership state, if uid is passed in var stop = -1;
if (!options.uid) { if (options.truncateUserList) {
return next(); stop = (parseInt(options.userListCount, 10) || 4) - 1;
} }
user.getUsersFromSet('group:' + groupName + ':members', options.uid, 0, stop, next);
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);
});
}, },
isPending: function(next) { pending: function (next) {
// Retrieve group membership state, if uid is passed in async.waterfall([
if (!options.uid) { function(next) {
return next(); db.getSetMembers('group:' + groupName + ':pending', next);
} },
function(uids, next) {
db.isSetMember('group:' + groupName + ':pending', options.uid, 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), isInvited: async.apply(Groups.isInvited, options.uid, groupName),
isOwner: function(next) { isOwner: async.apply(Groups.ownership.isOwner, options.uid, groupName)
// 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);
});
}
}, function (err, results) { }, function (err, results) {
if (err) { if (err) {
return callback(err); return callback(err);
@ -227,31 +154,40 @@ var async = require('async'),
results.base['cover:position'] = '50% 50%'; 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) { plugins.fireHook('filter:parse.raw', results.base.description, function(err, descriptionParsed) {
if (err) { if (err) {
return callback(err); return callback(err);
} }
results.base.name = !options.unescape ? validator.escape(results.base.name) : results.base.name; results.base.name = options.escape ? validator.escape(results.base.name) : results.base.name;
results.base.description = !options.unescape ? validator.escape(results.base.description) : results.base.description; results.base.description = options.escape ? validator.escape(results.base.description) : results.base.description;
results.base.descriptionParsed = descriptionParsed; 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.userTitleEnabled = results.base.userTitleEnabled ? !!parseInt(results.base.userTitleEnabled, 10) : true;
results.base.createtimeISO = utils.toISOString(results.base.createtime); 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.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.deleted = !!parseInt(results.base.deleted, 10);
results.base.hidden = !!parseInt(results.base.hidden, 10); results.base.hidden = !!parseInt(results.base.hidden, 10);
results.base.system = !!parseInt(results.base.system, 10); results.base.system = !!parseInt(results.base.system, 10);
results.base.private = results.base.private ? !!parseInt(results.base.private, 10) : true; results.base.private = results.base.private ? !!parseInt(results.base.private, 10) : true;
results.base.truncated = truncated;
results.base.isMember = results.isMember; results.base.isMember = results.isMember;
results.base.isPending = results.isPending; results.base.isPending = results.isPending;
results.base.isInvited = results.isInvited; results.base.isInvited = results.isInvited;
results.base.isOwner = results.isOwner; results.base.isOwner = results.isOwner;
plugins.fireHook('filter:group.get', {group: results.base}, function(err, data) { plugins.fireHook('filter:group.get', {group: results.base}, function(err, data) {
callback(err, data ? data.group : null); callback(err, data ? data.group : null);
}); });

@ -323,7 +323,16 @@ module.exports = function(Groups) {
}; };
Groups.isInvited = function(uid, groupName, callback) { 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); 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'; 'use strict';
var db = require('./../database'); var db = require('../database');
module.exports = function(Groups) { module.exports = function(Groups) {
Groups.ownership = {}; Groups.ownership = {};
Groups.ownership.isOwner = function(uid, groupName, callback) { Groups.ownership.isOwner = function(uid, groupName, callback) {
// Note: All admins automatically become owners upon joining if (!uid) {
if (Array.isArray(uid)) { return callback(null, false);
db.isSetMembers('group:' + groupName + ':owners', uid, callback);
} else {
db.isSetMember('group:' + groupName + ':owners', uid, callback);
} }
db.isSetMember('group:' + groupName + ':owners', uid, callback);
}; };
Groups.ownership.grant = function(toUid, groupName, 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! // If the owners set only contains one member, error out!
db.setCount('group:' + groupName + ':owners', function(err, numOwners) { db.setCount('group:' + groupName + ':owners', function(err, numOwners) {
if (err) {
return callback(err);
}
if (numOwners <= 1) { if (numOwners <= 1) {
return callback(new Error('[[error:group-needs-owner]]')); 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 = function(socket, groupName, callback) {
groups.get(groupName, { groups.get(groupName, {
expand: true, escape: false,
unescape: true,
uid: socket.uid uid: socket.uid
}, callback); }, callback);
}; };

Loading…
Cancel
Save