challenges: fixed joining / leaving groups. Back to the old method of Group.query({type:'public'}), etc - since ngResource can only work with top-level objects. This approach is bad performance (two calls), I'll fix when I can think of a better way of organizing groups requested at GET /groups

This commit is contained in:
Tyler Renelle 2013-10-30 14:34:59 -07:00
parent da7ab9f1c3
commit 28cdeb0ac6
4 changed files with 39 additions and 22 deletions

View file

@ -1,7 +1,7 @@
"use strict";
habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Groups', '$http', 'API_URL', '$q', 'User', 'Members', '$location', '$state',
function($scope, $rootScope, Groups, $http, API_URL, $q, User, Members, $location, $state) {
habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Groups', '$http', 'API_URL', '$q', 'User', 'Members', '$state',
function($scope, $rootScope, Groups, $http, API_URL, $q, User, Members, $state) {
$scope.isMember = function(user, group){
return ~(group.members.indexOf(user._id));
@ -126,8 +126,8 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Groups', '$http', 'A
}])
.controller("GuildsCtrl", ['$scope', 'Groups', 'User', '$rootScope',
function($scope, Groups, User, $rootScope) {
.controller("GuildsCtrl", ['$scope', 'Groups', 'User', '$rootScope', '$state', '$location',
function($scope, Groups, User, $rootScope, $state, $location) {
Groups.fetchGuilds();
$scope.type = 'guild';
$scope.text = 'Guild';
@ -137,8 +137,8 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Groups', '$http', 'A
if (User.user.balance < 1) return $rootScope.modals.buyGems = true;
if (confirm("Create Guild for 4 Gems?")) {
group.$save(function(){
location.reload();
group.$save(function(saved){
location.href = '/#/options/groups/guilds/' + saved._id;
});
}
}
@ -151,9 +151,9 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Groups', '$http', 'A
group = new Groups.Group({_id:group.id});
}
group.$join(function(saved){
//$scope.groups.guilds.push(saved);
alert('Joined guild, refresh page to see changes')
group.$join(function(){
// use https://github.com/angular-ui/ui-router/issues/76 when it's available
location.reload();
})
}
@ -161,10 +161,10 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Groups', '$http', 'A
if (confirm("Are you sure you want to leave this guild?") !== true) {
return;
}
group.$leave();
// var i = _.find($scope.groups.guilds, {_id:group._id});
// if (~i) $scope.groups.guilds.splice(i, 1);
alert('Left guild, refresh page to see changes')
group.$leave(function(){
// use https://github.com/angular-ui/ui-router/issues/76 when it's available
location.reload();
});
}
$scope.reject = function(guild){
@ -201,7 +201,8 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Groups', '$http', 'A
return;
}
group.$leave(function(){
Groups.groups.party = new Groups.Group();
//Groups.groups.party = new Groups.Group();
location.reload();
});
}
$scope.reject = function(){

View file

@ -10,7 +10,7 @@ angular.module('groupServices', ['ngResource']).
var Group = $resource(API_URL + '/api/v1/groups/:gid',
{gid:'@_id', messageId: '@_messageId'},
{
query: {method: "GET", isArray:false},
//query: {method: "GET", isArray:false},
postChat: {method: "POST", url: API_URL + '/api/v1/groups/:gid/chat'},
deleteChatMessage: {method: "DELETE", url: API_URL + '/api/v1/groups/:gid/chat/:messageId'},
join: {method: "POST", url: API_URL + '/api/v1/groups/:gid/join'},
@ -39,14 +39,17 @@ angular.module('groupServices', ['ngResource']).
})
return {
// Note the _.once() to make sure it can never be called again
fetchGuilds: _.once(function(){
Group.query(function(_groups){
guildsQ.resolve(_groups.guilds);
Members.populate(_groups.guilds);
publicQ.resolve(_groups['public']);
Members.populate(_groups['public']);
})
Group.query({type:'guilds'}, function(_groups){
guildsQ.resolve(_groups);
Members.populate(_groups);
});
Group.query({type:'public'}, function(_groups){
publicQ.resolve(_groups);
Members.populate(_groups);
});
}),
fetchTavern: _.once(function(){

View file

@ -41,11 +41,13 @@ api.list = function(req, res) {
var user = res.locals.user;
var groupFields = 'name description memberCount';
var sort = '-memberCount';
var type = (req.query.type || 'party,guilds,public,tavern').split(',');
async.parallel({
// unecessary given our ui-router setup
party: function(cb){
if (!~type.indexOf('party')) return cb(null, {});
Group.findOne({type: 'party', members: {'$in': [user._id]}})
.select(groupFields).exec(function(err, party){
if (err) return cb(err);
@ -54,11 +56,13 @@ api.list = function(req, res) {
},
guilds: function(cb) {
if (!~type.indexOf('guilds')) return cb(null, []);
Group.find({members: {'$in': [user._id]}, type:'guild'})
.select(groupFields).sort(sort).exec(cb);
},
'public': function(cb) {
if (!~type.indexOf('public')) return cb(null, []);
Group.find({privacy: 'public'})
.select(groupFields + ' members')
.sort(sort)
@ -75,6 +79,7 @@ api.list = function(req, res) {
// unecessary given our ui-router setup
tavern: function(cb) {
if (!~type.indexOf('tavern')) return cb(null, {});
Group.findById('habitrpg').select(groupFields).exec(function(err, tavern){
if (err) return cb(err);
cb(null, [tavern]); // return as an array for consistent ngResource use
@ -83,6 +88,14 @@ api.list = function(req, res) {
}, function(err, results){
if (err) return res.json(500, {err: err});
// If they're requesting a specific type, let's return it as an array so that $ngResource
// can utilize it properly
if (req.query.type) {
results = _.reduce(type, function(m,t){
return m.concat(_.isArray(results[t]) ? results[t] : [results[t]]);
}, []);
}
res.json(results);
})
};

View file

@ -38,7 +38,7 @@ script(type='text/ng-template', id='partials/options.groups.guilds.public.html')
li {{group.memberCount}} member(s)
li
// join / leave
a.btn.btn-small.btn-danger(ng-show='group_.isMember', 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='group._isMember', ng-click='join(group)')