From: Anton Khorev Date: Wed, 23 Oct 2024 23:25:27 +0000 (+0300) Subject: Send notifications to note subscribers instead of commenters X-Git-Tag: live~88^2 X-Git-Url: https://git.openstreetmap.org./rails.git/commitdiff_plain/23479067254696a9a59f89deeff93e22e0f3e661 Send notifications to note subscribers instead of commenters --- diff --git a/app/controllers/api/notes_controller.rb b/app/controllers/api/notes_controller.rb index c141bdf46..7e2e7fb79 100644 --- a/app/controllers/api/notes_controller.rb +++ b/app/controllers/api/notes_controller.rb @@ -398,8 +398,10 @@ module Api 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 f814d8c6e..5f69e6a2a 100644 --- a/test/controllers/api/notes_controller_test.rb +++ b/test/controllers/api/notes_controller_test.rb @@ -271,6 +271,58 @@ module Api 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 @@ module Api 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 000000000..5f09ec379 --- /dev/null +++ b/test/factories/note_subscriptions.rb @@ -0,0 +1,3 @@ +FactoryBot.define do + factory :note_subscription +end