diff --git a/app/models/user_action.rb b/app/models/user_action.rb index bb44c60c9..06a43114c 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 000000000..48e9b157d --- /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 6e21d67e3..b41417bbf 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 907dc7d2e..bde129ee0 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