eBooru/app/logical/user_deletion.rb

87 lines
1.9 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
2013-05-16 18:15:00 -04:00
class UserDeletion
2020-03-11 20:00:00 -04:00
class ValidationError < Exception;
end
2013-05-16 18:15:00 -04:00
attr_reader :user, :password
def initialize(user, password)
@user = user
@password = password
end
def delete!
validate
2021-02-01 01:39:09 -05:00
create_name_history
2020-03-11 20:00:00 -04:00
rename_user
2013-05-16 18:15:00 -04:00
clear_user_settings
reset_password
create_mod_action
UserDeletionJob.perform_later(user.id)
2013-05-16 18:15:00 -04:00
end
2020-03-11 20:00:00 -04:00
private
2021-02-01 01:39:09 -05:00
def create_name_history
UserNameChangeRequest.create(desired_name: "user_#{user.id}", change_reason: "user deletion", status: "approved", skip_limited_validation: true)
end
def create_mod_action
2019-04-13 03:22:27 -04:00
ModAction.log(:user_delete, {user_id: user.id})
end
2013-05-16 18:15:00 -04:00
def clear_user_settings
user.update_columns(
recent_tags: '',
favorite_tags: '',
blacklisted_tags: '',
time_zone: "Eastern Time (US & Canada)",
email: '',
email_verification_key: '1',
avatar_id: nil,
profile_about: '',
profile_artinfo: '',
custom_style: '',
level: User::Levels::MEMBER,
)
2013-05-16 18:15:00 -04:00
end
def reset_password
2020-03-11 20:00:00 -04:00
user.update_columns(password_hash: '', bcrypt_password_hash: '*LK*')
end
def rename_user
name = "user_#{user.id}"
n = 0
while User.where(:name => name).exists? && (n < 10)
name += "~"
end
if n == 10
raise ValidationError.new("New name could not be found")
end
user.update_column(:name, name)
user.update_cache
2013-05-16 18:15:00 -04:00
end
def validate
if user.is_blocked?
raise ValidationError.new("Banned users cannot delete their accounts")
end
if user.younger_than(1.week)
raise ValidationError.new("Account must be one week old to be deleted")
end
2013-05-16 18:15:00 -04:00
if !User.authenticate(user.name, password)
raise ValidationError.new("Password is incorrect")
end
if user.level >= User::Levels::ADMIN
raise ValidationError.new("Admins cannot delete their account")
end
end
end