diff --git a/app/builders/messages/messenger/message_builder.rb b/app/builders/messages/messenger/message_builder.rb
index 08aa58be0..2e58825f4 100644
--- a/app/builders/messages/messenger/message_builder.rb
+++ b/app/builders/messages/messenger/message_builder.rb
@@ -1,10 +1,14 @@
class Messages::Messenger::MessageBuilder
+ include ::FileTypeHelper
+
def process_attachment(attachment)
return if attachment['type'].to_sym == :template
attachment_obj = @message.attachments.new(attachment_params(attachment).except(:remote_file_url))
attachment_obj.save!
attach_file(attachment_obj, attachment_params(attachment)[:remote_file_url]) if attachment_params(attachment)[:remote_file_url]
+ fetch_story_link(attachment_obj) if attachment_obj.file_type == 'story_mention'
+ update_attachment_file_type(attachment_obj)
end
def attach_file(attachment, file_url)
@@ -22,7 +26,7 @@ class Messages::Messenger::MessageBuilder
file_type = attachment['type'].to_sym
params = { file_type: file_type, account_id: @message.account_id }
- if [:image, :file, :audio, :video].include? file_type
+ if [:image, :file, :audio, :video, :share, :story_mention].include? file_type
params.merge!(file_type_params(attachment))
elsif file_type == :location
params.merge!(location_params(attachment))
@@ -39,4 +43,31 @@ class Messages::Messenger::MessageBuilder
remote_file_url: attachment['payload']['url']
}
end
+
+ def update_attachment_file_type(attachment)
+ return unless attachment.file_type == 'share' || attachment.file_type == 'story_mention'
+
+ attachment.file_type = file_type(attachment.file&.content_type)
+ attachment.save!
+ end
+
+ def fetch_story_link(attachment)
+ message = attachment.message
+ begin
+ k = Koala::Facebook::API.new(@inbox.channel.page_access_token) if @inbox.facebook?
+ result = k.get_object(message.source_id, fields: %w[story from]) || {}
+ rescue Koala::Facebook::AuthenticationError
+ @inbox.channel.authorization_error!
+ raise
+ rescue StandardError => e
+ result = {}
+ Sentry.capture_exception(e)
+ end
+ story_id = result['story']['mention']['id']
+ story_sender = result['from']['username']
+ message.content_attributes[:story_sender] = story_sender
+ message.content_attributes[:story_id] = story_id
+ message.content = I18n.t('conversations.messages.instagram_story_content', story_sender: story_sender)
+ message.save!
+ end
end
diff --git a/app/helpers/file_type_helper.rb b/app/helpers/file_type_helper.rb
index 9e822b6c4..db3f6249d 100644
--- a/app/helpers/file_type_helper.rb
+++ b/app/helpers/file_type_helper.rb
@@ -14,7 +14,8 @@ module FileTypeHelper
'image/png',
'image/gif',
'image/bmp',
- 'image/webp'
+ 'image/webp',
+ 'image'
].include?(content_type)
end
@@ -23,7 +24,8 @@ module FileTypeHelper
'video/ogg',
'video/mp4',
'video/webm',
- 'video/quicktime'
+ 'video/quicktime',
+ 'video'
].include?(content_type)
end
end
diff --git a/app/javascript/dashboard/components/widgets/conversation/Message.vue b/app/javascript/dashboard/components/widgets/conversation/Message.vue
index 145660c07..8828b5bb5 100644
--- a/app/javascript/dashboard/components/widgets/conversation/Message.vue
+++ b/app/javascript/dashboard/components/widgets/conversation/Message.vue
@@ -50,7 +50,10 @@
@@ -64,6 +65,7 @@
class="message--unread"
:data="message"
:is-a-tweet="isATweet"
+ :has-instagram-story="hasInstagramStory"
/>
+
+
+
'*/*',
+ 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
+ 'User-Agent' => 'Down/5.3.0'
+ }
+ )
+ .to_return(status: 200, body: '', headers: {})
end
let!(:account) { create(:account) }
+ let(:return_onject) do
+ { name: 'Jane',
+ id: 'Sender-id-1',
+ account_id: instagram_inbox.account_id,
+ profile_pic: 'https://chatwoot-assets.local/sample.png' }
+ end
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!(:test_params) { build(:instagram_test_text_event).with_indifferent_access }
+ let!(:attachment_params) { build(:instagram_message_attachment_event).with_indifferent_access }
+ let!(:story_mention_params) { build(:instagram_story_mention_event).with_indifferent_access }
let(:fb_object) { double }
describe '#perform' do
@@ -20,12 +37,7 @@ describe Webhooks::InstagramEventsJob do
it 'creates incoming message in the instagram inbox' do
allow(Koala::Facebook::API).to receive(:new).and_return(fb_object)
allow(fb_object).to receive(:get_object).and_return(
- {
- name: 'Jane',
- id: 'Sender-id-1',
- account_id: instagram_inbox.account_id,
- profile_pic: 'https://chatwoot-assets.local/sample.png'
- }.with_indifferent_access
+ return_onject.with_indifferent_access
)
instagram_webhook.perform_now(dm_params[:entry])
@@ -39,12 +51,7 @@ describe Webhooks::InstagramEventsJob do
it 'creates test text message in the instagram inbox' do
allow(Koala::Facebook::API).to receive(:new).and_return(fb_object)
allow(fb_object).to receive(:get_object).and_return(
- {
- name: 'Jane',
- id: 'Sender-id-1',
- account_id: instagram_inbox.account_id,
- profile_pic: 'https://chatwoot-assets.local/sample.png'
- }.with_indifferent_access
+ return_onject.with_indifferent_access
)
instagram_webhook.perform_now(test_params[:entry])
@@ -53,6 +60,46 @@ describe Webhooks::InstagramEventsJob do
expect(instagram_inbox.messages.count).to be 1
expect(instagram_inbox.messages.last.content).to eq('This is a test message from facebook.')
end
+
+ it 'creates incoming message with attachments in the instagram inbox' do
+ allow(Koala::Facebook::API).to receive(:new).and_return(fb_object)
+ allow(fb_object).to receive(:get_object).and_return(
+ return_onject.with_indifferent_access
+ )
+ instagram_webhook.perform_now(attachment_params[:entry])
+
+ instagram_inbox.reload
+
+ expect(instagram_inbox.contacts.count).to be 1
+ expect(instagram_inbox.messages.count).to be 1
+ expect(instagram_inbox.messages.last.attachments.count).to be 1
+ end
+
+ it 'creates incoming message with attachments in the instagram inbox for story mention' do
+ allow(Koala::Facebook::API).to receive(:new).and_return(fb_object)
+ allow(fb_object).to receive(:get_object).and_return(
+ return_onject.with_indifferent_access,
+ { story:
+ {
+ mention: {
+ link:
+ 'https://lookaside.fbsbx.com/ig_messaging_cdn/?asset_id=17920786367196703&signature=Aby8EXbvNu4on9efDQecXDasiJX2s0FgWhFGz3mNFB__CsHR22O_1bJiYHkbp3mC1NQeW4jHxls9WyqVgRPcyonUbSJmD44UwLfFhbCK2obesWnFi7VOnisqLu48Xd6KYuNex7uSCQKWM-nw55zQ23bBgfCYw6h5hiJjFHwJDZYm65zXpQ',
+ id: '17920786367196703'
+ }
+ },
+ from: {
+ username: 'Sender-id-1', id: 'Sender-id-1'
+ },
+ id: 'instagram-message-id-1234' }.with_indifferent_access
+ )
+
+ instagram_webhook.perform_now(story_mention_params[:entry])
+
+ instagram_inbox.reload
+
+ expect(instagram_inbox.messages.count).to be 1
+ expect(instagram_inbox.messages.last.attachments.count).to be 1
+ end
end
end
end