mirror of
https://github.com/sudoxnym/habitica-self-host.git
synced 2026-07-14 18:22:21 +00:00
voluntarily leaving a party removes the user from the quest the party is involved in (#7845)
* voluntarily leaving a party removes the user from the quest the party is involved in. part of #7653 * addressing pr comments, removing lodash dependency and unecessary comment * using the existing update object instead of group.save to avoid duplicate behavior * finalizing tests
This commit is contained in:
parent
6e55be033b
commit
6804125068
2 changed files with 46 additions and 4 deletions
|
|
@ -434,6 +434,47 @@ describe('Group Model', () => {
|
|||
});
|
||||
});
|
||||
|
||||
describe('#leaveGroup', () => {
|
||||
it('removes user from group quest', async () => {
|
||||
party.quest.members = {
|
||||
[participatingMember._id]: true,
|
||||
[questLeader._id]: true,
|
||||
[nonParticipatingMember._id]: false,
|
||||
[undecidedMember._id]: null,
|
||||
};
|
||||
party.memberCount = 4;
|
||||
await party.save();
|
||||
|
||||
await party.leave(participatingMember);
|
||||
|
||||
party = await Group.findOne({_id: party._id});
|
||||
expect(party.quest.members).to.eql({
|
||||
[questLeader._id]: true,
|
||||
[nonParticipatingMember._id]: false,
|
||||
[undecidedMember._id]: null,
|
||||
});
|
||||
});
|
||||
|
||||
it('deletes a private group when the last member leaves', async () => {
|
||||
party.memberCount = 1;
|
||||
|
||||
await party.leave(participatingMember);
|
||||
|
||||
party = await Group.findOne({_id: party._id});
|
||||
expect(party).to.not.exist;
|
||||
});
|
||||
|
||||
it('does not delete a public group when the last member leaves', async () => {
|
||||
party.memberCount = 1;
|
||||
party.privacy = 'public';
|
||||
|
||||
await party.leave(participatingMember);
|
||||
|
||||
party = await Group.findOne({_id: party._id});
|
||||
expect(party).to.exist;
|
||||
});
|
||||
});
|
||||
|
||||
describe('#sendChat', () => {
|
||||
beforeEach(() => {
|
||||
sandbox.spy(User, 'update');
|
||||
|
|
|
|||
|
|
@ -701,6 +701,9 @@ schema.statics.tavernBoss = async function tavernBoss (user, progress) {
|
|||
|
||||
schema.methods.leave = async function leaveGroup (user, keep = 'keep-all') {
|
||||
let group = this;
|
||||
let update = {
|
||||
$inc: {memberCount: -1},
|
||||
};
|
||||
|
||||
let challenges = await Challenge.find({
|
||||
_id: {$in: user.challenges},
|
||||
|
|
@ -724,16 +727,14 @@ schema.methods.leave = async function leaveGroup (user, keep = 'keep-all') {
|
|||
pusher.trigger(`presence-group-${group._id}`, 'user-left', {
|
||||
userId: user._id,
|
||||
});
|
||||
|
||||
update.$unset = {[`quest.members.${user._id}`]: 1};
|
||||
}
|
||||
|
||||
// If user is the last one in group and group is private, delete it
|
||||
if (group.memberCount <= 1 && group.privacy === 'private') {
|
||||
promises.push(group.remove());
|
||||
} else { // otherwise If the leader is leaving (or if the leader previously left, and this wasn't accounted for)
|
||||
let update = {
|
||||
$inc: {memberCount: -1},
|
||||
};
|
||||
|
||||
if (group.leader === user._id) {
|
||||
let query = group.type === 'party' ? {'party._id': group._id} : {guilds: group._id};
|
||||
query._id = {$ne: user._id};
|
||||
|
|
|
|||
Loading…
Reference in a new issue