FIX: properly send push notifications on assign

Previously we would rely on a quirk in core where whisper small actions
would get a notification, this behavior was removed and now we must
be explicit, it provides a much more consistent assign notification
This commit is contained in:
Sam 2018-12-04 17:55:58 +11:00
parent baddb3c630
commit 2d5359055d
3 changed files with 27 additions and 5 deletions

View File

@ -18,6 +18,7 @@ en:
already_claimed: "That topic has already been claimed." already_claimed: "That topic has already been claimed."
flag_assigned: "Sorry, that flag's topic is assigned to another user" flag_assigned: "Sorry, that flag's topic is assigned to another user"
flag_unclaimed: "You must claim that topic before acting on the flag" flag_unclaimed: "You must claim that topic before acting on the flag"
topic_assigned_excerpt: "@%{username} assigned you the topic '%{title}'"
assign_mailer: assign_mailer:
title: "Assign Mailer" title: "Assign Mailer"
subject_template: "[%{email_prefix}] %{assignee_name} assigned you to '%{topic_title}'!" subject_template: "[%{email_prefix}] %{assignee_name} assigned you to '%{topic_title}'!"

View File

@ -181,7 +181,7 @@ SQL
post_type = SiteSetting.assigns_public ? Post.types[:small_action] : Post.types[:whisper] post_type = SiteSetting.assigns_public ? Post.types[:small_action] : Post.types[:whisper]
unless silent if !silent
@topic.add_moderator_post( @topic.add_moderator_post(
@assigned_by, @assigned_by,
nil, nil,
@ -191,7 +191,7 @@ SQL
custom_fields: { "action_code_who" => assign_to.username } custom_fields: { "action_code_who" => assign_to.username }
) )
unless @assigned_by.id == assign_to.id if @assigned_by.id != assign_to.id
Notification.create!( Notification.create!(
notification_type: Notification.types[:custom], notification_type: Notification.types[:custom],
@ -207,6 +207,19 @@ SQL
end end
end end
# we got to send a push notification as well
# what we created here is a whisper and notification will not raise a push
alerter = PostAlerter.new(first_post)
# TODO: remove June 2019
if alerter.respond_to?(:create_notification_alert) && @assigned_by.id != assign_to.id
alerter.create_notification_alert(
user: assign_to,
post: first_post,
notification_type: Notification.types[:custom],
excerpt: I18n.t("discourse_assign.topic_assigned_excerpt", title: @topic.title, username: @assigned_by.username)
)
end
true true
end end

View File

@ -27,10 +27,18 @@ RSpec.describe TopicAssigner do
let(:post) { Fabricate(:post) } let(:post) { Fabricate(:post) }
let(:topic) { post.topic } let(:topic) { post.topic }
let(:moderator) { Fabricate(:moderator) } let(:moderator) { Fabricate(:moderator) }
let(:assigner) { TopicAssigner.new(topic, moderator) } let(:moderator2) { Fabricate(:moderator) }
let(:assigner) { TopicAssigner.new(topic, moderator2) }
let(:assigner_self) { TopicAssigner.new(topic, moderator) }
it "can assign and unassign correctly" do it "can assign and unassign correctly" do
messages = MessageBus.track_publish("/notification-alert/#{moderator.id}") do
assigner.assign(moderator) assigner.assign(moderator)
end
expect(messages.length).to eq(1)
expect(messages.first.data[:excerpt]).to eq("@#{moderator2.username} assigned you the topic '#{topic.title}'")
expect(TopicQuery.new( expect(TopicQuery.new(
moderator, assigned: moderator.username moderator, assigned: moderator.username
@ -55,7 +63,7 @@ RSpec.describe TopicAssigner do
) )
expect do expect do
assigner.assign(moderator) assigner_self.assign(moderator)
end.to_not change { TopicUser.last.notifications_reason_id } end.to_not change { TopicUser.last.notifications_reason_id }
end end