From d1a275ad326ea0d4a136133c20d8e5ae557c1c67 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Sun, 16 Nov 2025 13:16:39 +0000 Subject: [PATCH] Resolve any open issues for a user when they are suspended --- .rubocop_todo.yml | 2 +- app/models/user.rb | 15 ++++++++++++++ test/controllers/issues_controller_test.rb | 3 ++- test/models/user_test.rb | 24 ++++++++++++++++++++++ 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index ab3ab56ae..93c040086 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -66,7 +66,7 @@ Metrics/BlockNesting: # Offense count: 26 # Configuration parameters: CountComments, CountAsOne. Metrics/ClassLength: - Max: 340 + Max: 350 # Offense count: 58 # Configuration parameters: AllowedMethods, AllowedPatterns. diff --git a/app/models/user.rb b/app/models/user.rb index 18a42d186..1d21c2e37 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -216,6 +216,10 @@ class User < ApplicationRecord # Accounts can be automatically suspended by spam_check event :suspend do + before do + close_open_issues + end + transitions :from => [:pending, :active], :to => :suspended end @@ -226,6 +230,10 @@ class User < ApplicationRecord # Mark the account as deleted but keep all data intact event :hide do + before do + close_open_issues + end + transitions :from => [:pending, :active, :confirmed, :suspended], :to => :deleted end @@ -236,6 +244,7 @@ class User < ApplicationRecord # Mark the account as deleted and remove personal data event :soft_destroy do before do + close_open_issues revoke_authentication_tokens remove_personal_data end @@ -355,6 +364,12 @@ class User < ApplicationRecord blocks.active.detect(&:needs_view?) end + ## + # close any open issues + def close_open_issues + issues.with_status(:open).each(&:resolve!) + end + ## # revoke any authentication tokens def revoke_authentication_tokens diff --git a/test/controllers/issues_controller_test.rb b/test/controllers/issues_controller_test.rb index ce3b24592..180964e1c 100644 --- a/test/controllers/issues_controller_test.rb +++ b/test/controllers/issues_controller_test.rb @@ -127,9 +127,10 @@ class IssuesControllerTest < ActionDispatch::IntegrationTest def test_resolve_note_of_deleted_user target_user = create(:user) target_note = create(:note, :author => target_user) - issue = create(:issue, :reportable => target_note, :reported_user => target_user, :assigned_role => "moderator") target_user.soft_destroy! + issue = create(:issue, :reportable => target_note, :reported_user => target_user, :assigned_role => "moderator") + session_for(create(:moderator_user)) post resolve_issue_path(issue) assert_redirected_to issue_path(issue) diff --git a/test/models/user_test.rb b/test/models/user_test.rb index 89a5e14ab..1b491236c 100644 --- a/test/models/user_test.rb +++ b/test/models/user_test.rb @@ -405,12 +405,28 @@ class UserTest < ActiveSupport::TestCase assert_equal "suspended", user.status end + def test_suspend_closes_issues + user = create(:user) + issue = create(:issue, :reportable => user) + user.suspend + assert_equal "suspended", user.status + assert_equal "resolved", issue.reload.status + end + def test_hide user = create(:user) user.hide assert_equal "deleted", user.status end + def test_hide_closes_issues + user = create(:user) + issue = create(:issue, :reportable => user) + user.hide + assert_equal "deleted", user.status + assert_equal "resolved", issue.reload.status + end + def test_soft_destroy user = create(:user, :with_home_location, :description => "foo") user.soft_destroy @@ -424,6 +440,14 @@ class UserTest < ActiveSupport::TestCase assert_not_predicate user, :active? end + def test_soft_destroy_closes_issues + user = create(:user) + issue = create(:issue, :reportable => user) + user.soft_destroy + assert_equal "deleted", user.status + assert_equal "resolved", issue.reload.status + end + def test_soft_destroy_revokes_oauth2_tokens user = create(:user) oauth_access_token = create(:oauth_access_token, :user => user) -- 2.39.5