add support for deleting user accounts

This commit is contained in:
r888888888
2013-04-29 22:47:08 -07:00
parent 3cb5a34269
commit 51a62a8df6
3 changed files with 58 additions and 1 deletions

View File

@@ -4,7 +4,11 @@ class Favorite < ActiveRecord::Base
# this is necessary because there's no trigger for deleting favorites
def self.destroy_all(hash)
connection.execute("delete from favorites_#{hash[:user_id] % 100} where user_id = #{hash[:user_id]} and post_id = #{hash[:post_id]}")
if hash[:user_id] && hash[:post_id]
connection.execute("delete from favorites_#{hash[:user_id] % 100} where user_id = #{hash[:user_id]} and post_id = #{hash[:post_id]}")
elsif hash[:user_id]
connection.execute("delete from favorites_#{hash[:user_id] % 100} where user_id = #{hash[:user_id]}")
end
end
def self.add(post, user)

View File

@@ -616,6 +616,35 @@ class User < ActiveRecord::Base
end
end
module DeletionMethods
def delete!
scramble_password
remove_all_favorites
rename_for_delete
end
def rename_for_delete
alt_name = "user#{id}"
n = 0
while User.where(:name => alt_name).exists?
alt_name = "user#{id}_#{n}"
n += 1
end
update_attribute(:name, alt_name)
end
def scramble_password
update_attribute(:bcrypt_password_hash, User.bcrypt(SecureRandom.hex(16)))
end
def remove_all_favorites
Post.tag_match("fav:#{name}").find_each do |post|
Favorite.remove(post, self)
end
end
end
include BanMethods
include NameMethods
include PasswordMethods
@@ -629,6 +658,7 @@ class User < ActiveRecord::Base
include InvitationMethods
include ApiMethods
extend SearchMethods
include DeletionMethods
def initialize_default_image_size
self.default_image_size = "large"

View File

@@ -14,6 +14,29 @@ class UserTest < ActiveSupport::TestCase
CurrentUser.ip_addr = nil
end
context "that has been deleted" do
setup do
@post = FactoryGirl.create(:post)
Favorite.add(@post, @user)
@user.delete!
@post.reload
end
should "rename the user" do
assert_equal("user#{@user.id}", @user.name)
end
should "remove all favorites" do
assert_equal(0, @user.favorite_count)
assert_equal(0, Favorite.for_user(@user.id).count)
assert_equal("", @post.fav_string)
end
should "reset the password" do
assert_nil(User.authenticate(@user.name, "password"))
end
end
context "favoriting a post" do
setup do
@user.update_column(:favorite_count, 999)