-
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Chore: Refactor round robin logic (#1015)
Co-authored-by: Pranav Raj S <[email protected]>
- Loading branch information
1 parent
49db9c5
commit 0fc0dc1
Showing
18 changed files
with
192 additions
and
69 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
class RoundRobin::AssignmentService | ||
pattr_initialize [:conversation] | ||
|
||
def perform | ||
# online agents will get priority | ||
new_assignee = round_robin_manage_service.available_agent(priority_list: online_agents) | ||
conversation.update(assignee: new_assignee) if new_assignee | ||
end | ||
|
||
private | ||
|
||
def online_agents | ||
online_agents = OnlineStatusTracker.get_available_users(conversation.account_id) | ||
online_agents.select { |_key, value| value.eql?('online') }.keys if online_agents.present? | ||
end | ||
|
||
def round_robin_manage_service | ||
@round_robin_manage_service ||= RoundRobin::ManageService.new(inbox: conversation.inbox) | ||
end | ||
|
||
def round_robin_key | ||
format(::Redis::Alfred::ROUND_ROBIN_AGENTS, inbox_id: conversation.inbox_id) | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
class RoundRobin::ManageService | ||
pattr_initialize [:inbox!] | ||
|
||
# called on inbox delete | ||
def clear_queue | ||
::Redis::Alfred.delete(round_robin_key) | ||
end | ||
|
||
# called on inbox member create | ||
def add_agent_to_queue(user_id) | ||
::Redis::Alfred.lpush(round_robin_key, user_id) | ||
end | ||
|
||
# called on inbox member delete | ||
def remove_agent_from_queue(user_id) | ||
::Redis::Alfred.lrem(round_robin_key, user_id) | ||
end | ||
|
||
def available_agent(priority_list: []) | ||
reset_queue unless validate_queue? | ||
user_id = get_agent_via_priority_list(priority_list) | ||
# incase priority list was empty or inbox members weren't present | ||
user_id ||= ::Redis::Alfred.rpoplpush(round_robin_key, round_robin_key) | ||
inbox.inbox_members.find_by(user_id: user_id)&.user if user_id.present? | ||
end | ||
|
||
def reset_queue | ||
clear_queue | ||
add_agent_to_queue(inbox.inbox_members.map(&:user_id)) | ||
end | ||
|
||
private | ||
|
||
def get_agent_via_priority_list(priority_list) | ||
return if priority_list.blank? | ||
|
||
user_id = queue.intersection(priority_list.map(&:to_s)).pop | ||
if user_id.present? | ||
remove_agent_from_queue(user_id) | ||
add_agent_to_queue(user_id) | ||
end | ||
user_id | ||
end | ||
|
||
def validate_queue? | ||
return true if inbox.inbox_members.map(&:user_id).sort == queue.sort.map(&:to_i) | ||
end | ||
|
||
def queue | ||
::Redis::Alfred.lrange(round_robin_key) | ||
end | ||
|
||
def round_robin_key | ||
format(::Redis::Alfred::ROUND_ROBIN_AGENTS, inbox_id: inbox.id) | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
module Redis::RedisKeys | ||
ROUND_ROBIN_AGENTS = 'ROUND_ROBIN_AGENTS:%<inbox_id>d'.freeze | ||
|
||
CONVERSATION_MAILER_KEY = 'CONVERSATION::%<conversation_id>d'.freeze | ||
|
||
## Online Status Keys | ||
# hash containing user_id key and status as value | ||
ONLINE_STATUS = 'ONLINE_STATUS::%<account_id>d'.freeze | ||
# sorted set storing online presense of account contacts | ||
ONLINE_PRESENCE_CONTACTS = 'ONLINE_PRESENCE::%<account_id>d::CONTACTS'.freeze | ||
# sorted set storing online presense of account users | ||
ONLINE_PRESENCE_USERS = 'ONLINE_PRESENCE::%<account_id>d::USERS'.freeze | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -108,6 +108,7 @@ | |
end | ||
|
||
before do | ||
create(:inbox_member, inbox: inbox, user: agent) | ||
allow(Redis::Alfred).to receive(:rpoplpush).and_return(agent.id) | ||
end | ||
|
||
|
@@ -141,9 +142,11 @@ | |
conversation.status = 'resolved' | ||
conversation.save! | ||
expect(conversation.reload.assignee).to eq(agent) | ||
inbox.inbox_members.where(user_id: agent.id).first.destroy! | ||
|
||
# round robin changes assignee in this case since agent doesn't have access to inbox | ||
agent2 = create(:user, email: '[email protected]', account: account) | ||
create(:inbox_member, inbox: inbox, user: agent2) | ||
allow(Redis::Alfred).to receive(:rpoplpush).and_return(agent2.id) | ||
conversation.status = 'open' | ||
conversation.save! | ||
|
Oops, something went wrong.