mirror of
https://github.com/discourse/discourse.git
synced 2024-11-23 03:40:00 +08:00
FIX: Recover public actions (likes) when recovering a post (#6412)
This commit is contained in:
parent
324b57c207
commit
34516c72bd
|
@ -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?
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue
Block a user