diff --git a/plugins/chat/app/services/chat/action/calculate_memberships_for_removal.rb b/plugins/chat/app/services/chat/action/calculate_memberships_for_removal.rb index fa4f74615e5..ddb5e56ad05 100644 --- a/plugins/chat/app/services/chat/action/calculate_memberships_for_removal.rb +++ b/plugins/chat/app/services/chat/action/calculate_memberships_for_removal.rb @@ -19,7 +19,7 @@ module Chat # out which of the users provided should have their [Chat::UserChatChannelMembership] # records removed based on those security cases. class CalculateMembershipsForRemoval - def self.call(scoped_users:, channel_ids: nil) + def self.call(scoped_users_query:, channel_ids: nil) channel_permissions_map = DB.query(<<~SQL, readonly: CategoryGroup.permission_types[:readonly]) WITH category_group_channel_map AS ( @@ -59,12 +59,12 @@ module Chat scoped_memberships = Chat::UserChatChannelMembership .joins(:chat_channel) - .where(user: scoped_users) + .where(user_id: scoped_users_query.select(:id)) .where(chat_channel_id: channel_permissions_map.map(&:channel_id)) memberships_to_remove = [] + scoped_memberships.find_each do |membership| - scoped_user = scoped_users.find { |su| su.id == membership.user_id } channel_permission = channel_permissions_map.find { |cpm| cpm.channel_id == membership.chat_channel_id } @@ -91,9 +91,12 @@ module Chat # At least one of the groups on the channel can create_post or # has full permission, remove the membership if the user is in none # of these groups. - if group_ids_with_write_permission.any? && - !scoped_user.in_any_groups?(group_ids_with_write_permission) - memberships_to_remove << membership.id + if group_ids_with_write_permission.any? + scoped_user = scoped_users_query.where(id: membership.user_id).first + + if !scoped_user&.in_any_groups?(group_ids_with_write_permission) + memberships_to_remove << membership.id + end end end diff --git a/plugins/chat/app/services/chat/auto_remove/handle_category_updated.rb b/plugins/chat/app/services/chat/auto_remove/handle_category_updated.rb index 0918e986e30..fff835bc986 100644 --- a/plugins/chat/app/services/chat/auto_remove/handle_category_updated.rb +++ b/plugins/chat/app/services/chat/auto_remove/handle_category_updated.rb @@ -59,16 +59,11 @@ module Chat end def remove_users_without_channel_permission(users:, category_channel_ids:) - memberships_to_remove = [] - - users.find_in_batches do |batch_users| - memberships_to_remove.concat( - Chat::Action::CalculateMembershipsForRemoval.call( - scoped_users: batch_users, - channel_ids: category_channel_ids, - ), + memberships_to_remove = + Chat::Action::CalculateMembershipsForRemoval.call( + scoped_users_query: users, + channel_ids: category_channel_ids, ) - end return if memberships_to_remove.blank? diff --git a/plugins/chat/app/services/chat/auto_remove/handle_destroyed_group.rb b/plugins/chat/app/services/chat/auto_remove/handle_destroyed_group.rb index 253c6926da2..9d8e42b6c33 100644 --- a/plugins/chat/app/services/chat/auto_remove/handle_destroyed_group.rb +++ b/plugins/chat/app/services/chat/auto_remove/handle_destroyed_group.rb @@ -98,7 +98,7 @@ module Chat def remove_users_without_channel_permission(scoped_users:) memberships_to_remove = - Chat::Action::CalculateMembershipsForRemoval.call(scoped_users: scoped_users) + Chat::Action::CalculateMembershipsForRemoval.call(scoped_users_query: scoped_users) return if memberships_to_remove.empty? diff --git a/plugins/chat/app/services/chat/auto_remove/handle_user_removed_from_group.rb b/plugins/chat/app/services/chat/auto_remove/handle_user_removed_from_group.rb index 2b18ac4a987..c6bdec7171e 100644 --- a/plugins/chat/app/services/chat/auto_remove/handle_user_removed_from_group.rb +++ b/plugins/chat/app/services/chat/auto_remove/handle_user_removed_from_group.rb @@ -77,7 +77,9 @@ module Chat def remove_from_private_channels(user:) memberships_to_remove = - Chat::Action::CalculateMembershipsForRemoval.call(scoped_users: [user]) + Chat::Action::CalculateMembershipsForRemoval.call( + scoped_users_query: User.where(id: user.id), + ) return if memberships_to_remove.empty?