diff --git a/website/src/controllers/api-v3/auth.js b/website/src/controllers/api-v3/auth.js index 2c7e00cadc..b0ab6b0674 100644 --- a/website/src/controllers/api-v3/auth.js +++ b/website/src/controllers/api-v3/auth.js @@ -259,6 +259,7 @@ api.deleteSocial = { if (!user.auth.local.username) return next(new NotAuthorized(res.t('cantDetachFb'))); // TODO move to model validation? User.update({_id: user._id}, {$unset: {'auth.facebook': 1}}) + .exec() .then(() => res.respond(200)) .catch(next); }, diff --git a/website/src/controllers/api-v3/groups.js b/website/src/controllers/api-v3/groups.js index a54e501a36..1c948a5912 100644 --- a/website/src/controllers/api-v3/groups.js +++ b/website/src/controllers/api-v3/groups.js @@ -186,7 +186,7 @@ api.joinGroup = { let isUserInvited = false; if (group.type === 'party' && group._id === (user.invitations.party && user.invitations.party.id)) { - user.invitations.party = undefined; // Clear invite + user.invitations.party = {}; // Clear invite TODO mark modified? // invite new user to pending quest if (group.quest.key && !group.quest.active) { @@ -319,7 +319,7 @@ api.removeGroupMember = { }).then(member => { // We're removing the user from a guild or a party? is the user invited only? let isInGroup = member.party._id === group._id ? 'party' : member.guilds.indexOf(group._id) !== 1 ? 'guild' : undefined; // eslint-disable-line no-nested-ternary - let isInvited = member.invitations.party._id === group._id ? 'party' : member.invitations.guilds.indexOf(group._id) !== 1 ? 'guild' : undefined; // eslint-disable-line no-nested-ternary + let isInvited = member.invitations.party.id === group._id ? 'party' : _.findIndex(member.invitations.guilds, {id: group._id}) !== 1 ? 'guild' : undefined; // eslint-disable-line no-nested-ternary if (isInGroup) { group.memberCount -= 1; @@ -338,11 +338,14 @@ api.removeGroupMember = { member.newMessages.group._id = undefined; if (group.quest && group.quest.active && group.quest.leader === member._id) { - user.items.quests[group.quest.key] += 1; // TODO why this? + member.items.quests[group.quest.key] += 1; // TODO why this? } - } if (isInvited) { - if (isInvited === 'guild') _.pull(user.invitations.guilds, group._id); - if (isInvited === 'party') user.invitations.party._id = undefined; // TODO remove quest information too? + } else if (isInvited) { + if (isInvited === 'guild') { + let i = _.findIndex(member.invitations.guilds, {id: group._id}); + if (i !== -1) member.invitations.guilds.splice(i, 1); + } + if (isInvited === 'party') user.invitations.party = {}; // TODO mark modified? } else { throw new NotFound(res.t('groupMemberNotFound')); } diff --git a/website/src/models/group.js b/website/src/models/group.js index fa59f61aec..8687df181d 100644 --- a/website/src/models/group.js +++ b/website/src/models/group.js @@ -97,6 +97,7 @@ schema.pre('save', function preSaveGroup (next) { return next(); }); +// TODO test schema.pre('remove', true, function preRemoveGroup (next, done) { next(); let group = this; @@ -104,18 +105,19 @@ schema.pre('remove', true, function preRemoveGroup (next, done) { // Remove invitations when group is deleted // TODO verify it works fir everything User.find({ - // TODO remove need for guilds s in migration? same for id -> _id + // TODO id -> _id ? [`invitations.${group.type}${group.type === 'guild' ? 's' : ''}.id`]: group._id, }).exec() .then(users => { return Q.all(users.map(user => { if (group.type === 'party') { - user.invitations.party = {}; + user.invitations.party = {}; // TODO mark modified } else { let i = _.findIndex(user.invitations.guilds, {id: group._id}); user.invitations.guilds.splice(i, 1); } - return user.save(); // TODO update? + + return user.save(); })); }) .then(done) @@ -489,8 +491,14 @@ schema.methods.leave = function leaveGroup (user, keep = 'keep-all') { group.type === 'guild' && group.privacy === 'private' )) return group.remove(); - // otherwise just remove a member - let update = {$pull: {members: user._id}}; + let update = {}; + // otherwise just remove a member TODO create User.methods.removeFromGroup? + if (group.type === 'guild') { + _.pull(user.guilds, group._id); + } else { + user.party._id = undefined; + } + // If the leader is leaving (or if the leader previously left, and this wasn't accounted for) let leader = group.leader; @@ -502,7 +510,10 @@ schema.methods.leave = function leaveGroup (user, keep = 'keep-all') { } update.$inc = {memberCount: -1}; - return model.update({_id: group._id}, update); // eslint-disable-line no-use-before-define + return Q.all([ + model.update({_id: group._id}, update).exec(), // eslint-disable-line no-use-before-define + user.save(), + ]); })(), ]).then(() => { firebase.removeUserFromGroup(group._id, user._id);