Mark notifications as read in a single SQL query

There is no need to load all comments only to count them. Lets just let
the database do all the work. If there are no comments found, nothing
will happen anyway.

Also already filter the comments to only search for notifications for
own comments.

And add some tests :)
This commit is contained in:
Benjamin Neff
2024-06-03 00:11:45 +02:00
parent 71e6f20740
commit 649d8c5b56
2 changed files with 47 additions and 4 deletions

View File

@@ -104,9 +104,8 @@ class PostService
end
def mark_like_on_comment_notifications_read(post_id)
comment_ids = Comment.where(commentable_id: post_id)
Notification.where(recipient_id: user.id, target_type: "Comment", target_id: comment_ids, unread: true)
.update_all(unread: false) if comment_ids.any?
Notification.where(recipient_id: user.id, target_type: "Comment",
target_id: Comment.where(commentable_id: post_id, author_id: user.person.id),
unread: true).update_all(unread: false) # rubocop:disable Rails/SkipsModelValidations
end
end