diff --git a/lib/integrations/slack/incoming_message_builder.rb b/lib/integrations/slack/incoming_message_builder.rb index 97728d848..7eab71eae 100644 --- a/lib/integrations/slack/incoming_message_builder.rb +++ b/lib/integrations/slack/incoming_message_builder.rb @@ -16,8 +16,8 @@ class Integrations::Slack::IncomingMessageBuilder if hook_verification? verify_hook - elsif create_message? - create_message + elsif process_message_payload? + process_message_payload elsif link_shared? SlackUnfurlJob.perform_later(params) end @@ -67,7 +67,7 @@ class Integrations::Slack::IncomingMessageBuilder params[:event][:thread_ts].present? end - def create_message? + def process_message_payload? thread_timestamp_available? && supported_message? && integration_hook end diff --git a/lib/integrations/slack/slack_message_helper.rb b/lib/integrations/slack/slack_message_helper.rb index 762d488c5..52ec4caad 100644 --- a/lib/integrations/slack/slack_message_helper.rb +++ b/lib/integrations/slack/slack_message_helper.rb @@ -1,21 +1,32 @@ module Integrations::Slack::SlackMessageHelper - def create_message + def process_message_payload return unless conversation - build_message - @message.save! - { status: 'success' } + handle_conversation + success_response rescue Slack::Web::Api::Errors::MissingScope => e ChatwootExceptionTracker.new(e, account: conversation.account).capture_exception disable_and_reauthorize end + def handle_conversation + create_message unless message_exists? + end + + def success_response + { status: 'success' } + end + def disable_and_reauthorize integration_hook.prompt_reauthorization! integration_hook.disable end - def build_message + def message_exists? + conversation.messages.exists?(external_source_ids: { slack: params[:event][:ts] }) + end + + def create_message @message = conversation.messages.build( message_type: :outgoing, account_id: conversation.account_id, @@ -26,6 +37,7 @@ module Integrations::Slack::SlackMessageHelper sender: sender ) process_attachments(params[:event][:files]) if attachments_present? + @message.save! end def attachments_present? diff --git a/spec/lib/integrations/slack/incoming_message_builder_spec.rb b/spec/lib/integrations/slack/incoming_message_builder_spec.rb index 5bb04c582..608324e8f 100644 --- a/spec/lib/integrations/slack/incoming_message_builder_spec.rb +++ b/spec/lib/integrations/slack/incoming_message_builder_spec.rb @@ -65,6 +65,16 @@ describe Integrations::Slack::IncomingMessageBuilder do expect(conversation.messages.count).to eql(messages_count) end + it 'does not create message if message already exists' do + expect(hook).not_to be_nil + messages_count = conversation.messages.count + builder = described_class.new(message_params) + allow(builder).to receive(:sender).and_return(nil) + 2.times.each { builder.perform } + expect(conversation.messages.count).to eql(messages_count + 1) + expect(conversation.messages.last.content).to eql('this is test https://chatwoot.com Hey @Sojan Test again') + end + it 'creates message' do expect(hook).not_to be_nil messages_count = conversation.messages.count