From 2f3bdbdea23b80aa30f79e45f2e55447f510468e Mon Sep 17 00:00:00 2001 From: Tejaswini Chile Date: Thu, 7 Jul 2022 18:02:18 +0530 Subject: [PATCH] fix: Handling facebook client error for deleted story (#4984) --- .../messages/messenger/message_builder.rb | 5 +++ config/locales/en.yml | 1 + .../instagram/message_builder_spec.rb | 31 ++++++++++++++++++- .../instagram_message_create_event.rb | 4 +-- .../webhooks/instagram_events_job_spec.rb | 5 ++- 5 files changed, 40 insertions(+), 6 deletions(-) diff --git a/app/builders/messages/messenger/message_builder.rb b/app/builders/messages/messenger/message_builder.rb index 27386c250..3c406f1e0 100644 --- a/app/builders/messages/messenger/message_builder.rb +++ b/app/builders/messages/messenger/message_builder.rb @@ -71,6 +71,11 @@ class Messages::Messenger::MessageBuilder rescue Koala::Facebook::AuthenticationError @inbox.channel.authorization_error! raise + rescue Koala::Facebook::ClientError => e + # The exception occurs when we are trying fetch the deleted story or blocked story. + @message.update(content: I18n.t('conversations.messages.instagram_deleted_story_content')) + Rails.logger.error e + {} rescue StandardError => e ChatwootExceptionTracker.new(e, account: @inbox.account).capture_exception {} diff --git a/config/locales/en.yml b/config/locales/en.yml index dea9f405f..c8315c08c 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -100,6 +100,7 @@ en: conversations: messages: instagram_story_content: "%{story_sender} mentioned you in the story: " + instagram_deleted_story_content: This story is no longer available. deleted: This message was deleted activity: status: diff --git a/spec/builders/messages/instagram/message_builder_spec.rb b/spec/builders/messages/instagram/message_builder_spec.rb index 857fefe69..20b7d777d 100644 --- a/spec/builders/messages/instagram/message_builder_spec.rb +++ b/spec/builders/messages/instagram/message_builder_spec.rb @@ -5,12 +5,14 @@ describe ::Messages::Instagram::MessageBuilder do before do stub_request(:post, /graph.facebook.com/) + stub_request(:get, 'https://www.example.com/test.jpeg') end let!(:account) { create(:account) } let!(:instagram_channel) { create(:channel_instagram_fb_page, account: account, instagram_id: 'chatwoot-app-user-id-1') } let!(:instagram_inbox) { create(:inbox, channel: instagram_channel, account: account, greeting_enabled: false) } let!(:dm_params) { build(:instagram_message_create_event).with_indifferent_access } + let!(:story_mention_params) { build(:instagram_story_mention_event).with_indifferent_access } let(:fb_object) { double } let(:contact) { create(:contact, id: 'Sender-id-1', name: 'Jane Dae') } let(:contact_inbox) { create(:contact_inbox, contact_id: contact.id, inbox_id: instagram_inbox.id, source_id: 'Sender-id-1') } @@ -28,7 +30,7 @@ describe ::Messages::Instagram::MessageBuilder do ) messaging = dm_params[:entry][0]['messaging'][0] contact_inbox - instagram_message_builder.new(messaging, instagram_inbox).perform + described_class.new(messaging, instagram_inbox).perform instagram_inbox.reload @@ -41,5 +43,32 @@ describe ::Messages::Instagram::MessageBuilder do expect(contact.name).to eq('Jane Dae') expect(message.content).to eq('This is the first message from the customer') end + + it 'raises exception on deleted story' do + allow(Koala::Facebook::API).to receive(:new).and_return(fb_object) + allow(fb_object).to receive(:get_object).and_raise(Koala::Facebook::ClientError.new( + 190, + 'This Message has been deleted by the user or the business.' + )) + + messaging = story_mention_params[:entry][0][:messaging][0] + contact_inbox + described_class.new(messaging, instagram_inbox, outgoing_echo: false).perform + + instagram_inbox.reload + + # we would have contact created, message created but the empty message because the story mention has been deleted later + # As they show it in instagram that this story is no longer available + # and external attachments link would be reachable + expect(instagram_inbox.conversations.count).to be 1 + expect(instagram_inbox.messages.count).to be 1 + + contact = instagram_channel.inbox.contacts.first + message = instagram_channel.inbox.messages.first + + expect(contact.name).to eq('Jane Dae') + expect(message.content).to eq('This story is no longer available.') + expect(message.attachments.count).to eq(1) + end end end diff --git a/spec/factories/instagram/instagram_message_create_event.rb b/spec/factories/instagram/instagram_message_create_event.rb index b62797630..f52e8f268 100644 --- a/spec/factories/instagram/instagram_message_create_event.rb +++ b/spec/factories/instagram/instagram_message_create_event.rb @@ -104,7 +104,7 @@ FactoryBot.define do { 'type': 'share', 'payload': { - 'url': 'https://imagekit.io/blog/content/images/2020/05/media_library.jpeg' + 'url': 'https://www.example.com/test.jpeg' } } ] @@ -138,7 +138,7 @@ FactoryBot.define do { 'type': 'story_mention', 'payload': { - 'url': 'https://imagekit.io/blog/content/images/2020/05/media_library.jpeg' + 'url': 'https://www.example.com/test.jpeg' } } ] diff --git a/spec/jobs/webhooks/instagram_events_job_spec.rb b/spec/jobs/webhooks/instagram_events_job_spec.rb index 69952920a..850c3730b 100644 --- a/spec/jobs/webhooks/instagram_events_job_spec.rb +++ b/spec/jobs/webhooks/instagram_events_job_spec.rb @@ -6,7 +6,7 @@ describe Webhooks::InstagramEventsJob do before do stub_request(:post, /graph.facebook.com/) - stub_request(:get, 'https://imagekit.io/blog/content/images/2020/05/media_library.jpeg') + stub_request(:get, 'https://www.example.com/test.jpeg') .with( headers: { 'Accept' => '*/*', @@ -102,8 +102,7 @@ describe Webhooks::InstagramEventsJob do { story: { mention: { - link: - 'https://lookaside.fbsbx.com/ig_messaging_cdn/?asset_id=17920786367196703&signature=Aby8EXbvNu4on9efDQecXDasiJX2s0FgWhFGz3mNFB__CsHR22O_1bJiYHkbp3mC1NQeW4jHxls9WyqVgRPcyonUbSJmD44UwLfFhbCK2obesWnFi7VOnisqLu48Xd6KYuNex7uSCQKWM-nw55zQ23bBgfCYw6h5hiJjFHwJDZYm65zXpQ', + link: 'https://www.example.com/test.jpeg', id: '17920786367196703' } },