2013-04-12 04:04:20 +08:00
|
|
|
# Responsible for destroying a User record
|
|
|
|
class UserDestroyer
|
|
|
|
|
|
|
|
class PostsExistError < RuntimeError; end
|
|
|
|
|
2013-07-27 03:40:08 +08:00
|
|
|
def initialize(staff)
|
|
|
|
@staff = staff
|
|
|
|
raise Discourse::InvalidParameters.new('staff user is nil') unless @staff and @staff.is_a?(User)
|
|
|
|
raise Discourse::InvalidAccess unless @staff.staff?
|
2013-04-12 04:04:20 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
# Returns false if the user failed to be deleted.
|
|
|
|
# Returns a frozen instance of the User if the delete succeeded.
|
2013-07-25 01:48:55 +08:00
|
|
|
def destroy(user, opts={})
|
2013-04-12 04:04:20 +08:00
|
|
|
raise Discourse::InvalidParameters.new('user is nil') unless user and user.is_a?(User)
|
2013-07-25 01:48:55 +08:00
|
|
|
raise PostsExistError if !opts[:delete_posts] && user.post_count != 0
|
2013-04-15 23:39:30 +08:00
|
|
|
User.transaction do
|
2013-07-25 01:48:55 +08:00
|
|
|
if opts[:delete_posts]
|
|
|
|
user.posts.each do |post|
|
2013-07-27 03:40:08 +08:00
|
|
|
PostDestroyer.new(@staff, post).destroy
|
2013-07-25 01:48:55 +08:00
|
|
|
end
|
|
|
|
raise PostsExistError if user.reload.post_count != 0
|
|
|
|
end
|
2013-04-15 23:39:30 +08:00
|
|
|
user.destroy.tap do |u|
|
|
|
|
if u
|
2013-07-26 03:30:03 +08:00
|
|
|
if opts[:block_email]
|
|
|
|
b = BlockedEmail.block(u.email)
|
|
|
|
b.record_match! if b
|
|
|
|
end
|
2013-07-11 04:52:34 +08:00
|
|
|
Post.with_deleted.where(user_id: user.id).update_all("nuked_user = true")
|
2013-07-27 03:40:08 +08:00
|
|
|
StaffActionLogger.new(@staff).log_user_deletion(user, opts.slice(:context))
|
2013-04-29 23:38:43 +08:00
|
|
|
DiscourseHub.unregister_nickname(user.username) if SiteSetting.call_discourse_hub?
|
2013-04-15 23:39:30 +08:00
|
|
|
MessageBus.publish "/file-change", ["refresh"], user_ids: [user.id]
|
|
|
|
end
|
2013-04-12 04:04:20 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|