class Conversations::AssignmentService def initialize(conversation:, assignee_id:, assignee_type: nil) @conversation = conversation @assignee_id = assignee_id @assignee_type = assignee_type end def perform agent_bot_assignment? ? assign_agent_bot : assign_agent end private attr_reader :conversation, :assignee_id, :assignee_type def assign_agent conversation.with_lock do if assignee.present? && conversation.assignee_agent_bot_id.present? && conversation.pending? conversation.status = :open conversation.waiting_since = Time.current if conversation.waiting_since.blank? end conversation.assignee = assignee conversation.assignee_agent_bot = nil conversation.save! end assignee end def assign_agent_bot return unless agent_bot conversation.with_lock do conversation.assignee = nil conversation.assignee_agent_bot = agent_bot conversation.status = :pending conversation.save! end agent_bot end def assignee @assignee ||= conversation.account.users.find_by(id: assignee_id) end def agent_bot @agent_bot ||= AgentBot.accessible_to(conversation.account).find_by(id: assignee_id) end def agent_bot_assignment? assignee_type.to_s == 'AgentBot' end end