From 7025bbfa3244dc1da9477513b6db68f4e436bf17 Mon Sep 17 00:00:00 2001 From: Kristian Tashkov Date: Wed, 30 Dec 2015 01:27:38 +0200 Subject: [PATCH] Fix basilist scroll giving logic when joining party closes #6416 --- .../v3/integration/groups/POST-groups.test.js | 3 + .../groups/POST-groups_groupId_join.js | 63 +++++++++++++++++++ website/src/controllers/api-v3/groups.js | 14 +++-- website/src/models/group.js | 2 +- 4 files changed, 76 insertions(+), 6 deletions(-) create mode 100644 test/api/v3/integration/groups/POST-groups_groupId_join.js diff --git a/test/api/v3/integration/groups/POST-groups.test.js b/test/api/v3/integration/groups/POST-groups.test.js index da532cc8d3..0d3a622581 100644 --- a/test/api/v3/integration/groups/POST-groups.test.js +++ b/test/api/v3/integration/groups/POST-groups.test.js @@ -45,6 +45,7 @@ describe('POST /group', () => { expect(result._id).to.exist; expect(result.name).to.equal(groupName); expect(result.type).to.equal(groupType); + expect(result.memberCount).to.equal(1); }); }); }); @@ -66,6 +67,7 @@ describe('POST /group', () => { expect(result._id).to.exist; expect(result.name).to.equal(groupName); expect(result.type).to.equal(groupType); + expect(result.memberCount).to.equal(1); expect(result.privacy).to.equal(groupPrivacy); }); }); @@ -85,6 +87,7 @@ describe('POST /group', () => { expect(result._id).to.exist; expect(result.name).to.equal(groupName); expect(result.type).to.equal(groupType); + expect(result.memberCount).to.equal(1); }); }); diff --git a/test/api/v3/integration/groups/POST-groups_groupId_join.js b/test/api/v3/integration/groups/POST-groups_groupId_join.js new file mode 100644 index 0000000000..aa26c10289 --- /dev/null +++ b/test/api/v3/integration/groups/POST-groups_groupId_join.js @@ -0,0 +1,63 @@ +import { + generateUser, +} from '../../../../helpers/api-integration.helper'; + +describe('POST /group/:groupId/join', () => { + context('Accepting invitation to a guild', () => { + let user, invitedUser, guild; + + beforeEach(async () => { + user = await generateUser({balance: 1}); + guild = await user.post('/groups', { + name: 'Test Guild', + type: 'guild', + }); + invitedUser = await generateUser({ + 'invitations.guilds': [{ id: guild._id}], + }); + }); + + it('does not give basilist quest to inviter when joining a guild', async () => { + await invitedUser.post(`/groups/${guild._id}/join`); + + await expect(user.get('/user')).to.eventually.not.have.deep.property('items.quests.basilist'); + }); + + it('does not increment basilist quest count to inviter with basilist when joining a guild', async () => { + user.update({ 'items.quests.basilist': 1 }); + + await invitedUser.post(`/groups/${guild._id}/join`); + + await expect(user.get('/user')).to.eventually.have.deep.property('items.quests.basilist', 1); + }); + }); + + context('Accepting invitation to a party', () => { + let user, invitedUser, party; + + beforeEach(async () => { + user = await generateUser(); + party = await user.post('/groups', { + name: 'Test Party', + type: 'party', + }); + invitedUser = await generateUser({ + 'invitations.party': { id: party._id, inviter: user._id }, + }); + }); + + it('gives basilist quest item to the inviter when joining a party', async () => { + await invitedUser.post(`/groups/${party._id}/join`); + + await expect(user.get('/user')).to.eventually.have.deep.property('items.quests.basilist', 1); + }); + + it('increments basilist quest item count to inviter when joining a party', async () => { + user.update({'items.quests.basilist': 1 }); + + await invitedUser.post(`/groups/${party._id}/join`); + + await expect(user.get('/user')).to.eventually.have.deep.property('items.quests.basilist', 2); + }); + }); +}); diff --git a/website/src/controllers/api-v3/groups.js b/website/src/controllers/api-v3/groups.js index 1edf18b026..a61c56e26c 100644 --- a/website/src/controllers/api-v3/groups.js +++ b/website/src/controllers/api-v3/groups.js @@ -201,6 +201,7 @@ api.joinGroup = { middlewares: [authWithHeaders(), cron], async handler (req, res) { let user = res.locals.user; + let inviter; req.checkParams('groupId', res.t('groupIdRequired')).notEmpty().isUUID(); @@ -213,6 +214,7 @@ api.joinGroup = { let isUserInvited = false; if (group.type === 'party' && group._id === (user.invitations.party && user.invitations.party.id)) { + inviter = user.invitations.party.inviter; user.invitations.party = {}; // Clear invite TODO mark modified? // invite new user to pending quest @@ -242,11 +244,13 @@ api.joinGroup = { if (group.memberCount === 0) group.leader = user._id; // If new user is only member -> set as leader - await Q.all([ - group.save(), - user.save(), - User.update({_id: user.invitations.party.inviter}, {$inc: {'items.quests.basilist': 1}}).exec(), // Reward inviter - ]); + let promises = [group.save(), user.save()]; + + if (group.type === 'party' && inviter) { + promises.push(User.update({_id: inviter}, {$inc: {'items.quests.basilist': 1}}).exec()); // Reward inviter + } + + await Q.all(promises); firebase.addUserToGroup(group._id, user._id); res.respond(200, {}); // TODO what to return? diff --git a/website/src/models/group.js b/website/src/models/group.js index eb85e7662f..a45d2eaa60 100644 --- a/website/src/models/group.js +++ b/website/src/models/group.js @@ -35,7 +35,7 @@ export let schema = new Schema({ challenges: {type: Boolean, default: false, required: true}, // invites: {type:Boolean, 'default':false} // TODO ? }, - memberCount: {type: Number, default: 0}, + memberCount: {type: Number, default: 1}, challengeCount: {type: Number, default: 0}, balance: {type: Number, default: 0}, logo: String,