diff --git a/lib/post_destroyer.rb b/lib/post_destroyer.rb index 68ae562a1..0fdbecaec 100644 --- a/lib/post_destroyer.rb +++ b/lib/post_destroyer.rb @@ -53,26 +53,25 @@ class PostDestroyer # When a post is properly deleted. Well, it's still soft deleted, but it will no longer # show up in the topic def staff_destroyed - # the topic may be trashed, skip it - return unless @post.topic - Post.transaction do - # Update the last post id to the previous post if it exists - last_post = Post.where("topic_id = ? and id <> ?", @post.topic_id, @post.id).order('created_at desc').limit(1).first - if last_post.present? - @post.topic.update_attributes(last_posted_at: last_post.created_at, - last_post_user_id: last_post.user_id, - highest_post_number: last_post.post_number) + if @post.topic + # Update the last post id to the previous post if it exists + last_post = Post.where("topic_id = ? and id <> ?", @post.topic_id, @post.id).order('created_at desc').limit(1).first + if last_post.present? + @post.topic.update_attributes(last_posted_at: last_post.created_at, + last_post_user_id: last_post.user_id, + highest_post_number: last_post.post_number) - # If the poster doesn't have any other posts in the topic, clear their posted flag - unless Post.exists?(["topic_id = ? and user_id = ? and id <> ?", @post.topic_id, @post.user_id, @post.id]) - TopicUser.where(topic_id: @post.topic_id, user_id: @post.user_id).update_all 'posted = false' + # If the poster doesn't have any other posts in the topic, clear their posted flag + unless Post.exists?(["topic_id = ? and user_id = ? and id <> ?", @post.topic_id, @post.user_id, @post.id]) + TopicUser.where(topic_id: @post.topic_id, user_id: @post.user_id).update_all 'posted = false' + end end - end - # Feature users in the topic - Jobs.enqueue(:feature_topic_users, topic_id: @post.topic_id, except_post_id: @post.id) + # Feature users in the topic + Jobs.enqueue(:feature_topic_users, topic_id: @post.topic_id, except_post_id: @post.id) + end @post.post_actions.each do |pa| pa.trash!(@user) @@ -83,7 +82,7 @@ class PostDestroyer @post.trash!(@user) - Topic.reset_highest(@post.topic_id) + Topic.reset_highest(@post.topic_id) if @post.topic @post.update_flagged_posts_count @@ -98,7 +97,7 @@ class PostDestroyer # Remove any notifications that point to this deleted post Notification.delete_all topic_id: @post.topic_id, post_number: @post.post_number - @post.topic.trash!(@user) if @post.post_number == 1 + @post.topic.trash!(@user) if @post.topic and @post.post_number == 1 end end diff --git a/spec/components/post_destroyer_spec.rb b/spec/components/post_destroyer_spec.rb index 5a404d59b..1a90601a1 100644 --- a/spec/components/post_destroyer_spec.rb +++ b/spec/components/post_destroyer_spec.rb @@ -8,6 +8,7 @@ describe PostDestroyer do end let(:moderator) { Fabricate(:moderator) } + let(:admin) { Fabricate(:admin) } let(:post) { create_post } describe 'destroy_old_stubs' do @@ -56,9 +57,6 @@ describe PostDestroyer do describe 'basic destroying' do - let(:moderator) { Fabricate(:moderator) } - let(:admin) { Fabricate(:admin) } - context "as the creator of the post" do before do @orig = post.cooked @@ -146,6 +144,37 @@ describe PostDestroyer do end + context "deleting a post belonging to a deleted topic" do + let!(:topic) { post.topic } + + before do + topic.trash!(admin) + post.reload + end + + context "as a moderator" do + before do + PostDestroyer.new(moderator, post).destroy + end + + it "deletes the post" do + post.deleted_at.should be_present + post.deleted_by.should == moderator + end + end + + context "as an admin" do + before do + PostDestroyer.new(admin, post).destroy + end + + it "deletes the post" do + post.deleted_at.should be_present + post.deleted_by.should == admin + end + end + end + describe 'after delete' do let!(:coding_horror) { Fabricate(:coding_horror) }