diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-03-14 19:45:29 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-03-14 19:45:29 +0000 |
commit | b9fe665d2539f53fb86771383e18f9045db52414 (patch) | |
tree | 7e55fcd9b4dc27f3cb13651ce1c03146c592e483 /app | |
parent | dd22031c62b54a03909b7be829f85032e556a031 (diff) | |
download | gitlab-ce-b9fe665d2539f53fb86771383e18f9045db52414.tar.gz |
Add latest changes from gitlab-org/gitlab@14-8-stable-ee
Diffstat (limited to 'app')
-rw-r--r-- | app/models/user.rb | 2 | ||||
-rw-r--r-- | app/services/users/destroy_service.rb | 2 | ||||
-rw-r--r-- | app/services/users/migrate_to_ghost_user_service.rb | 13 |
3 files changed, 13 insertions, 4 deletions
diff --git a/app/models/user.rb b/app/models/user.rb index 74832bff9ac..9cd238904ff 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -390,7 +390,7 @@ class User < ApplicationRecord # rubocop: disable CodeReuse/ServiceClass # Ideally we should not call a service object here but user.block - # is also bcalled by Users::MigrateToGhostUserService which references + # is also called by Users::MigrateToGhostUserService which references # this state transition object in order to do a rollback. # For this reason the tradeoff is to disable this cop. after_transition any => :blocked do |user| diff --git a/app/services/users/destroy_service.rb b/app/services/users/destroy_service.rb index 4ec875098fa..46eec082125 100644 --- a/app/services/users/destroy_service.rb +++ b/app/services/users/destroy_service.rb @@ -54,7 +54,7 @@ module Users yield(user) if block_given? - MigrateToGhostUserService.new(user).execute unless options[:hard_delete] + MigrateToGhostUserService.new(user).execute(hard_delete: options[:hard_delete]) response = Snippets::BulkDestroyService.new(current_user, user.snippets).execute(options) raise DestroyError, response.message if response.error? diff --git a/app/services/users/migrate_to_ghost_user_service.rb b/app/services/users/migrate_to_ghost_user_service.rb index 515d7821416..575614e8743 100644 --- a/app/services/users/migrate_to_ghost_user_service.rb +++ b/app/services/users/migrate_to_ghost_user_service.rb @@ -10,14 +10,21 @@ module Users class MigrateToGhostUserService extend ActiveSupport::Concern - attr_reader :ghost_user, :user + attr_reader :ghost_user, :user, :hard_delete def initialize(user) @user = user @ghost_user = User.ghost end - def execute + # If an admin attempts to hard delete a user, in some cases associated + # records may have a NOT NULL constraint on the user ID that prevent that record + # from being destroyed. In such situations we must assign the record to the ghost user. + # Passing in `hard_delete: true` will ensure these records get assigned to + # the ghost user before the user is destroyed. Other associated records will be destroyed. + # letting the other associated records be destroyed. + def execute(hard_delete: false) + @hard_delete = hard_delete transition = user.block_transition # Block the user before moving records to prevent a data race. @@ -46,6 +53,8 @@ module Users private def migrate_records + return if hard_delete + migrate_issues migrate_merge_requests migrate_notes |