From 6e300644218667f1bfaa4a10aec690c862de63bd Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Sat, 6 Jan 2024 02:35:00 +0530 Subject: [PATCH] feat: handle unsupported media on the backend (#8650) This PR logs additional information in content_attributes of a message in case it is unsupported. This info can be used by the client to render a fresh UI --- .../messages/instagram/message_builder.rb | 9 ++++++- app/models/message.rb | 2 +- .../instagram_message_create_event.rb | 27 +++++++++++++++++++ .../webhooks/instagram_events_job_spec.rb | 18 +++++++++++++ 4 files changed, 54 insertions(+), 2 deletions(-) diff --git a/app/builders/messages/instagram/message_builder.rb b/app/builders/messages/instagram/message_builder.rb index 5610e0671..e9debb767 100644 --- a/app/builders/messages/instagram/message_builder.rb +++ b/app/builders/messages/instagram/message_builder.rb @@ -48,6 +48,10 @@ class Messages::Instagram::MessageBuilder < Messages::Messenger::MessageBuilder @outgoing_echo ? recipient_id : sender_id end + def message_is_unsupported? + message[:is_unsupported].present? && @messaging[:message][:is_unsupported] == true + end + def sender_id @messaging[:sender][:id] end @@ -118,7 +122,7 @@ class Messages::Instagram::MessageBuilder < Messages::Messenger::MessageBuilder end def message_params - { + params = { account_id: conversation.account_id, inbox_id: conversation.inbox_id, message_type: message_type, @@ -129,6 +133,9 @@ class Messages::Instagram::MessageBuilder < Messages::Messenger::MessageBuilder in_reply_to_external_id: message_reply_attributes } } + + params[:content_attributes][:is_unsupported] = true if message_is_unsupported? + params end def already_sent_from_chatwoot? diff --git a/app/models/message.rb b/app/models/message.rb index 27d5b6046..751890acf 100644 --- a/app/models/message.rb +++ b/app/models/message.rb @@ -101,7 +101,7 @@ class Message < ApplicationRecord # [:external_error : Can specify if the message creation failed due to an error at external API store :content_attributes, accessors: [:submitted_email, :items, :submitted_values, :email, :in_reply_to, :deleted, :external_created_at, :story_sender, :story_id, :external_error, - :translations, :in_reply_to_external_id], coder: JSON + :translations, :in_reply_to_external_id, :is_unsupported], coder: JSON store :external_source_ids, accessors: [:slack], coder: JSON, prefix: :external_source_id diff --git a/spec/factories/instagram/instagram_message_create_event.rb b/spec/factories/instagram/instagram_message_create_event.rb index 7729c1d7a..00ca91e23 100644 --- a/spec/factories/instagram/instagram_message_create_event.rb +++ b/spec/factories/instagram/instagram_message_create_event.rb @@ -273,6 +273,33 @@ FactoryBot.define do initialize_with { attributes } end + factory :instagram_message_unsupported_event, class: Hash do + entry do + [ + { + 'id': 'instagram-message-unsupported-id-123', + 'time': '2021-09-08T06:34:04+0000', + 'messaging': [ + { + 'sender': { + 'id': 'Sender-id-1' + }, + 'recipient': { + 'id': 'chatwoot-app-user-id-1' + }, + 'timestamp': '2021-09-08T06:34:04+0000', + 'message': { + 'mid': 'unsupported-message-id-1', + 'is_unsupported': true + } + } + ] + } + ] + end + initialize_with { attributes } + end + factory :messaging_seen_event, class: Hash do entry do [ diff --git a/spec/jobs/webhooks/instagram_events_job_spec.rb b/spec/jobs/webhooks/instagram_events_job_spec.rb index 905810512..e77d654cc 100644 --- a/spec/jobs/webhooks/instagram_events_job_spec.rb +++ b/spec/jobs/webhooks/instagram_events_job_spec.rb @@ -28,6 +28,7 @@ describe Webhooks::InstagramEventsJob do let!(:story_mention_params) { build(:instagram_story_mention_event).with_indifferent_access } let!(:story_mention_echo_params) { build(:instagram_story_mention_event_with_echo).with_indifferent_access } let!(:messaging_seen_event) { build(:messaging_seen_event).with_indifferent_access } + let!(:unsupported_message_event) { build(:instagram_message_unsupported_event).with_indifferent_access } let(:fb_object) { double } describe '#perform' do @@ -45,6 +46,7 @@ describe Webhooks::InstagramEventsJob do expect(instagram_inbox.contacts.last.additional_attributes['social_profiles']['instagram']).to eq 'some_user_name' expect(instagram_inbox.conversations.count).to be 1 expect(instagram_inbox.messages.count).to be 1 + expect(instagram_inbox.messages.last.content_attributes['is_unsupported']).to be_nil end it 'creates standby message in the instagram inbox' do @@ -157,6 +159,22 @@ describe Webhooks::InstagramEventsJob do expect(Instagram::ReadStatusService).to receive(:new).with(params: messaging_seen_event[:entry][0][:messaging][0]).and_call_original instagram_webhook.perform_now(messaging_seen_event[:entry]) end + + it 'handles unsupported message' do + allow(Koala::Facebook::API).to receive(:new).and_return(fb_object) + allow(fb_object).to receive(:get_object).and_return( + return_object.with_indifferent_access + ) + + instagram_webhook.perform_now(unsupported_message_event[:entry]) + instagram_inbox.reload + + expect(instagram_inbox.contacts.count).to be 1 + expect(instagram_inbox.contacts.last.additional_attributes['social_profiles']['instagram']).to eq 'some_user_name' + expect(instagram_inbox.conversations.count).to be 1 + expect(instagram_inbox.messages.count).to be 1 + expect(instagram_inbox.messages.last.content_attributes['is_unsupported']).to be true + end end end end