From be657a76e0c54d6e6e2fcadfcfe4e9b064a1df72 Mon Sep 17 00:00:00 2001 From: Tyler Renelle Date: Tue, 29 Oct 2013 12:26:13 -0700 Subject: [PATCH] challenges: pass down if user is member of group (group._isMember) for performance. some bug fixes --- public/js/app.js | 2 +- public/js/controllers/rootCtrl.js | 2 +- src/controllers/groups.js | 17 ++++++++++++++--- src/models/group.js | 1 + views/options/groups/index.jade | 6 +++--- 5 files changed, 20 insertions(+), 8 deletions(-) diff --git a/public/js/app.js b/public/js/app.js index 9c38ba99dd..aa7f899e8d 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -77,7 +77,7 @@ window.habitrpg = angular.module('habitrpg', controller: 'PartyCtrl' }) .state('options.groups.guilds', { - url: '/party', + url: '/guilds', templateUrl: "partials/options.groups.guilds.html", controller: 'GuildsCtrl' }) diff --git a/public/js/controllers/rootCtrl.js b/public/js/controllers/rootCtrl.js index 3c4658d764..7c18fb7386 100644 --- a/public/js/controllers/rootCtrl.js +++ b/public/js/controllers/rootCtrl.js @@ -18,7 +18,7 @@ habitrpg.controller("RootCtrl", ['$scope', '$rootScope', '$location', 'User', '$ // indexOf helper $scope.indexOf = function(haystack, needle){ - return ~haystack.indexOf(needle); + return haystack && ~haystack.indexOf(needle); } $scope.safeApply = function(fn) { diff --git a/src/controllers/groups.js b/src/controllers/groups.js index 65bce46e4d..35383ed053 100644 --- a/src/controllers/groups.js +++ b/src/controllers/groups.js @@ -52,7 +52,6 @@ api.getGroups = function(req, res, next) { var fields = req.query.fields && req.query.fields.replace(/\,/g, ' ') var challengeFields = 'name description'; // public challenge fields, request specific challenge for more details - // First get all groups async.parallel({ party: function(cb) { @@ -64,6 +63,8 @@ api.getGroups = function(req, res, next) { query.populate('members', sanitizeMemberFields(req.query['fields.members'], partyFields)); if (~fields.indexOf('challenges')) query.populate('challenges', challengeFields); + } else { + query.populate('members', partyFields); } query.exec(function(err, group){ if (err) return cb(err); @@ -82,6 +83,8 @@ api.getGroups = function(req, res, next) { query.populate('members', sanitizeMemberFields(req.query['fields.members'], 'profile.name')); if (~fields.indexOf('challenges')) query.populate('challenges', challengeFields); + } else { + query.populate('members', 'profile.name'); } query.exec(cb); }, @@ -100,9 +103,17 @@ api.getGroups = function(req, res, next) { "public": function(cb) { if (type && !~type.indexOf('public')) return cb(null, []); Group.find({privacy: 'public'}) - .select('name description memberCount') + .select('name description memberCount members') .sort('-memberCount') - .exec(cb); + .exec(function(err, groups){ + if (err) return cb(err); + _.each(groups, function(g){ + // To save some client-side performance, don't send down the full members arr, just send down temp var _isMember + if (~g.members.indexOf(user._id)) g._isMember = true; + g.members = undefined; + }); + cb(null, groups); + }); } }, function(err, results){ diff --git a/src/models/group.js b/src/models/group.js index c297f31acc..0313a017b2 100644 --- a/src/models/group.js +++ b/src/models/group.js @@ -69,6 +69,7 @@ GroupSchema.pre('save', function(next){ GroupSchema.methods.toJSON = function(){ var doc = this.toObject(); removeDuplicates(doc); + doc._isMember = this._isMember; return doc; } diff --git a/views/options/groups/index.jade b/views/options/groups/index.jade index 6481d5e79f..0bd8241630 100644 --- a/views/options/groups/index.jade +++ b/views/options/groups/index.jade @@ -44,13 +44,13 @@ script(type='text/ng-template', id='partials/options.groups.guilds.html') tr(ng-repeat='group in groups.public | filter:guildSearch') td ul.pull-right.challenge-accordion-header-specs - li {{group.members.length}} member(s) + li {{group.memberCount}} member(s) li // join / leave - a.btn.btn-small.btn-danger(ng-show='isMember(user, group)', ng-click='leave(group)') + a.btn.btn-small.btn-danger(ng-show='group_.isMember', ng-click='leave(group)') i.icon-ban-circle | Leave - a.btn.btn-small.btn-success(ng-hide='isMember(user, group)', ng-click='join(group)') + a.btn.btn-small.btn-success(ng-hide='group._isMember', ng-click='join(group)') i.icon-ok | Join h4 {{group.name}}