## Description Adds the account-level `unread_count_for_filters` feature flag as the dark-launch gate for filtered sidebar unread counts. This reuses the deprecated `quoted_email_reply` flag slot, resets the reused bit for existing accounts, and removes stale defaults so new accounts do not reference the old flag. This also adds the feature where we are now calculating the unread counts for built in filters like mentions, participating and unattended along with unread count for saved filters/folders. Closes [CW-7262](https://linear.app/chatwoot/issue/CW-7262/unread-counts-for-filters-folders) ## Type of change - [ ] Bug fix (non-breaking change which fixes an issue) - [x] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality not to work as expected) - [ ] This change requires a documentation update
105 lines
3.4 KiB
Ruby
105 lines
3.4 KiB
Ruby
# == Schema Information
|
|
#
|
|
# Table name: account_users
|
|
#
|
|
# id :bigint not null, primary key
|
|
# active_at :datetime
|
|
# auto_offline :boolean default(TRUE), not null
|
|
# availability :integer default("online"), not null
|
|
# role :integer default("agent")
|
|
# created_at :datetime not null
|
|
# updated_at :datetime not null
|
|
# account_id :bigint
|
|
# agent_capacity_policy_id :bigint
|
|
# custom_role_id :bigint
|
|
# inviter_id :bigint
|
|
# user_id :bigint
|
|
#
|
|
# Indexes
|
|
#
|
|
# index_account_users_on_account_id (account_id)
|
|
# index_account_users_on_agent_capacity_policy_id (agent_capacity_policy_id)
|
|
# index_account_users_on_custom_role_id (custom_role_id)
|
|
# index_account_users_on_user_id (user_id)
|
|
# uniq_user_id_per_account_id (account_id,user_id) UNIQUE
|
|
#
|
|
|
|
class AccountUser < ApplicationRecord
|
|
include AvailabilityStatusable
|
|
|
|
belongs_to :account
|
|
belongs_to :user
|
|
belongs_to :inviter, class_name: 'User', optional: true
|
|
|
|
enum role: { agent: 0, administrator: 1 }
|
|
enum availability: { online: 0, offline: 1, busy: 2 }
|
|
|
|
accepts_nested_attributes_for :account
|
|
|
|
after_create_commit :notify_creation, :create_notification_setting
|
|
after_destroy :notify_deletion, :remove_user_from_account
|
|
after_save :update_presence_in_redis, if: :saved_change_to_availability?
|
|
after_commit :invalidate_filtered_unread_count_visibility, on: [:create, :destroy]
|
|
after_update_commit :invalidate_filtered_unread_count_visibility_update, if: :filtered_unread_count_visibility_changed?
|
|
|
|
validates :user_id, uniqueness: { scope: :account_id }
|
|
|
|
def create_notification_setting
|
|
setting = user.notification_settings.new(account_id: account.id)
|
|
setting.selected_email_flags = [:email_conversation_assignment]
|
|
setting.selected_push_flags = [:push_conversation_assignment]
|
|
setting.save!
|
|
end
|
|
|
|
def remove_user_from_account
|
|
::Agents::DestroyJob.perform_later(account, user)
|
|
end
|
|
|
|
def permissions
|
|
administrator? ? ['administrator'] : ['agent']
|
|
end
|
|
|
|
def push_event_data
|
|
{
|
|
id: id,
|
|
availability: availability,
|
|
role: role,
|
|
user_id: user_id
|
|
}
|
|
end
|
|
|
|
private
|
|
|
|
def notify_creation
|
|
Rails.configuration.dispatcher.dispatch(AGENT_ADDED, Time.zone.now, account: account)
|
|
end
|
|
|
|
def notify_deletion
|
|
Rails.configuration.dispatcher.dispatch(AGENT_REMOVED, Time.zone.now, account: account)
|
|
end
|
|
|
|
def update_presence_in_redis
|
|
OnlineStatusTracker.set_status(account.id, user.id, availability)
|
|
end
|
|
|
|
def filtered_unread_count_visibility_changed?
|
|
previous_changes.key?('role') || previous_changes.key?('custom_role_id')
|
|
end
|
|
|
|
def invalidate_filtered_unread_count_visibility
|
|
::Conversations::UnreadCounts::FilteredCountInvalidator.new(account).user_visibility_changed!(user_id: user_id)
|
|
end
|
|
|
|
def invalidate_filtered_unread_count_visibility_update
|
|
dispatch_account_cache_invalidated if invalidate_filtered_unread_count_visibility
|
|
end
|
|
|
|
def dispatch_account_cache_invalidated
|
|
Rails.configuration.dispatcher.dispatch(ACCOUNT_CACHE_INVALIDATED, Time.zone.now, account: account, cache_keys: account.cache_keys)
|
|
end
|
|
end
|
|
|
|
AccountUser.prepend_mod_with('AccountUser')
|
|
AccountUser.include_mod_with('Audit::AccountUser')
|
|
AccountUser.include_mod_with('Concerns::AccountUser')
|