From ec080a2d107240a1a0f485f5e0365a05d190566b Mon Sep 17 00:00:00 2001 From: Marcos Defendi Date: Tue, 9 Jul 2019 13:02:04 -0300 Subject: [PATCH 1/3] Prevent error on trying insert message with duplicated id --- app/lib/client/methods/sendMessage.js | 4 ++++ app/lib/server/functions/sendMessage.js | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/app/lib/client/methods/sendMessage.js b/app/lib/client/methods/sendMessage.js index 4ba64c0059a7..ce4c5efcd1b2 100644 --- a/app/lib/client/methods/sendMessage.js +++ b/app/lib/client/methods/sendMessage.js @@ -12,6 +12,10 @@ Meteor.methods({ if (!Meteor.userId() || s.trim(message.msg) === '') { return false; } + const messageAlreadyExists = message._id && ChatMessage.findOne({ _id: message._id }); + if (messageAlreadyExists) { + return; + } const user = Meteor.user(); message.ts = isNaN(TimeSync.serverOffset()) ? new Date() : new Date(Date.now() + TimeSync.serverOffset()); message.u = { diff --git a/app/lib/server/functions/sendMessage.js b/app/lib/server/functions/sendMessage.js index 290218f14e3d..d922993d23a8 100644 --- a/app/lib/server/functions/sendMessage.js +++ b/app/lib/server/functions/sendMessage.js @@ -198,6 +198,10 @@ export const sendMessage = function(user, message, room, upsert = false) { }, message); message._id = _id; } else { + const messageAlreadyExists = message._id && Messages.findOneById(message._id); + if (messageAlreadyExists) { + return; + } message._id = Messages.insert(message); } From 01bde8a8985291202b5a5788f0274284bf86e9ef Mon Sep 17 00:00:00 2001 From: Marcos Defendi Date: Wed, 10 Jul 2019 10:34:40 -0300 Subject: [PATCH 2/3] Fix requested changes --- app/lib/client/methods/sendMessage.js | 4 +++- app/lib/server/functions/sendMessage.js | 2 +- packages/rocketchat-i18n/i18n/en.i18n.json | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/lib/client/methods/sendMessage.js b/app/lib/client/methods/sendMessage.js index ce4c5efcd1b2..a17f5bc064fa 100644 --- a/app/lib/client/methods/sendMessage.js +++ b/app/lib/client/methods/sendMessage.js @@ -1,11 +1,13 @@ import { Meteor } from 'meteor/meteor'; import { TimeSync } from 'meteor/mizzao:timesync'; import s from 'underscore.string'; +import toastr from 'toastr'; import { ChatMessage } from '../../../models'; import { settings } from '../../../settings'; import { callbacks } from '../../../callbacks'; import { promises } from '../../../promises/client'; +import { t } from '../../../utils'; Meteor.methods({ sendMessage(message) { @@ -14,7 +16,7 @@ Meteor.methods({ } const messageAlreadyExists = message._id && ChatMessage.findOne({ _id: message._id }); if (messageAlreadyExists) { - return; + return toastr.error(t('Message_Already_Sent')); } const user = Meteor.user(); message.ts = isNaN(TimeSync.serverOffset()) ? new Date() : new Date(Date.now() + TimeSync.serverOffset()); diff --git a/app/lib/server/functions/sendMessage.js b/app/lib/server/functions/sendMessage.js index d922993d23a8..2cb04ff465cb 100644 --- a/app/lib/server/functions/sendMessage.js +++ b/app/lib/server/functions/sendMessage.js @@ -198,7 +198,7 @@ export const sendMessage = function(user, message, room, upsert = false) { }, message); message._id = _id; } else { - const messageAlreadyExists = message._id && Messages.findOneById(message._id); + const messageAlreadyExists = message._id && Messages.findOneById(message._id, { fields: { _id: 1 } }); if (messageAlreadyExists) { return; } diff --git a/packages/rocketchat-i18n/i18n/en.i18n.json b/packages/rocketchat-i18n/i18n/en.i18n.json index b9a8ac3c7461..b5955587779b 100644 --- a/packages/rocketchat-i18n/i18n/en.i18n.json +++ b/packages/rocketchat-i18n/i18n/en.i18n.json @@ -2010,6 +2010,7 @@ "Message_AllowSnippeting": "Allow Message Snippeting", "Message_AllowStarring": "Allow Message Starring", "Message_AllowUnrecognizedSlashCommand": "Allow Unrecognized Slash Commands", + "Message_Already_Sent": "This message has already been sent and is being processed by the server", "Message_AlwaysSearchRegExp": "Always Search Using RegExp", "Message_AlwaysSearchRegExp_Description": "We recommend to set `True` if your language is not supported on MongoDB text search.", "Message_Attachments": "Message Attachments", From 4e58084bb727af0dd2ce2ac878150f3ab62da630 Mon Sep 17 00:00:00 2001 From: Marcos Spessatto Defendi Date: Thu, 11 Jul 2019 09:53:34 -0300 Subject: [PATCH 3/3] Update app/lib/client/methods/sendMessage.js Co-Authored-By: Diego Sampaio --- app/lib/client/methods/sendMessage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/lib/client/methods/sendMessage.js b/app/lib/client/methods/sendMessage.js index a17f5bc064fa..d765eefe27c7 100644 --- a/app/lib/client/methods/sendMessage.js +++ b/app/lib/client/methods/sendMessage.js @@ -7,7 +7,7 @@ import { ChatMessage } from '../../../models'; import { settings } from '../../../settings'; import { callbacks } from '../../../callbacks'; import { promises } from '../../../promises/client'; -import { t } from '../../../utils'; +import { t } from '../../../utils/client'; Meteor.methods({ sendMessage(message) {