2013-03-18 17:52:29 -04:00
#
# How a post is deleted is affected by who is performing the action.
# this class contains the logic to delete it.
#
class PostDestroyer
def initialize ( user , post )
@user , @post = user , post
end
def destroy
2013-05-03 17:56:23 +10:00
if @user . staff?
staff_destroyed
2013-03-18 17:52:29 -04:00
elsif @user . id == @post . user_id
user_destroyed
end
end
# When a post is properly deleted. Well, it's still soft deleted, but it will no longer
# show up in the topic
2013-05-03 17:56:23 +10:00
def staff_destroyed
2013-03-18 17:52:29 -04:00
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 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 ] )
2013-07-01 20:45:52 +02:00
TopicUser . where ( topic_id : @post . topic_id , user_id : @post . user_id ) . update_all 'posted = false'
2013-03-18 17:52:29 -04:00
end
end
# Feature users in the topic
Jobs . enqueue ( :feature_topic_users , topic_id : @post . topic_id , except_post_id : @post . id )
2013-06-05 16:00:45 -04:00
@post . post_actions . map ( & :trash! )
f = PostActionType . types . map { | k , v | [ " #{ k } _count " , 0 ] }
2013-07-01 20:45:52 +02:00
Post . with_deleted . where ( id : @post . id ) . update_all ( Hash [ * f . flatten ] )
2013-06-05 16:00:45 -04:00
2013-05-07 14:39:01 +10:00
@post . trash!
2013-03-18 17:52:29 -04:00
Topic . reset_highest ( @post . topic_id )
2013-06-05 16:00:45 -04:00
2013-03-18 17:52:29 -04:00
@post . update_flagged_posts_count
# Remove any reply records that point to deleted posts
2013-05-17 15:11:37 -04:00
post_ids = PostReply . where ( reply_id : @post . id ) . pluck ( :post_id )
2013-03-18 17:52:29 -04:00
PostReply . delete_all reply_id : @post . id
if post_ids . present?
Post . where ( id : post_ids ) . each { | p | p . update_column :reply_count , p . replies . count }
end
# Remove any notifications that point to this deleted post
Notification . delete_all topic_id : @post . topic_id , post_number : @post . post_number
2013-06-05 16:00:45 -04:00
@post . topic . trash! if @post . post_number == 1
2013-03-18 17:52:29 -04:00
end
end
# When a user 'deletes' their own post. We just change the text.
def user_destroyed
Post . transaction do
@post . revise ( @user , I18n . t ( 'js.post.deleted_by_author' ) , force_new_version : true )
@post . update_column ( :user_deleted , true )
@post . update_flagged_posts_count
2013-06-13 13:41:45 -04:00
@post . topic_links . each ( & :destroy )
2013-03-18 17:52:29 -04:00
end
end
2013-05-03 17:56:23 +10:00
end