FIX: Liking whispers should not contribute to `Topic#like_count`. (#15703)

Non-staff users are not allowed to see whisper so this change prevents
non-staff user from seeing a like count that does not make sense to
them. In the future, we might consider adding another like count column
for staff user.

Follow-up to 4492718864
This commit is contained in:
Alan Guo Xiang Tan 2022-02-03 13:24:33 +08:00 committed by GitHub
parent 16910eba1d
commit 4aa9a813ec
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 35 additions and 2 deletions

View File

@ -239,8 +239,7 @@ class PostAction < ActiveRecord::Base
end end
if column == "like_count" if column == "like_count"
topic_count = Post.where(topic_id: topic_id).sum(column) Topic.find_by(id: topic_id)&.update_action_counts
Topic.where(id: topic_id).update_all ["#{column} = ?", topic_count]
end end
end end

View File

@ -0,0 +1,24 @@
# frozen_string_literal: true
class FixTopicLikeCountIncludingWhispers < ActiveRecord::Migration[6.0]
def up
whisper_post_type = 4
DB.exec(<<~SQL)
UPDATE topics SET like_count = tbl.like_count
FROM (
SELECT topic_id, SUM(like_count) like_count
FROM posts
WHERE deleted_at IS NULL
AND post_type <> #{whisper_post_type}
GROUP BY topic_id
) AS tbl
WHERE topics.id = tbl.topic_id
AND topics.like_count <> tbl.like_count
SQL
end
def down
raise ActiveRecord::IrreversibleMigration
end
end

View File

@ -456,6 +456,16 @@ describe PostAction do
expect(notification.notification_type).to eq(Notification.types[:liked]) expect(notification.notification_type).to eq(Notification.types[:liked])
end end
it 'should not increase topic like count when liking a whisper' do
SiteSetting.set(:enable_whispers, true)
post.revise(admin, post_type: Post.types[:whisper])
PostActionCreator.like(admin, post)
expect(post.reload.like_count).to eq(1)
expect(post.topic.like_count).to eq(0)
end
it 'should increase the `like_count` and `like_score` when a user likes something' do it 'should increase the `like_count` and `like_score` when a user likes something' do
freeze_time Date.today freeze_time Date.today