From ff81e558392df758e7656027a0622bbbd8a6d34e Mon Sep 17 00:00:00 2001 From: Nathanael Farley Date: Sat, 17 Nov 2018 09:48:41 +0000 Subject: [PATCH] groupChatReceived webhook fix (#10802) * Moved sendGroupChatReceivedWebhooks to group.sendChat function. * Added test for new functionality. --- test/api/unit/models/group.test.js | 56 +++++++++++++++++++++++ website/server/controllers/api-v3/chat.js | 2 - website/server/models/group.js | 4 ++ 3 files changed, 60 insertions(+), 2 deletions(-) diff --git a/test/api/unit/models/group.test.js b/test/api/unit/models/group.test.js index a9df620f56..9c0a0302a6 100644 --- a/test/api/unit/models/group.test.js +++ b/test/api/unit/models/group.test.js @@ -1843,6 +1843,62 @@ describe('Group Model', () => { expect(options.chat).to.eql(chat); }); + it('sends webhooks for users with webhooks triggered by system messages', async () => { + let guild = new Group({ + name: 'some guild', + type: 'guild', + }); + + let memberWithWebhook = new User({ + guilds: [guild._id], + webhooks: [{ + type: 'groupChatReceived', + url: 'http://someurl.com', + options: { + groupId: guild._id, + }, + }], + }); + let memberWithoutWebhook = new User({ + guilds: [guild._id], + }); + let nonMemberWithWebhooks = new User({ + webhooks: [{ + type: 'groupChatReceived', + url: 'http://a-different-url.com', + options: { + groupId: generateUUID(), + }, + }], + }); + + await Promise.all([ + memberWithWebhook.save(), + memberWithoutWebhook.save(), + nonMemberWithWebhooks.save(), + ]); + + guild.leader = memberWithWebhook._id; + + await guild.save(); + + const groupMessage = guild.sendChat('Test message.'); + await groupMessage.save(); + + await sleep(); + + expect(groupChatReceivedWebhook.send).to.be.calledOnce; + + let args = groupChatReceivedWebhook.send.args[0]; + let webhooks = args[0].webhooks; + let options = args[1]; + + expect(webhooks).to.have.a.lengthOf(1); + expect(webhooks[0].id).to.eql(memberWithWebhook.webhooks[0].id); + expect(options.group).to.eql(guild); + expect(options.chat).to.eql(groupMessage); + }); + it('sends webhooks for each user with webhooks in group', async () => { let guild = new Group({ name: 'some guild', diff --git a/website/server/controllers/api-v3/chat.js b/website/server/controllers/api-v3/chat.js index 95f6f405f9..cb73d2ada2 100644 --- a/website/server/controllers/api-v3/chat.js +++ b/website/server/controllers/api-v3/chat.js @@ -190,8 +190,6 @@ api.postChat = { } else { res.respond(200, {message: newChatMessage}); } - - group.sendGroupChatReceivedWebhooks(newChatMessage); }, }; diff --git a/website/server/models/group.js b/website/server/models/group.js index 8876e03db1..82e9956acb 100644 --- a/website/server/models/group.js +++ b/website/server/models/group.js @@ -494,6 +494,10 @@ schema.methods.sendChat = function sendChat (message, user, metaData) { newChatMessage._meta = metaData; } + // Activate the webhook for receiving group chat messages before + // newChatMessage is possibly returned + this.sendGroupChatReceivedWebhooks(newChatMessage); + // do not send notifications for guilds with more than 5000 users and for the tavern if (NO_CHAT_NOTIFICATIONS.indexOf(this._id) !== -1 || this.memberCount > LARGE_GROUP_COUNT_MESSAGE_CUTOFF) { return newChatMessage;