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
This commit is contained in:
@@ -48,6 +48,10 @@ class Messages::Instagram::MessageBuilder < Messages::Messenger::MessageBuilder
|
|||||||
@outgoing_echo ? recipient_id : sender_id
|
@outgoing_echo ? recipient_id : sender_id
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def message_is_unsupported?
|
||||||
|
message[:is_unsupported].present? && @messaging[:message][:is_unsupported] == true
|
||||||
|
end
|
||||||
|
|
||||||
def sender_id
|
def sender_id
|
||||||
@messaging[:sender][:id]
|
@messaging[:sender][:id]
|
||||||
end
|
end
|
||||||
@@ -118,7 +122,7 @@ class Messages::Instagram::MessageBuilder < Messages::Messenger::MessageBuilder
|
|||||||
end
|
end
|
||||||
|
|
||||||
def message_params
|
def message_params
|
||||||
{
|
params = {
|
||||||
account_id: conversation.account_id,
|
account_id: conversation.account_id,
|
||||||
inbox_id: conversation.inbox_id,
|
inbox_id: conversation.inbox_id,
|
||||||
message_type: message_type,
|
message_type: message_type,
|
||||||
@@ -129,6 +133,9 @@ class Messages::Instagram::MessageBuilder < Messages::Messenger::MessageBuilder
|
|||||||
in_reply_to_external_id: message_reply_attributes
|
in_reply_to_external_id: message_reply_attributes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
params[:content_attributes][:is_unsupported] = true if message_is_unsupported?
|
||||||
|
params
|
||||||
end
|
end
|
||||||
|
|
||||||
def already_sent_from_chatwoot?
|
def already_sent_from_chatwoot?
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ class Message < ApplicationRecord
|
|||||||
# [:external_error : Can specify if the message creation failed due to an error at external API
|
# [: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,
|
store :content_attributes, accessors: [:submitted_email, :items, :submitted_values, :email, :in_reply_to, :deleted,
|
||||||
:external_created_at, :story_sender, :story_id, :external_error,
|
: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
|
store :external_source_ids, accessors: [:slack], coder: JSON, prefix: :external_source_id
|
||||||
|
|
||||||
|
|||||||
@@ -273,6 +273,33 @@ FactoryBot.define do
|
|||||||
initialize_with { attributes }
|
initialize_with { attributes }
|
||||||
end
|
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
|
factory :messaging_seen_event, class: Hash do
|
||||||
entry do
|
entry do
|
||||||
[
|
[
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ describe Webhooks::InstagramEventsJob do
|
|||||||
let!(:story_mention_params) { build(:instagram_story_mention_event).with_indifferent_access }
|
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!(: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!(: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 }
|
let(:fb_object) { double }
|
||||||
|
|
||||||
describe '#perform' do
|
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.contacts.last.additional_attributes['social_profiles']['instagram']).to eq 'some_user_name'
|
||||||
expect(instagram_inbox.conversations.count).to be 1
|
expect(instagram_inbox.conversations.count).to be 1
|
||||||
expect(instagram_inbox.messages.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
|
end
|
||||||
|
|
||||||
it 'creates standby message in the instagram inbox' do
|
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
|
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])
|
instagram_webhook.perform_now(messaging_seen_event[:entry])
|
||||||
end
|
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
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user