Allow Multiple Invites to Party (#8683)

* (server) Add parties array to store invites

* (server) Lint files

* Update joinGroup, rejectGroupInvite, _inviteByUUID, and remove clearPartyInvitation.js

* Update user schema: detailed 'invitations.parties' attributes

* Code improvement and do not let invite twice

* Check if the user is already invited earlier in the code

* Added message to invitation page, and show all invitations

* Added join party confirmation alert

* Small fixes

* Created test: allow inviting a user to 2 different parties

* Updated tests

* Update invitations.parties on more places

* Small adjustments

* Updates on invitations.party references

* Show all invitations when user is already in a party

* Fixed notifications counter

* Update both 'party' and 'parties' at _handleGroupInvitation

* Updated a test

* Fixed small mistake at _handleGroupInvitation

* More test update

* Update invitation.party when removing single invite and small adjust at view
This commit is contained in:
Mateus Etto
2017-07-19 22:45:28 -03:00
committed by Sabe Jones
parent 11a4c1c95d
commit cdc8473f60
17 changed files with 133 additions and 64 deletions

View File

@@ -480,29 +480,35 @@ api.joinGroup = {
let isUserInvited = false;
if (group.type === 'party' && group._id === user.invitations.party.id) {
inviter = user.invitations.party.inviter;
user.invitations.party = {}; // Clear invite
user.markModified('invitations.party');
if (group.type === 'party') {
// Check if was invited to party
let inviterParty = _.find(user.invitations.parties, {id: group._id});
if (inviterParty) {
inviter = inviterParty.inviter;
// invite new user to pending quest
if (group.quest.key && !group.quest.active) {
user.party.quest.RSVPNeeded = true;
user.party.quest.key = group.quest.key;
group.quest.members[user._id] = null;
group.markModified('quest.members');
// Clear all invitations of new user
user.invitations.parties = [];
user.invitations.party = {};
// invite new user to pending quest
if (group.quest.key && !group.quest.active) {
user.party.quest.RSVPNeeded = true;
user.party.quest.key = group.quest.key;
group.quest.members[user._id] = null;
group.markModified('quest.members');
}
// If user was in a different party (when partying solo you can be invited to a new party)
// make them leave that party before doing anything
if (user.party._id) {
let userPreviousParty = await Group.getGroup({user, groupId: user.party._id});
if (userPreviousParty) await userPreviousParty.leave(user);
}
user.party._id = group._id; // Set group as user's party
isUserInvited = true;
}
// If user was in a different party (when partying solo you can be invited to a new party)
// make him leave that party before doing anything
if (user.party._id) {
let userPreviousParty = await Group.getGroup({user, groupId: user.party._id});
if (userPreviousParty) await userPreviousParty.leave(user);
}
user.party._id = group._id; // Set group as user's party
isUserInvited = true;
} else if (group.type === 'guild') {
let hasInvitation = removeFromArray(user.invitations.guilds, { id: group._id });
@@ -636,8 +642,9 @@ api.rejectGroupInvite = {
let groupId = req.params.groupId;
let isUserInvited = false;
if (groupId === user.invitations.party.id) {
user.invitations.party = {};
let hasPartyInvitation = removeFromArray(user.invitations.parties, { id: groupId });
if (hasPartyInvitation) {
user.invitations.party = user.invitations.parties.length > 0 ? user.invitations.parties[user.invitations.parties.length - 1] : {};
user.markModified('invitations.party');
isUserInvited = true;
} else {
@@ -804,7 +811,7 @@ api.removeGroupMember = {
}
let isInvited;
if (member.invitations.party && member.invitations.party.id === group._id) {
if (_.find(member.invitations.parties, {id: group._id})) {
isInvited = 'party';
} else if (_.findIndex(member.invitations.guilds, {id: group._id}) !== -1) {
isInvited = 'guild';
@@ -849,7 +856,8 @@ api.removeGroupMember = {
removeFromArray(member.invitations.guilds, { id: group._id });
}
if (isInvited === 'party') {
member.invitations.party = {};
removeFromArray(member.invitations.parties, { id: group._id });
member.invitations.party = member.invitations.parties.length > 0 ? member.invitations.parties[member.invitations.parties.length - 1] : {};
member.markModified('invitations.party');
}
} else {
@@ -888,7 +896,8 @@ async function _inviteByUUID (uuid, group, inviter, req, res) {
if (group.isSubscribed() && !group.hasNotCancelled()) guildInvite.cancelledPlan = true;
userToInvite.invitations.guilds.push(guildInvite);
} else if (group.type === 'party') {
if (userToInvite.invitations.party.id) {
// Do not add to invitations.parties array if the user is already invited to that party
if (_.find(userToInvite.invitations.parties, {id: group._id})) {
throw new NotAuthorized(res.t('userAlreadyPendingInvitation'));
}
@@ -901,6 +910,8 @@ async function _inviteByUUID (uuid, group, inviter, req, res) {
let partyInvite = {id: group._id, name: group.name, inviter: inviter._id};
if (group.isSubscribed() && !group.hasNotCancelled()) partyInvite.cancelledPlan = true;
userToInvite.invitations.parties.push(partyInvite);
userToInvite.invitations.party = partyInvite;
}
@@ -943,7 +954,7 @@ async function _inviteByUUID (uuid, group, inviter, req, res) {
if (group.type === 'guild') {
return userInvited.invitations.guilds[userToInvite.invitations.guilds.length - 1];
} else if (group.type === 'party') {
return userInvited.invitations.party;
return userInvited.invitations.parties[userToInvite.invitations.parties.length - 1];
}
}