From 23479067254696a9a59f89deeff93e22e0f3e661 Mon Sep 17 00:00:00 2001 From: Anton Khorev Date: Thu, 24 Oct 2024 02:25:27 +0300 Subject: [PATCH] Send notifications to note subscribers instead of commenters --- app/controllers/api/notes_controller.rb | 6 ++- test/controllers/api/notes_controller_test.rb | 54 +++++++++++++++++++ test/factories/note_subscriptions.rb | 3 ++ 3 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 test/factories/note_subscriptions.rb diff --git a/app/controllers/api/notes_controller.rb b/app/controllers/api/notes_controller.rb index c141bdf46a..7e2e7fb793 100644 --- a/app/controllers/api/notes_controller.rb +++ b/app/controllers/api/notes_controller.rb @@ -398,8 +398,10 @@ def add_comment(note, text, event, notify: true) comment = note.comments.create!(attributes) - note.comments.map(&:author).uniq.each do |user| - UserMailer.note_comment_notification(comment, user).deliver_later if notify && user && user != current_user && user.visible? + if notify + note.subscribers.visible.each do |user| + UserMailer.note_comment_notification(comment, user).deliver_later if current_user != user + end end NoteSubscription.find_or_create_by(:note => note, :user => current_user) if current_user diff --git a/test/controllers/api/notes_controller_test.rb b/test/controllers/api/notes_controller_test.rb index f814d8c6e6..5f69e6a2ac 100644 --- a/test/controllers/api/notes_controller_test.rb +++ b/test/controllers/api/notes_controller_test.rb @@ -271,6 +271,58 @@ def test_comment_success assert_equal user.display_name, js["properties"]["comments"].last["user"] end + def test_comment_without_notifications_success + # Ensure that emails are sent to users + first_user = create(:user) + second_user = create(:user) + third_user = create(:user) + + note_with_comments_by_users = create(:note) do |note| + create(:note_comment, :note => note, :author => first_user) + create(:note_comment, :note => note, :author => second_user) + end + + auth_header = bearer_authorization_header third_user + + assert_difference "NoteComment.count", 1 do + assert_difference "NoteSubscription.count", 1 do + assert_no_difference "ActionMailer::Base.deliveries.size" do + perform_enqueued_jobs do + post comment_api_note_path(note_with_comments_by_users, :text => "This is an additional comment", :format => "json"), :headers => auth_header + end + end + end + end + assert_response :success + js = ActiveSupport::JSON.decode(@response.body) + assert_not_nil js + assert_equal "Feature", js["type"] + assert_equal note_with_comments_by_users.id, js["properties"]["id"] + assert_equal "open", js["properties"]["status"] + assert_equal 3, js["properties"]["comments"].count + assert_equal "commented", js["properties"]["comments"].last["action"] + assert_equal "This is an additional comment", js["properties"]["comments"].last["text"] + assert_equal third_user.display_name, js["properties"]["comments"].last["user"] + + subscription = NoteSubscription.last + assert_equal third_user, subscription.user + assert_equal note_with_comments_by_users, subscription.note + + get api_note_path(note_with_comments_by_users, :format => "json") + assert_response :success + js = ActiveSupport::JSON.decode(@response.body) + assert_not_nil js + assert_equal "Feature", js["type"] + assert_equal note_with_comments_by_users.id, js["properties"]["id"] + assert_equal "open", js["properties"]["status"] + assert_equal 3, js["properties"]["comments"].count + assert_equal "commented", js["properties"]["comments"].last["action"] + assert_equal "This is an additional comment", js["properties"]["comments"].last["text"] + assert_equal third_user.display_name, js["properties"]["comments"].last["user"] + + ActionMailer::Base.deliveries.clear + end + def test_comment_with_notifications_success # Ensure that emails are sent to users first_user = create(:user) @@ -281,6 +333,8 @@ def test_comment_with_notifications_success create(:note_comment, :note => note, :author => first_user) create(:note_comment, :note => note, :author => second_user) end + create(:note_subscription, :note => note_with_comments_by_users, :user => first_user) + create(:note_subscription, :note => note_with_comments_by_users, :user => second_user) auth_header = bearer_authorization_header third_user diff --git a/test/factories/note_subscriptions.rb b/test/factories/note_subscriptions.rb new file mode 100644 index 0000000000..5f09ec379b --- /dev/null +++ b/test/factories/note_subscriptions.rb @@ -0,0 +1,3 @@ +FactoryBot.define do + factory :note_subscription +end