Files
Sony MathewandGitHub 66cfb26c77 feat: Add unread count filters feature flag (1/6) (#14885)
## 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
2026-07-08 23:50:40 +05:30

76 lines
2.5 KiB
Ruby

# == Schema Information
#
# Table name: custom_roles
#
# id :bigint not null, primary key
# description :string
# name :string
# permissions :text default([]), is an Array
# created_at :datetime not null
# updated_at :datetime not null
# account_id :bigint not null
#
# Indexes
#
# index_custom_roles_on_account_id (account_id)
#
#
# Available permissions for custom roles:
# - 'conversation_manage': Can manage all conversations.
# - 'conversation_unassigned_manage': Can manage unassigned conversations and assign to self.
# - 'conversation_participating_manage': Can manage conversations they are participating in (assigned to or a participant).
# - 'contact_manage': Can manage contacts.
# - 'report_manage': Can manage reports.
# - 'knowledge_base_manage': Can manage knowledge base portals.
class CustomRole < ApplicationRecord
belongs_to :account
has_many :account_users, dependent: :nullify
before_destroy :capture_filtered_unread_count_user_ids, prepend: true
after_update_commit :invalidate_filtered_unread_count_visibility_update, if: :filtered_unread_count_permissions_changed?
after_destroy_commit :invalidate_filtered_unread_count_visibility_destroy
PERMISSIONS = %w[
conversation_manage
conversation_unassigned_manage
conversation_participating_manage
contact_manage
report_manage
knowledge_base_manage
].freeze
validates :name, presence: true
validates :permissions, inclusion: { in: PERMISSIONS }
private
def filtered_unread_count_permissions_changed?
previous_changes.key?('permissions')
end
def capture_filtered_unread_count_user_ids
@filtered_unread_count_user_ids = account_users.pluck(:user_id)
end
def invalidate_filtered_unread_count_visibility_update
invalidate_filtered_unread_count_visibility(account_users.pluck(:user_id))
end
def invalidate_filtered_unread_count_visibility_destroy
invalidate_filtered_unread_count_visibility(@filtered_unread_count_user_ids)
end
def invalidate_filtered_unread_count_visibility(user_ids)
invalidator = ::Conversations::UnreadCounts::FilteredCountInvalidator.new(account)
visibility_changed = invalidator.users_visibility_changed!(user_ids: user_ids)
dispatch_account_cache_invalidated if visibility_changed
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