From 58f47eb02c8221d29a6ba2b4ae2510eafe107db5 Mon Sep 17 00:00:00 2001 From: Muhsin Keloth Date: Wed, 25 Oct 2023 21:29:25 +0530 Subject: [PATCH] feat: Handle Facebook send message/attachments errors (#8197) --- app/services/facebook/send_on_facebook_service.rb | 12 +++++++++++- .../facebook/send_on_facebook_service_spec.rb | 9 +++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/app/services/facebook/send_on_facebook_service.rb b/app/services/facebook/send_on_facebook_service.rb index 621bf57d5..776e8f5e8 100644 --- a/app/services/facebook/send_on_facebook_service.rb +++ b/app/services/facebook/send_on_facebook_service.rb @@ -15,7 +15,9 @@ class Facebook::SendOnFacebookService < Base::SendOnChannelService def send_message_to_facebook(delivery_params) result = Facebook::Messenger::Bot.deliver(delivery_params, page_id: channel.page_id) - message.update!(source_id: JSON.parse(result)['message_id']) + parsed_result = JSON.parse(result) + message.update!(status: :failed, external_error: external_error(parsed_result)) if parsed_result['error'].present? + message.update!(source_id: parsed_result['message_id']) if parsed_result['message_id'].present? end def fb_text_message_params @@ -27,6 +29,14 @@ class Facebook::SendOnFacebookService < Base::SendOnChannelService } end + def external_error(response) + # https://developers.facebook.com/docs/graph-api/guides/error-handling/ + error_message = response['error']['message'] + error_code = response['error']['code'] + + "#{error_code} - #{error_message}" + end + def fb_attachment_message_params attachment = message.attachments.first { diff --git a/spec/services/facebook/send_on_facebook_service_spec.rb b/spec/services/facebook/send_on_facebook_service_spec.rb index 39a194ca4..38d33e6d7 100644 --- a/spec/services/facebook/send_on_facebook_service_spec.rb +++ b/spec/services/facebook/send_on_facebook_service_spec.rb @@ -87,6 +87,15 @@ describe Facebook::SendOnFacebookService do tag: 'ACCOUNT_UPDATE' }, { page_id: facebook_channel.page_id }) end + + it 'if message sent from chatwoot is failed' do + message = create(:message, message_type: 'outgoing', inbox: facebook_inbox, account: account, conversation: conversation) + allow(bot).to receive(:deliver).and_return({ error: { message: 'Invalid OAuth access token.', type: 'OAuthException', code: 190, + fbtrace_id: 'BLBz/WZt8dN' } }.to_json) + described_class.new(message: message).perform + expect(bot).to have_received(:deliver) + expect(message.reload.status).to eq('failed') + end end end end