From a9b09039903776ade7f32ac4975927ffda1b9d68 Mon Sep 17 00:00:00 2001 From: Muhsin Keloth Date: Thu, 10 Apr 2025 10:17:25 +0530 Subject: [PATCH] chore: add conversation ReplyService --- app/models/conversation.rb | 11 +--- app/services/conversations/reply_service.rb | 56 +++++++++++++++++++++ 2 files changed, 57 insertions(+), 10 deletions(-) create mode 100644 app/services/conversations/reply_service.rb diff --git a/app/models/conversation.rb b/app/models/conversation.rb index c2ca51c23..3fe56cbd4 100644 --- a/app/models/conversation.rb +++ b/app/models/conversation.rb @@ -115,16 +115,7 @@ class Conversation < ApplicationRecord delegate :auto_resolve_duration, to: :account def can_reply? - channel = inbox&.channel - - return can_reply_on_instagram_via_messenger? if instagram_via_messenger? - - return can_reply_on_instagram? if inbox.instagram_direct? - - return true unless channel&.messaging_window_enabled? - - messaging_window = inbox.api? ? channel.additional_attributes['agent_reply_time_window'].to_i : 24 - last_message_in_messaging_window?(messaging_window) + Conversations::ReplyService.new(self).can_reply? end def language diff --git a/app/services/conversations/reply_service.rb b/app/services/conversations/reply_service.rb new file mode 100644 index 000000000..9b1cefaed --- /dev/null +++ b/app/services/conversations/reply_service.rb @@ -0,0 +1,56 @@ +class Conversations::ReplyService + def initialize(conversation) + @conversation = conversation + end + + def can_reply? + channel = @conversation.inbox&.channel + + return can_reply_on_instagram_via_messenger? if instagram_via_messenger? + return can_reply_on_instagram? if @conversation.inbox.instagram_direct? + return true unless channel&.messaging_window_enabled? + + messaging_window = @conversation.inbox.api? ? channel.additional_attributes['agent_reply_time_window'].to_i : 24 + last_message_in_messaging_window?(messaging_window) + end + + private + + def last_message_in_messaging_window?(time) + return false if last_incoming_message.nil? + + Time.current < last_incoming_message.created_at + time.hours + end + + def instagram_via_messenger? + @conversation.additional_attributes['type'] == 'instagram_direct_message' + end + + def can_reply_on_instagram_via_messenger? + 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_in_messaging_window?(24) + end + end + + def can_reply_on_instagram? + global_config = GlobalConfig.get('ENABLE_INSTAGRAM_CHANNEL_HUMAN_AGENT') + + return false if last_incoming_message.nil? + + if global_config['ENABLE_INSTAGRAM_CHANNEL_HUMAN_AGENT'] + Time.current < last_incoming_message.created_at + 7.days + else + last_message_in_messaging_window?(24) + end + end + + def last_incoming_message + @conversation.messages&.incoming&.last + end +end