## 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
62 lines
2.1 KiB
Ruby
62 lines
2.1 KiB
Ruby
class Api::V1::Accounts::Conversations::ParticipantsController < Api::V1::Accounts::Conversations::BaseController
|
|
include Events::Types
|
|
|
|
def show
|
|
@participants = @conversation.conversation_participants
|
|
end
|
|
|
|
def create
|
|
participant_ids_to_add = participants_to_be_added_ids
|
|
|
|
ActiveRecord::Base.transaction do
|
|
@participants = participant_ids_to_add.map { |user_id| @conversation.conversation_participants.find_or_create_by(user_id: user_id) }
|
|
end
|
|
notify_unread_count_change if participant_ids_to_add.any?
|
|
end
|
|
|
|
def update
|
|
participant_ids_to_add = participants_to_be_added_ids
|
|
participant_ids_to_remove = participants_to_be_removed_ids
|
|
changed_participant_ids = participant_ids_to_add + participant_ids_to_remove
|
|
|
|
ActiveRecord::Base.transaction do
|
|
participant_ids_to_add.each { |user_id| @conversation.conversation_participants.find_or_create_by(user_id: user_id) }
|
|
participant_ids_to_remove.each { |user_id| @conversation.conversation_participants.find_by(user_id: user_id)&.destroy }
|
|
end
|
|
notify_unread_count_change if changed_participant_ids.any?
|
|
@participants = @conversation.conversation_participants
|
|
render action: 'show'
|
|
end
|
|
|
|
def destroy
|
|
participant_ids_to_remove = current_participant_ids & params[:user_ids]
|
|
|
|
ActiveRecord::Base.transaction do
|
|
params[:user_ids].map { |user_id| @conversation.conversation_participants.find_by(user_id: user_id)&.destroy }
|
|
end
|
|
notify_unread_count_change if participant_ids_to_remove.any?
|
|
head :ok
|
|
end
|
|
|
|
private
|
|
|
|
def participants_to_be_added_ids
|
|
params[:user_ids] - current_participant_ids
|
|
end
|
|
|
|
def participants_to_be_removed_ids
|
|
current_participant_ids - params[:user_ids]
|
|
end
|
|
|
|
def current_participant_ids
|
|
@current_participant_ids ||= @conversation.conversation_participants.pluck(:user_id)
|
|
end
|
|
|
|
def notify_unread_count_change
|
|
return unless Current.account.feature_enabled?('conversation_unread_counts')
|
|
return unless Current.account.feature_enabled?('unread_count_for_filters')
|
|
|
|
Rails.configuration.dispatcher.dispatch(CONVERSATION_UNREAD_COUNT_CHANGED, Time.zone.now, conversation: @conversation)
|
|
end
|
|
end
|