diff --git a/app/models/conversation.rb b/app/models/conversation.rb index 643f8fa56..cd45adf7b 100644 --- a/app/models/conversation.rb +++ b/app/models/conversation.rb @@ -93,7 +93,7 @@ class Conversation < ApplicationRecord delegate :auto_resolve_duration, to: :account def can_reply? - return last_message_less_than_24_hrs? if additional_attributes['type'] == 'instagram_direct_message' + return can_reply_on_instagram? if additional_attributes['type'] == 'instagram_direct_message' return true unless inbox&.channel&.has_24_hour_messaging_window? @@ -112,6 +112,18 @@ class Conversation < ApplicationRecord Time.current < last_incoming_message.created_at + 24.hours end + def can_reply_on_instagram? + global_config = GlobalConfig.get('ENABLE_MESSENGER_CHANNEL_HUMAN_AGENT') + + return false if last_incoming_message.nil? + + if global_config['ENABLE_MESSENGER_CHANNEL_HUMAN_AGENT'] + Time.current < last_incoming_message.created_at + 7.days + else + last_message_less_than_24_hrs? + end + end + def update_assignee(agent = nil) update!(assignee: agent) end diff --git a/app/services/instagram/send_on_instagram_service.rb b/app/services/instagram/send_on_instagram_service.rb index 2ad7c9042..fbd3c44bf 100644 --- a/app/services/instagram/send_on_instagram_service.rb +++ b/app/services/instagram/send_on_instagram_service.rb @@ -23,17 +23,19 @@ class Instagram::SendOnInstagramService < Base::SendOnChannelService end def message_params - { + params = { recipient: { id: contact.get_source_id(inbox.id) }, message: { text: message.content } } + + merge_human_agent_tag(params) end def attachament_message_params attachment = message.attachments.first - { + params = { recipient: { id: contact.get_source_id(inbox.id) }, message: { attachment: { @@ -44,6 +46,8 @@ class Instagram::SendOnInstagramService < Base::SendOnChannelService } } } + + merge_human_agent_tag(params) end # Deliver a message with the given payload. @@ -96,4 +100,14 @@ class Instagram::SendOnInstagramService < Base::SendOnChannelService def config Facebook::Messenger.config end + + def merge_human_agent_tag(params) + global_config = GlobalConfig.get('ENABLE_MESSENGER_CHANNEL_HUMAN_AGENT') + + return params unless global_config['ENABLE_MESSENGER_CHANNEL_HUMAN_AGENT'] + + params[:messaging_type] = 'MESSAGE_TAG' + params[:tag] = 'HUMAN_AGENT' + params + end end diff --git a/config/installation_config.yml b/config/installation_config.yml index a80776715..e95c6da2c 100644 --- a/config/installation_config.yml +++ b/config/installation_config.yml @@ -59,3 +59,6 @@ - name: DISABLE_USER_PROFILE_UPDATE value: false locked: false +- name: ENABLE_MESSENGER_CHANNEL_HUMAN_AGENT + value: false + locked: false diff --git a/spec/models/conversation_spec.rb b/spec/models/conversation_spec.rb index 8c278a81b..e83ee5195 100644 --- a/spec/models/conversation_spec.rb +++ b/spec/models/conversation_spec.rb @@ -512,6 +512,38 @@ RSpec.describe Conversation, type: :model do ) expect(conversation.can_reply?).to eq true end + + context 'when instagram channel' do + it 'return true with HUMAN_AGENT if it is outside of 24 hour window' do + InstallationConfig.where(name: 'ENABLE_MESSENGER_CHANNEL_HUMAN_AGENT').first_or_create(value: true) + + conversation.update(additional_attributes: { type: 'instagram_direct_message' }) + create( + :message, + account: conversation.account, + inbox: facebook_inbox, + conversation: conversation, + created_at: Time.now - 48.hours + ) + + expect(conversation.can_reply?).to eq true + end + + it 'return false without HUMAN_AGENT if it is outside of 24 hour window' do + InstallationConfig.where(name: 'ENABLE_MESSENGER_CHANNEL_HUMAN_AGENT').first_or_create(value: false) + + conversation.update(additional_attributes: { type: 'instagram_direct_message' }) + create( + :message, + account: conversation.account, + inbox: facebook_inbox, + conversation: conversation, + created_at: Time.now - 48.hours + ) + + expect(conversation.can_reply?).to eq false + end + end end end diff --git a/spec/services/instagram/send_on_instagram_service_spec.rb b/spec/services/instagram/send_on_instagram_service_spec.rb index 1606f27d1..f42efa1df 100644 --- a/spec/services/instagram/send_on_instagram_service_spec.rb +++ b/spec/services/instagram/send_on_instagram_service_spec.rb @@ -27,21 +27,68 @@ describe Instagram::SendOnInstagramService do ) end - it 'if message is sent from chatwoot and is outgoing' do - message = create(:message, message_type: 'outgoing', inbox: instagram_inbox, account: account, conversation: conversation) - response = ::Instagram::SendOnInstagramService.new(message: message).perform + context 'without message_tag HUMAN_AGENT' do + before do + InstallationConfig.where(name: 'ENABLE_MESSENGER_CHANNEL_HUMAN_AGENT').first_or_create(value: false) + end - expect(response).to eq({ message_id: 'anyrandommessageid1234567890' }) + it 'if message is sent from chatwoot and is outgoing' do + message = create(:message, message_type: 'outgoing', inbox: instagram_inbox, account: account, conversation: conversation) + + allow(HTTParty).to receive(:post).with( + { + recipient: { id: contact.get_source_id(instagram_inbox.id) }, + message: { + text: message.content + } + } + ).and_return( + { + 'message_id': 'anyrandommessageid1234567890' + } + ) + + response = ::Instagram::SendOnInstagramService.new(message: message).perform + + expect(response).to eq({ message_id: 'anyrandommessageid1234567890' }) + end + + it 'if message with attachment is sent from chatwoot and is outgoing' do + message = build(:message, message_type: 'outgoing', inbox: instagram_inbox, account: account, conversation: conversation) + attachment = message.attachments.new(account_id: message.account_id, file_type: :image) + attachment.file.attach(io: File.open(Rails.root.join('spec/assets/avatar.png')), filename: 'avatar.png', content_type: 'image/png') + message.save! + response = ::Instagram::SendOnInstagramService.new(message: message).perform + + expect(response).to eq({ message_id: 'anyrandommessageid1234567890' }) + end end - it 'if message with attachment is sent from chatwoot and is outgoing' do - message = build(:message, message_type: 'outgoing', inbox: instagram_inbox, account: account, conversation: conversation) - attachment = message.attachments.new(account_id: message.account_id, file_type: :image) - attachment.file.attach(io: File.open(Rails.root.join('spec/assets/avatar.png')), filename: 'avatar.png', content_type: 'image/png') - message.save! - response = ::Instagram::SendOnInstagramService.new(message: message).perform + context 'with message_tag HUMAN_AGENT' do + before do + InstallationConfig.where(name: 'ENABLE_MESSENGER_CHANNEL_HUMAN_AGENT').first_or_create(value: true) + end - expect(response).to eq({ message_id: 'anyrandommessageid1234567890' }) + it 'if message is sent from chatwoot and is outgoing' do + message = create(:message, message_type: 'outgoing', inbox: instagram_inbox, account: account, conversation: conversation) + + allow(HTTParty).to receive(:post).with( + { + recipient: { id: contact.get_source_id(instagram_inbox.id) }, + message: { + text: message.content + }, + messaging_type: 'MESSAGE_TAG', + tag: 'HUMAN_AGENT' + } + ).and_return( + { + 'message_id': 'anyrandommessageid1234567890' + } + ) + + ::Instagram::SendOnInstagramService.new(message: message).perform + end end end end