From 4fc62ed9ae91108bab698f8d67d4404dd1c98bf2 Mon Sep 17 00:00:00 2001 From: Muhsin Keloth Date: Wed, 25 Oct 2023 21:26:09 +0530 Subject: [PATCH] feat: Handle Instagram send message/attachments errors (#8174) Co-authored-by: Pranav Raj S --- .../instagram/send_on_instagram_service.rb | 18 ++++++++++++++++-- .../send_on_instagram_service_spec.rb | 19 +++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/app/services/instagram/send_on_instagram_service.rb b/app/services/instagram/send_on_instagram_service.rb index e7a061330..df24c1c25 100644 --- a/app/services/instagram/send_on_instagram_service.rb +++ b/app/services/instagram/send_on_instagram_service.rb @@ -66,12 +66,26 @@ class Instagram::SendOnInstagramService < Base::SendOnChannelService query: query ) - Rails.logger.error("Instagram response: #{response['error']} : #{message_content}") if response['error'] - message.update!(source_id: response['message_id']) if response['message_id'].present? + if response[:error].present? + Rails.logger.error("Instagram response: #{response['error']} : #{message_content}") + message.status = :failed + message.external_error = external_error(response) + end + + message.source_id = response['message_id'] if response['message_id'].present? + message.save! response end + def external_error(response) + # https://developers.facebook.com/docs/instagram-api/reference/error-codes/ + error_message = response[:error][:message] + error_code = response[:error][:code] + + "#{error_code} - #{error_message}" + end + def calculate_app_secret_proof(app_secret, access_token) Facebook::Messenger::Configuration::AppSecretProofCalculator.call( app_secret, access_token diff --git a/spec/services/instagram/send_on_instagram_service_spec.rb b/spec/services/instagram/send_on_instagram_service_spec.rb index ee553a7d8..f95d452eb 100644 --- a/spec/services/instagram/send_on_instagram_service_spec.rb +++ b/spec/services/instagram/send_on_instagram_service_spec.rb @@ -62,6 +62,25 @@ describe Instagram::SendOnInstagramService do expect(response).to eq({ message_id: 'anyrandommessageid1234567890' }) end + + it 'if message sent from chatwoot is failed' do + message = create(:message, message_type: 'outgoing', inbox: instagram_inbox, account: account, conversation: conversation) + + allow(HTTParty).to receive(:post).and_return( + { + 'error': { + 'message': 'The Instagram account is restricted.', + 'type': 'OAuthException', + 'code': 400, + 'fbtrace_id': 'anyrandomfbtraceid1234567890' + } + } + ) + described_class.new(message: message).perform + expect(HTTParty).to have_received(:post) + expect(message.reload.status).to eq('failed') + expect(message.reload.external_error).to eq('400 - The Instagram account is restricted.') + end end context 'with message_tag HUMAN_AGENT' do