chatwoot-develop/enterprise/app/jobs/captain/conversation/debounce_response_job.rb
2026-01-19 19:26:23 -03:00

32 lines
1.2 KiB
Ruby

class Captain::Conversation::DebounceResponseJob < ApplicationJob
queue_as :default
def perform(conversation_id, assistant_id, scheduled_timestamp)
current_timestamp = Redis::Alfred.get(debounce_key(conversation_id))
return if current_timestamp.blank?
# If the key has been updated since we were scheduled, it means a newer message arrived.
# We let the newer job handle it.
if current_timestamp.to_f > scheduled_timestamp
Rails.logger.info "[Captain][Debounce] Skipping job for Conv #{conversation_id} (Timestamp mismatch: #{current_timestamp} > #{scheduled_timestamp})"
return
end
conversation = Conversation.find_by(id: conversation_id)
assistant = Captain::Assistant.find_by(id: assistant_id)
if conversation && assistant
Rails.logger.info "[Captain][Debounce] Processing response for Conv #{conversation_id}"
Captain::Conversation::ResponseBuilderJob.perform_now(conversation, assistant)
else
Rails.logger.warn "[Captain][Debounce] Conversation or Assistant not found for Conv #{conversation_id}"
end
end
private
def debounce_key(conversation_id)
"captain:debounce:conversation:#{conversation_id}"
end
end