From d76486a48bc9cd50f719fc66d019218a55ea5890 Mon Sep 17 00:00:00 2001 From: Neil Lalonde Date: Wed, 4 Sep 2013 15:35:10 -0400 Subject: [PATCH] Topic can have null user_id when user was nuked --- app/models/user_action.rb | 11 +++++++---- ...0904181208_allow_null_user_id_on_topics.rb | 9 +++++++++ lib/user_destroyer.rb | 3 +++ spec/components/user_destroyer_spec.rb | 19 ++++++++++++++++++- 4 files changed, 37 insertions(+), 5 deletions(-) create mode 100644 db/migrate/20130904181208_allow_null_user_id_on_topics.rb diff --git a/app/models/user_action.rb b/app/models/user_action.rb index bb44c60c977..06a43114ca5 100644 --- a/app/models/user_action.rb +++ b/app/models/user_action.rb @@ -196,10 +196,13 @@ ORDER BY p.created_at desc group_ids = topic.category.groups.pluck("groups.id") end - MessageBus.publish("/users/#{action.user.username.downcase}", - action.id, - user_ids: [user_id], - group_ids: group_ids ) + if action.user + MessageBus.publish("/users/#{action.user.username.downcase}", + action.id, + user_ids: [user_id], + group_ids: group_ids ) + end + action rescue ActiveRecord::RecordNotUnique diff --git a/db/migrate/20130904181208_allow_null_user_id_on_topics.rb b/db/migrate/20130904181208_allow_null_user_id_on_topics.rb new file mode 100644 index 00000000000..48e9b157d5d --- /dev/null +++ b/db/migrate/20130904181208_allow_null_user_id_on_topics.rb @@ -0,0 +1,9 @@ +class AllowNullUserIdOnTopics < ActiveRecord::Migration + def up + change_column :topics, :user_id, :integer, null: true + end + + def down + change_column :topics, :user_id, :integer, null: false + end +end diff --git a/lib/user_destroyer.rb b/lib/user_destroyer.rb index 6e21d67e363..b41417bbf9f 100644 --- a/lib/user_destroyer.rb +++ b/lib/user_destroyer.rb @@ -25,6 +25,9 @@ class UserDestroyer end end PostDestroyer.new(@staff, post).destroy + if post.topic and post.post_number == 1 + Topic.unscoped.where(id: post.topic.id).update_all(user_id: nil) + end end raise PostsExistError if user.reload.post_count != 0 end diff --git a/spec/components/user_destroyer_spec.rb b/spec/components/user_destroyer_spec.rb index 907dc7d2eb5..bde129ee0a2 100644 --- a/spec/components/user_destroyer_spec.rb +++ b/spec/components/user_destroyer_spec.rb @@ -87,7 +87,10 @@ describe UserDestroyer do end context 'user has posts' do - let!(:post) { Fabricate(:post, user: @user) } + let!(:topic_starter) { Fabricate(:user) } + let!(:topic) { Fabricate(:topic, user: topic_starter) } + let!(:first_post) { Fabricate(:post, user: topic_starter, topic: topic) } + let!(:post) { Fabricate(:post, user: @user, topic: topic) } context "delete_posts is false" do subject(:destroy) { UserDestroyer.new(@admin).destroy(@user) } @@ -123,6 +126,20 @@ describe UserDestroyer do post.reload.deleted_at.should_not be_nil post.user_id.should be_nil end + + it "does not delete topics started by others in which the user has replies" do + destroy + topic.reload.deleted_at.should be_nil + topic.user_id.should_not be_nil + end + + it "deletes topics started by the deleted user" do + spammer_topic = Fabricate(:topic, user: @user) + spammer_post = Fabricate(:post, user: @user, topic: spammer_topic) + destroy + spammer_topic.reload.deleted_at.should_not be_nil + spammer_topic.user_id.should be_nil + end end end