FIX: properly set notification levels on group invite

Previously we relied on side effects to set tracking state correctly
when inviting groups to messages

Also has a minor optimisation in that we use pluck instead of pulling in
full record
This commit is contained in:
Sam Saffron 2019-08-16 18:23:51 +10:00
parent a590061aae
commit 9a9e31f927
4 changed files with 25 additions and 16 deletions

View File

@ -359,6 +359,25 @@ class Group < ActiveRecord::Base
(10..19).to_a
end
def set_message_default_notification_levels!(topic, ignore_existing: false)
group_users.pluck(:user_id, :notification_level).each do |user_id, notification_level|
next if user_id == -1
next if user_id == topic.user_id
next if ignore_existing && TopicUser.where(user_id: user_id, topic_id: topic.id).exists?
action =
case notification_level
when TopicUser.notification_levels[:tracking] then "track!"
when TopicUser.notification_levels[:regular] then "regular!"
when TopicUser.notification_levels[:muted] then "mute!"
when TopicUser.notification_levels[:watching] then "watch!"
else "track!"
end
topic.notifier.public_send(action, user_id)
end
end
def self.refresh_automatic_group!(name)
return unless id = AUTO_GROUPS[name]

View File

@ -821,6 +821,8 @@ class Topic < ActiveRecord::Base
group_id = group.id
group.set_message_default_notification_levels!(self, ignore_existing: true)
group.users.where(
"group_users.notification_level = :level",
level: NotificationLevels.all[:tracking],
@ -845,6 +847,7 @@ class Topic < ActiveRecord::Base
group_id: group_id
}.to_json
)
end
end

View File

@ -84,21 +84,8 @@ class TopicCreator
topic.notifier.watch!(tau.user_id)
end
topic.reload.topic_allowed_groups.each do |tag|
tag.group.group_users.each do |gu|
next if gu.user_id == -1 || gu.user_id == topic.user_id
action =
case gu.notification_level
when TopicUser.notification_levels[:tracking] then "track!"
when TopicUser.notification_levels[:regular] then "regular!"
when TopicUser.notification_levels[:muted] then "mute!"
when TopicUser.notification_levels[:watching] then "watch!"
else "track!"
end
topic.notifier.public_send(action, gu.user_id)
end
topic.reload.topic_allowed_groups.each do |topic_allowed_group|
topic_allowed_group.group.set_message_default_notification_levels!(topic)
end
end

View File

@ -279,8 +279,8 @@ describe TopicUser do
it "should use group's default notification level" do
another_user = Fabricate(:user)
group.add(another_user)
topic.invite_group(target_user, group)
TopicUser.track_visit!(topic.id, another_user.id)
expect(TopicUser.get(topic, another_user).notification_level)
.to eq(TopicUser.notification_levels[:tracking])