diff --git a/app/finders/conversation_finder.rb b/app/finders/conversation_finder.rb index 74bf903f5..871c55591 100644 --- a/app/finders/conversation_finder.rb +++ b/app/finders/conversation_finder.rb @@ -142,7 +142,8 @@ class ConversationFinder conversation_ids = current_account.mentions.where(user: current_user).pluck(:conversation_id) @conversations = @conversations.where(id: conversation_ids) when 'participating' - @conversations = current_user.participating_conversations.where(account_id: current_account.id) + participant_conversation_ids = ConversationParticipant.where(account_id: current_account.id, user_id: current_user.id).select(:conversation_id) + @conversations = @conversations.where(id: participant_conversation_ids) when 'unattended' @conversations = @conversations.unattended end diff --git a/spec/finders/conversation_finder_spec.rb b/spec/finders/conversation_finder_spec.rb index 64f134fe2..c502336c0 100644 --- a/spec/finders/conversation_finder_spec.rb +++ b/spec/finders/conversation_finder_spec.rb @@ -290,5 +290,35 @@ describe ConversationFinder do expect(result[:conversations].length).to be 2 end end + + context 'with participating' do + let(:params) { { status: 'open', assignee_type: 'all', conversation_type: 'participating' } } + + it 'excludes participating conversations from inboxes the user no longer has access to' do + accessible_conversation = create(:conversation, account: account, inbox: inbox) + revoked_conversation = create(:conversation, account: account, inbox: restricted_inbox) + revoked_membership = create(:inbox_member, user: user_1, inbox: restricted_inbox) + create(:conversation_participant, user: user_1, conversation: accessible_conversation, account: account) + create(:conversation_participant, user: user_1, conversation: revoked_conversation, account: account) + revoked_membership.destroy! + + result = conversation_finder.perform + + expect(result[:conversations].map(&:id)).to contain_exactly(accessible_conversation.id) + end + + it 'excludes the inaccessible conversation from the meta counts too' do + accessible_conversation = create(:conversation, account: account, inbox: inbox) + revoked_conversation = create(:conversation, account: account, inbox: restricted_inbox) + revoked_membership = create(:inbox_member, user: user_1, inbox: restricted_inbox) + create(:conversation_participant, user: user_1, conversation: accessible_conversation, account: account) + create(:conversation_participant, user: user_1, conversation: revoked_conversation, account: account) + revoked_membership.destroy! + + result = conversation_finder.perform_meta_only + + expect(result[:count][:all_count]).to eq 1 + end + end end end