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
2013-07-22 17:48:24 +10:00
def self . destroy_stubs
2013-07-23 16:11:44 +10:00
# exclude deleted topics and posts that are actively flagged
2013-07-22 17:48:24 +10:00
Post . where ( deleted_at : nil , user_deleted : true )
2013-07-23 16:11:44 +10:00
. where ( " NOT EXISTS (
SELECT 1 FROM topics t
WHERE t . deleted_at IS NOT NULL AND
t . id = posts . topic_id
) " )
2013-08-02 13:35:42 -04:00
. where ( " updated_at < ? AND post_number > 1 " , SiteSetting . delete_removed_posts_after . hours . ago )
2013-07-23 16:11:44 +10:00
. where ( " NOT EXISTS (
SELECT 1
FROM post_actions pa
WHERE pa . post_id = posts . id AND
pa . deleted_at IS NULL AND
pa . post_action_type_id IN ( ?)
) " , PostActionType.notify_flag_type_ids)
. each do | post |
2013-07-22 17:48:24 +10:00
PostDestroyer . new ( Discourse . system_user , post ) . destroy
end
end
2013-03-18 17:52:29 -04:00
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
2013-07-22 17:48:24 +10:00
def recover
if @user . staff? && @post . deleted_at
staff_recovered
elsif @user . staff? || @user . id == @post . user_id
user_recovered
end
@post . topic . update_statistics
end
def staff_recovered
@post . recover!
end
2013-03-18 17:52:29 -04:00
# 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
2014-02-06 07:54:34 -05:00
@post . trash! ( @user )
2013-07-23 11:50:58 -04:00
if @post . topic
2014-02-06 07:54:34 -05:00
make_previous_post_the_last_one
clear_user_posted_flag
feature_users_in_the_topic
Topic . reset_highest ( @post . topic_id )
2013-07-09 15:20:18 -04:00
end
2014-02-06 07:54:34 -05:00
trash_post_actions
2013-03-18 17:52:29 -04:00
@post . update_flagged_posts_count
2014-02-06 07:54:34 -05:00
remove_associated_replies
remove_associated_notifications
2013-07-23 11:50:58 -04:00
@post . topic . trash! ( @user ) if @post . topic and @post . post_number == 1
2014-02-06 07:54:34 -05:00
update_associated_category_latest_topic
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
2013-08-02 13:35:42 -04:00
@post . revise ( @user , I18n . t ( 'js.post.deleted_by_author' , count : SiteSetting . delete_removed_posts_after ) , force_new_version : true )
2013-03-18 17:52:29 -04:00
@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-07-22 17:48:24 +10:00
def user_recovered
Post . transaction do
@post . update_column ( :user_deleted , false )
2013-09-06 11:50:05 -04:00
@post . skip_unique_check = true
2013-12-12 03:41:34 +01:00
@post . revise ( @user , @post . revisions . last . modifications [ " raw " ] [ 0 ] , force_new_version : true )
2013-07-22 17:48:24 +10:00
@post . update_flagged_posts_count
end
end
2014-02-06 07:54:34 -05:00
private
def make_previous_post_the_last_one
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
)
end
end
def clear_user_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
def feature_users_in_the_topic
Jobs . enqueue ( :feature_topic_users , topic_id : @post . topic_id , except_post_id : @post . id )
end
def trash_post_actions
@post . post_actions . each do | pa |
pa . trash! ( @user )
end
f = PostActionType . types . map { | k , v | [ " #{ k } _count " , 0 ] }
Post . with_deleted . where ( id : @post . id ) . update_all ( Hash [ * f . flatten ] )
end
def remove_associated_replies
post_ids = PostReply . where ( reply_id : @post . id ) . pluck ( :post_id )
if post_ids . present?
PostReply . delete_all reply_id : @post . id
Post . where ( id : post_ids ) . each { | p | p . update_column :reply_count , p . replies . count }
end
end
def remove_associated_notifications
Notification . delete_all topic_id : @post . topic_id , post_number : @post . post_number
end
def update_associated_category_latest_topic
return unless @post . topic && @post . topic . category
return unless @post . id == @post . topic . category . latest_post_id || ( @post . post_number == 1 && @post . topic_id == @post . topic . category . latest_topic_id )
@post . topic . category . update_latest
end
2013-05-03 17:56:23 +10:00
end