From 34516c72bd29c3a8777b7740f81fd5ba8b576f92 Mon Sep 17 00:00:00 2001 From: Penar Musaraj Date: Tue, 2 Oct 2018 11:25:08 -0400 Subject: [PATCH] FIX: Recover public actions (likes) when recovering a post (#6412) --- app/models/post.rb | 14 ++++++++++ lib/post_destroyer.rb | 12 ++++++--- spec/components/post_destroyer_spec.rb | 37 ++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 4 deletions(-) diff --git a/app/models/post.rb b/app/models/post.rb index 51d83227276..5e220246135 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -189,6 +189,7 @@ class Post < ActiveRecord::Base def recover! super update_flagged_posts_count + recover_public_post_actions TopicLink.extract_from(self) QuotedPost.extract_from(self) if topic && topic.category_id && topic.category @@ -375,6 +376,19 @@ class Post < ActiveRecord::Base PostAction.update_flagged_posts_count end + def recover_public_post_actions + PostAction.publics + .with_deleted + .where(post_id: self.id, id: self.custom_fields["deleted_public_actions"]) + .find_each do |post_action| + post_action.recover! + post_action.save! + end + + self.custom_fields.delete("deleted_public_actions") + self.save_custom_fields + end + def filter_quotes(parent_post = nil) return cooked if parent_post.blank? diff --git a/lib/post_destroyer.rb b/lib/post_destroyer.rb index 94146ffb323..bd932b46aa7 100644 --- a/lib/post_destroyer.rb +++ b/lib/post_destroyer.rb @@ -190,11 +190,15 @@ class PostDestroyer end def trash_public_post_actions - public_post_actions = PostAction.publics.where(post_id: @post.id) - public_post_actions.each { |pa| pa.trash!(@user) } + if public_post_actions = PostAction.publics.where(post_id: @post.id) + public_post_actions.each { |pa| pa.trash!(@user) } - f = PostActionType.public_types.map { |k, _| ["#{k}_count", 0] } - Post.with_deleted.where(id: @post.id).update_all(Hash[*f.flatten]) + @post.custom_fields["deleted_public_actions"] = public_post_actions.ids + @post.save_custom_fields + + f = PostActionType.public_types.map { |k, _| ["#{k}_count", 0] } + Post.with_deleted.where(id: @post.id).update_all(Hash[*f.flatten]) + end end def agree_with_flags diff --git a/spec/components/post_destroyer_spec.rb b/spec/components/post_destroyer_spec.rb index ddd00be3079..96603a4f3bf 100644 --- a/spec/components/post_destroyer_spec.rb +++ b/spec/components/post_destroyer_spec.rb @@ -217,6 +217,38 @@ describe PostDestroyer do end end + describe "recovery and post actions" do + let(:codinghorror) { Fabricate(:coding_horror) } + let!(:like) { PostAction.act(codinghorror, post, PostActionType.types[:like]) } + let!(:another_like) { PostAction.act(moderator, post, PostActionType.types[:like]) } + + it "restores public post actions" do + PostDestroyer.new(moderator, post).destroy + expect(PostAction.exists?(id: like.id)).to eq(false) + + PostDestroyer.new(moderator, post).recover + expect(PostAction.exists?(id: like.id)).to eq(true) + end + + it "does not recover previously-deleted actions" do + PostAction.remove_act(codinghorror, post, PostActionType.types[:like]) + expect(PostAction.exists?(id: like.id)).to eq(false) + + PostDestroyer.new(moderator, post).destroy + PostDestroyer.new(moderator, post).recover + expect(PostAction.exists?(id: another_like.id)).to eq(true) + expect(PostAction.exists?(id: like.id)).to eq(false) + end + + it "updates post like count" do + PostDestroyer.new(moderator, post).destroy + PostDestroyer.new(moderator, post).recover + post.reload + expect(post.like_count).to eq(2) + expect(post.custom_fields["deleted_public_actions"]).to be_nil + end + end + describe 'basic destroying' do it "as the creator of the post, doesn't delete the post" do begin @@ -622,6 +654,11 @@ describe PostDestroyer do Topic.where(title: I18n.t('system_messages.flags_agreed_and_post_deleted.subject_template')).exists? ).to eq(false) end + + it "should set the deleted_public_actions custom field" do + PostDestroyer.new(moderator, second_post).destroy + expect(second_post.custom_fields["deleted_public_actions"]).to eq("#{bookmark.id}") + end end describe "user actions" do