From f621730178a3e8539ddb8d5d67057680681dee93 Mon Sep 17 00:00:00 2001 From: stefanosxan Date: Tue, 21 Oct 2025 13:10:22 +0300 Subject: [PATCH 1/2] Delete some associated records when user is deleted --- .../ee/users/dependent_associations.rb | 26 +++++++++++++++++++ .../ee/users/dependent_associations_spec.rb | 7 ++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/ee/app/models/concerns/ee/users/dependent_associations.rb b/ee/app/models/concerns/ee/users/dependent_associations.rb index e464e440860012..df248927cb2bb8 100644 --- a/ee/app/models/concerns/ee/users/dependent_associations.rb +++ b/ee/app/models/concerns/ee/users/dependent_associations.rb @@ -35,6 +35,8 @@ module DependentAssociations has_many :approval_project_rules_users, dependent: :destroy + has_many :lists, dependent: :destroy + has_many :security_policy_dismissals, class_name: 'Security::PolicyDismissal', dependent: :nullify @@ -60,6 +62,30 @@ module DependentAssociations has_many :duo_workflows_workflows, class_name: 'Ai::DuoWorkflows::Workflow', dependent: :destroy + + has_many :created_custom_fields, + class_name: 'Issuables::CustomField', + foreign_key: 'created_by_id', + dependent: :nullify, + inverse_of: :created_by + + has_many :updated_custom_fields, + class_name: 'Issuables::CustomField', + foreign_key: 'updated_by_id', + dependent: :nullify, + inverse_of: :updated_by + + has_many :created_lifecycles, + class_name: 'WorkItems::Statuses::Custom::Lifecycle', + foreign_key: 'created_by_id', + dependent: :nullify, + inverse_of: :created_by + + has_many :updated_lifecycles, + class_name: 'WorkItems::Statuses::Custom::Lifecycle', + foreign_key: 'updated_by_id', + dependent: :nullify, + inverse_of: :updated_by # rubocop:enable Cop/ActiveRecordDependent -- we need to destroy/nullify records after each user delete. end end diff --git a/ee/spec/models/concerns/ee/users/dependent_associations_spec.rb b/ee/spec/models/concerns/ee/users/dependent_associations_spec.rb index e50e2ee9142ced..bb1790ab53e2cd 100644 --- a/ee/spec/models/concerns/ee/users/dependent_associations_spec.rb +++ b/ee/spec/models/concerns/ee/users/dependent_associations_spec.rb @@ -8,7 +8,11 @@ let(:associations_with_nullify) do { security_policy_dismissals: { class_name: 'Security::PolicyDismissal' }, - approval_policy_merge_request_bypass_events: { class_name: 'Security::ApprovalPolicyMergeRequestBypassEvent' } + approval_policy_merge_request_bypass_events: { class_name: 'Security::ApprovalPolicyMergeRequestBypassEvent' }, + created_custom_fields: { class_name: 'Issuables::CustomField' }, + updated_custom_fields: { class_name: 'Issuables::CustomField' }, + created_lifecycles: { class_name: 'WorkItems::Statuses::Custom::Lifecycle' }, + updated_lifecycles: { class_name: 'WorkItems::Statuses::Custom::Lifecycle' } } end @@ -22,6 +26,7 @@ approval_merge_request_rules_users: {}, approval_project_rules_users: {}, duo_workflows_workflows: { class_name: 'Ai::DuoWorkflows::Workflow' }, + lists: {}, merge_requests_approval_rules_approver_users: { class_name: 'MergeRequests::ApprovalRulesApproverUser' }, targeted_message_dismissals: {}, boards_epic_list_user_preferences: { class_name: 'Boards::EpicListUserPreference' }, -- GitLab From b81858ee9faeb2ef89cc51d5c7daa2b450fc8328 Mon Sep 17 00:00:00 2001 From: stefanosxan Date: Tue, 21 Oct 2025 15:16:10 +0300 Subject: [PATCH 2/2] Add more assocations --- .../concerns/ee/users/dependent_associations.rb | 12 ++++++++++++ .../concerns/ee/users/dependent_associations_spec.rb | 4 +++- .../shared_examples/models/user_shared_examples.rb | 4 ---- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/ee/app/models/concerns/ee/users/dependent_associations.rb b/ee/app/models/concerns/ee/users/dependent_associations.rb index df248927cb2bb8..3fee4849300557 100644 --- a/ee/app/models/concerns/ee/users/dependent_associations.rb +++ b/ee/app/models/concerns/ee/users/dependent_associations.rb @@ -86,6 +86,18 @@ module DependentAssociations foreign_key: 'updated_by_id', dependent: :nullify, inverse_of: :updated_by + + has_many :created_statuses, + class_name: 'WorkItems::Statuses::Custom::Status', + foreign_key: 'created_by_id', + dependent: :nullify, + inverse_of: :created_by + + has_many :updated_statuses, + class_name: 'WorkItems::Statuses::Custom::Status', + foreign_key: 'updated_by_id', + dependent: :nullify, + inverse_of: :updated_by # rubocop:enable Cop/ActiveRecordDependent -- we need to destroy/nullify records after each user delete. end end diff --git a/ee/spec/models/concerns/ee/users/dependent_associations_spec.rb b/ee/spec/models/concerns/ee/users/dependent_associations_spec.rb index bb1790ab53e2cd..370a5c33ef30bb 100644 --- a/ee/spec/models/concerns/ee/users/dependent_associations_spec.rb +++ b/ee/spec/models/concerns/ee/users/dependent_associations_spec.rb @@ -12,7 +12,9 @@ created_custom_fields: { class_name: 'Issuables::CustomField' }, updated_custom_fields: { class_name: 'Issuables::CustomField' }, created_lifecycles: { class_name: 'WorkItems::Statuses::Custom::Lifecycle' }, - updated_lifecycles: { class_name: 'WorkItems::Statuses::Custom::Lifecycle' } + updated_lifecycles: { class_name: 'WorkItems::Statuses::Custom::Lifecycle' }, + created_statuses: { class_name: 'WorkItems::Statuses::Custom::Status' }, + updated_statuses: { class_name: 'WorkItems::Statuses::Custom::Status' } } end diff --git a/spec/support/shared_examples/models/user_shared_examples.rb b/spec/support/shared_examples/models/user_shared_examples.rb index 4a51549e825cf1..79306c6f8e1b1b 100644 --- a/spec/support/shared_examples/models/user_shared_examples.rb +++ b/spec/support/shared_examples/models/user_shared_examples.rb @@ -121,7 +121,6 @@ deploy_tokens design_management_action_uploads import_export_upload_uploads - lists ml_experiments merge_requests_compliance_violations merge_requests_merge_data @@ -149,7 +148,6 @@ catalog_resource_versions cluster_agent_tokens cluster_agent_url_configurations - custom_fields design_management_versions incident_management_timeline_events lfs_file_locks @@ -165,8 +163,6 @@ terraform_states user_namespace_callouts uploads_9ba88c4165 - work_item_custom_lifecycles - work_item_custom_statuses ] end -- GitLab