mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-19 07:37:25 +01:00
groups, list users invited with ability to remove their invitation, @lefnire i used group.invites from Group Schema which was already defined but not used by anything, fix #1523
This commit is contained in:
@@ -192,7 +192,6 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Groups', '$http', 'A
|
|||||||
var group = new Groups.Group({_id: party.id, name: party.name});
|
var group = new Groups.Group({_id: party.id, name: party.name});
|
||||||
// there a better way to access GroupsCtrl.groups.party?
|
// there a better way to access GroupsCtrl.groups.party?
|
||||||
group.$join(function(){
|
group.$join(function(){
|
||||||
User.user.invitations.party = undefined;
|
|
||||||
location.reload();
|
location.reload();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,16 +49,12 @@ api.getGroups = function(req, res, next) {
|
|||||||
if (type && !~type.indexOf('party')) return cb(null, {});
|
if (type && !~type.indexOf('party')) return cb(null, {});
|
||||||
Group
|
Group
|
||||||
.findOne({type: 'party', members: {'$in': [user._id]}})
|
.findOne({type: 'party', members: {'$in': [user._id]}})
|
||||||
.populate({
|
.populate('members invites', partyFields)
|
||||||
path: 'members',
|
|
||||||
//match: {_id: {$ne: user._id}}, //fixme this causes it to hang??
|
|
||||||
select: partyFields
|
|
||||||
})
|
|
||||||
.exec(cb);
|
.exec(cb);
|
||||||
},
|
},
|
||||||
guilds: function(cb) {
|
guilds: function(cb) {
|
||||||
if (type && !~type.indexOf('guilds')) return cb(null, []);
|
if (type && !~type.indexOf('guilds')) return cb(null, []);
|
||||||
Group.find({type: 'guild', members: {'$in': [user._id]}}).populate('members', usernameFields).exec(cb);
|
Group.find({type: 'guild', members: {'$in': [user._id]}}).populate('members invites', usernameFields).exec(cb);
|
||||||
// Group.find({type: 'guild', members: {'$in': [user._id]}}, cb);
|
// Group.find({type: 'guild', members: {'$in': [user._id]}}, cb);
|
||||||
},
|
},
|
||||||
tavern: function(cb) {
|
tavern: function(cb) {
|
||||||
@@ -101,7 +97,7 @@ api.getGroup = function(req, res, next) {
|
|||||||
var user = res.locals.user;
|
var user = res.locals.user;
|
||||||
var gid = req.params.gid;
|
var gid = req.params.gid;
|
||||||
|
|
||||||
Group.findById(gid).populate('members', partyFields).exec(function(err, group){
|
Group.findById(gid).populate('members invites', partyFields).exec(function(err, group){
|
||||||
if ( (group.type == 'guild' && group.privacy == 'private') || group.type == 'party') {
|
if ( (group.type == 'guild' && group.privacy == 'private') || group.type == 'party') {
|
||||||
if(!_.find(group.members, {_id: user._id}))
|
if(!_.find(group.members, {_id: user._id}))
|
||||||
return res.json(401, {err: "You don't have access to this group"});
|
return res.json(401, {err: "You don't have access to this group"});
|
||||||
@@ -156,7 +152,7 @@ api.updateGroup = function(req, res, next) {
|
|||||||
function(cb){group.save(cb);},
|
function(cb){group.save(cb);},
|
||||||
function(cb){
|
function(cb){
|
||||||
var fields = group.type == 'party' ? partyFields : usernameFields;
|
var fields = group.type == 'party' ? partyFields : usernameFields;
|
||||||
Group.findById(group._id).populate('members', fields).exec(cb);
|
Group.findById(group._id).populate('members invites', fields).exec(cb);
|
||||||
}
|
}
|
||||||
], function(err, results){
|
], function(err, results){
|
||||||
if (err) return res.json(500,{err:err});
|
if (err) return res.json(500,{err:err});
|
||||||
@@ -197,7 +193,7 @@ api.postChat = function(req, res, next) {
|
|||||||
async.series([
|
async.series([
|
||||||
function(cb){group.save(cb)},
|
function(cb){group.save(cb)},
|
||||||
function(cb){
|
function(cb){
|
||||||
Group.findById(group._id).populate('members', partyFields).exec(cb);
|
Group.findById(group._id).populate('members invites', partyFields).exec(cb);
|
||||||
}
|
}
|
||||||
], function(err, results){
|
], function(err, results){
|
||||||
if (err) return res.json(500, {err:err});
|
if (err) return res.json(500, {err:err});
|
||||||
@@ -244,12 +240,13 @@ api.join = function(req, res, next) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
group.members.push(user._id);
|
group.members.push(user._id);
|
||||||
|
group.invites.splice(_.indexOf(group.invites, user._id), 1);
|
||||||
async.series([
|
async.series([
|
||||||
function(cb){
|
function(cb){
|
||||||
group.save(cb);
|
group.save(cb);
|
||||||
},
|
},
|
||||||
function(cb){
|
function(cb){
|
||||||
Group.findById(group._id).populate('members', partyFields).exec(cb);
|
Group.findById(group._id).populate('members invites', partyFields).exec(cb);
|
||||||
}
|
}
|
||||||
], function(err, results){
|
], function(err, results){
|
||||||
if (err) return res.json(500,{err:err});
|
if (err) return res.json(500,{err:err});
|
||||||
@@ -274,6 +271,7 @@ api.leave = function(req, res, next) {
|
|||||||
api.invite = function(req, res, next) {
|
api.invite = function(req, res, next) {
|
||||||
var group = res.locals.group;
|
var group = res.locals.group;
|
||||||
var uuid = req.query.uuid;
|
var uuid = req.query.uuid;
|
||||||
|
var user = res.locals.user;
|
||||||
|
|
||||||
User.findById(uuid, function(err,invite){
|
User.findById(uuid, function(err,invite){
|
||||||
if (err) return res.json(500,{err:err});
|
if (err) return res.json(500,{err:err});
|
||||||
@@ -293,7 +291,7 @@ api.invite = function(req, res, next) {
|
|||||||
if (!_.isEmpty(groups))
|
if (!_.isEmpty(groups))
|
||||||
return res.json(400,{err:"User already in a party."})
|
return res.json(400,{err:"User already in a party."})
|
||||||
sendInvite();
|
sendInvite();
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function sendInvite (){
|
function sendInvite (){
|
||||||
@@ -304,13 +302,26 @@ api.invite = function(req, res, next) {
|
|||||||
invite.invitations.party = {id: group._id, name: group.name}
|
invite.invitations.party = {id: group._id, name: group.name}
|
||||||
}
|
}
|
||||||
|
|
||||||
invite.save();
|
group.invites.push(invite._id);
|
||||||
Group.findById(group._id)
|
|
||||||
.populate('members', partyFields).exec(function(err, saved){
|
|
||||||
if (group.type === 'party') removeSelf(saved, res.locals.user);
|
|
||||||
res.json(saved);
|
|
||||||
});
|
|
||||||
|
|
||||||
|
async.series([
|
||||||
|
function(cb){
|
||||||
|
invite.save(cb);
|
||||||
|
},
|
||||||
|
function(cb){
|
||||||
|
group.save(cb);
|
||||||
|
},
|
||||||
|
function(cb){
|
||||||
|
Group.findById(group._id).populate('members invites', partyFields).exec(cb);
|
||||||
|
}
|
||||||
|
], function(err, results){
|
||||||
|
if (err) return res.json(500,{err:err});
|
||||||
|
|
||||||
|
// Remove self from party (see above failing `match` directive in `populate`
|
||||||
|
if(results[2].type == 'party') removeSelf(results[2], user);
|
||||||
|
|
||||||
|
res.json(results[2]);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -327,7 +338,35 @@ api.removeMember = function(req, res, next){
|
|||||||
if(_.contains(group.members, uuid)){
|
if(_.contains(group.members, uuid)){
|
||||||
Group.update({_id:group._id},{$pull:{members:uuid}}, function(err, saved){
|
Group.update({_id:group._id},{$pull:{members:uuid}}, function(err, saved){
|
||||||
if (err) return res.json(500,{err:err});
|
if (err) return res.json(500,{err:err});
|
||||||
return res.json(saved);
|
|
||||||
|
// Sending an empty 204 because Group.update doesn't return the group
|
||||||
|
// see http://mongoosejs.com/docs/api.html#model_Model.update
|
||||||
|
res.send(204);
|
||||||
|
});
|
||||||
|
}else if(_.contains(group.invites, uuid)){
|
||||||
|
User.findById(uuid, function(err,invited){
|
||||||
|
var invitations = invited.invitations;
|
||||||
|
if(group.type === 'guild'){
|
||||||
|
invitations.guilds.splice(_.indexOf(invitations.guilds, group._id), 1);
|
||||||
|
}else{
|
||||||
|
invitations.party = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
async.series([
|
||||||
|
function(cb){
|
||||||
|
invited.save(cb);
|
||||||
|
},
|
||||||
|
function(cb){
|
||||||
|
Group.update({_id:group._id},{$pull:{invites:uuid}}, cb);
|
||||||
|
}
|
||||||
|
], function(err, results){
|
||||||
|
if (err) return res.json(500,{err:err});
|
||||||
|
|
||||||
|
// Sending an empty 204 because Group.update doesn't return the group
|
||||||
|
// see http://mongoosejs.com/docs/api.html#model_Model.update
|
||||||
|
res.send(204);
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
}else{
|
}else{
|
||||||
return res.json(400, {err: "User not found among group's members!"});
|
return res.json(400, {err: "User not found among group's members!"});
|
||||||
|
|||||||
@@ -57,14 +57,24 @@ a.pull-right.gem-wallet(popover-trigger='mouseenter', popover-title='Guild Bank'
|
|||||||
td
|
td
|
||||||
// allow leaders to ban members
|
// allow leaders to ban members
|
||||||
div(ng-show='group.leader == user.id && user.id!=member._id')
|
div(ng-show='group.leader == user.id && user.id!=member._id')
|
||||||
// {{#with group.members[$index]}}
|
|
||||||
a(ng-click='removeMember(group, member)')
|
a(ng-click='removeMember(group, member)')
|
||||||
i.icon-ban-circle(tooltip='Boot Member')
|
i.icon-ban-circle(tooltip='Boot Member')
|
||||||
// {{/}}
|
a
|
||||||
a(data-toggle='modal', data-target='#avatar-modal-{{member._id}}')
|
|
||||||
span(ng-class='{"badge badge-info": group.leader==member._id}', ng-click='clickMember(member._id, true)')
|
span(ng-class='{"badge badge-info": group.leader==member._id}', ng-click='clickMember(member._id, true)')
|
||||||
| {{username(member.auth, member.profile.name)}}
|
| {{username(member.auth, member.profile.name)}}
|
||||||
td ({{member._id}})
|
td ({{member._id}})
|
||||||
|
h4(ng-show='group.invites.length > 0') Invited
|
||||||
|
table.table.table-striped
|
||||||
|
tr(ng-repeat='invite in group.invites')
|
||||||
|
td
|
||||||
|
// allow leaders to ban members
|
||||||
|
div(ng-show='group.leader == user.id')
|
||||||
|
a(ng-click='removeMember(group, invite)')
|
||||||
|
i.icon-ban-circle(tooltip='Boot Member')
|
||||||
|
a
|
||||||
|
span(ng-click='clickMember(invite._id, true)')
|
||||||
|
| {{username(invite.auth, invite.profile.name)}}
|
||||||
|
td ({{invite._id}})
|
||||||
.modal-footer.whatever-options
|
.modal-footer.whatever-options
|
||||||
form.form-inline(ng-submit='invite(group)')
|
form.form-inline(ng-submit='invite(group)')
|
||||||
//.alert.alert-danger(ng-show='_groupError') {{_groupError}}
|
//.alert.alert-danger(ng-show='_groupError') {{_groupError}}
|
||||||
|
|||||||
Reference in New Issue
Block a user