FIX: Correctly publish messages unconditionally to admins (#13053)

Under certain conditions admins would miss messages when posting action in
topics where they have permission.

This also fixes an error where we would sometimes explode when publishing to
an empty group.
This commit is contained in:
Sam
2021-05-20 16:58:27 +10:00
committed by GitHub
parent f1b14a7f71
commit 058b5310c1
2 changed files with 19 additions and 10 deletions

View File

@@ -283,14 +283,14 @@ class UserAction < ActiveRecord::Base
update_like_count(user_id, hash[:action_type], 1) update_like_count(user_id, hash[:action_type], 1)
end end
# move into Topic perhaps
group_ids = nil group_ids = nil
if topic && topic.category && topic.category.read_restricted if topic && topic.category && topic.category.read_restricted
group_ids = topic.category.groups.pluck("groups.id") group_ids = [Group::AUTO_GROUPS[:admins]]
group_ids.concat(topic.category.groups.pluck("groups.id"))
end end
if action.user if action.user
MessageBus.publish("/u/#{action.user.username.downcase}", action.id, user_ids: [user_id], group_ids: group_ids) MessageBus.publish("/u/#{action.user.username_lower}", action.id, user_ids: [user_id], group_ids: group_ids)
end end
action action

View File

@@ -35,15 +35,18 @@ describe UserAction do
}.merge(opts)) }.merge(opts))
end end
describe "integration" do it "allows publishing when group is deleted" do
before do public_topic.category.update!(read_restricted: true)
# Create some test data using a helper
log_test_action m = MessageBus.track_publish("/u/#{user.username_lower}") do
log_test_action(action_type: UserAction::GOT_PRIVATE_MESSAGE) log_test_action(target_topic_id: public_topic.id, target_post_id: public_post.id)
log_test_action(action_type: UserAction::NEW_TOPIC, target_topic_id: public_topic.id, target_post_id: public_post.id)
log_test_action(action_type: UserAction::BOOKMARK)
end end
expect(m[0].group_ids).to eq([Group::AUTO_GROUPS[:admins]])
expect(m[0].user_ids).to eq([user.id])
end
describe "integration" do
def stats_for_user(viewer = nil) def stats_for_user(viewer = nil)
UserAction.stats(user.id, Guardian.new(viewer)).map { |r| r.action_type.to_i }.sort UserAction.stats(user.id, Guardian.new(viewer)).map { |r| r.action_type.to_i }.sort
end end
@@ -53,6 +56,12 @@ describe UserAction do
end end
it 'includes the events correctly' do it 'includes the events correctly' do
# Create some test data using a helper
log_test_action
log_test_action(action_type: UserAction::GOT_PRIVATE_MESSAGE)
log_test_action(action_type: UserAction::NEW_TOPIC, target_topic_id: public_topic.id, target_post_id: public_post.id)
log_test_action(action_type: UserAction::BOOKMARK)
Jobs.run_immediately! Jobs.run_immediately!
PostActionNotifier.enable PostActionNotifier.enable