From 8eab5ac402e35c9d77c10ef286fad2afdd3a62c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 28 May 2015 14:51:01 -0400 Subject: [PATCH] groups.get changes --- src/controllers/groups.js | 1 - src/groups.js | 160 ++++++++++------------------------ src/groups/membership.js | 11 ++- src/groups/ownership.js | 13 +-- src/socket.io/admin/groups.js | 3 +- 5 files changed, 66 insertions(+), 122 deletions(-) diff --git a/src/controllers/groups.js b/src/controllers/groups.js index 88562efc54..64858ac36b 100644 --- a/src/controllers/groups.js +++ b/src/controllers/groups.js @@ -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); }, diff --git a/src/groups.js b/src/groups.js index 202a4bdd92..e8beb2f002 100644 --- a/src/groups.js +++ b/src/groups.js @@ -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); }); diff --git a/src/groups/membership.js b/src/groups/membership.js index 451985e275..9a93e5faad 100644 --- a/src/groups/membership.js +++ b/src/groups/membership.js @@ -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); + }; }; diff --git a/src/groups/ownership.js b/src/groups/ownership.js index a6bb78e8e6..fa4beb70ba 100644 --- a/src/groups/ownership.js +++ b/src/groups/ownership.js @@ -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]]')); } diff --git a/src/socket.io/admin/groups.js b/src/socket.io/admin/groups.js index 7d31febc07..10917ad9c0 100644 --- a/src/socket.io/admin/groups.js +++ b/src/socket.io/admin/groups.js @@ -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); };