chore: mark conversation notifications as read on visit (#13906)

This commit is contained in:
Sivin Varghese
2026-03-26 14:01:26 +05:30
committed by GitHub
parent e4c3f0ac2f
commit 23786bcb52
3 changed files with 44 additions and 0 deletions

View File

@@ -116,6 +116,8 @@ class Api::V1::Accounts::ConversationsController < Api::V1::Accounts::BaseContro
# High-traffic accounts generate excessive DB writes when agents frequently switch between conversations.
# Throttle last_seen updates to once per hour when there are no unread messages to reduce DB load.
# Always update immediately if there are unread messages to maintain accurate read/unread state.
# Visiting a conversation should clear any unread inbox notifications for this conversation.
Notification::MarkConversationReadService.new(user: Current.user, account: Current.account, conversation: @conversation).perform
return update_last_seen_on_conversation(DateTime.now.utc, true) if assignee? && @conversation.assignee_unread_messages.any?
return update_last_seen_on_conversation(DateTime.now.utc, false) if !assignee? && @conversation.unread_messages.any?

View File

@@ -0,0 +1,25 @@
class Notification::MarkConversationReadService
pattr_initialize [:user!, :account!, :conversation!]
def perform
return unless user.is_a?(User)
notifications.find_each do |notification|
notification.update!(read_at: read_at)
end
end
private
def notifications
user.notifications.where(
account: account,
primary_actor: conversation,
read_at: nil
)
end
def read_at
@read_at ||= Time.current
end
end