diff options
Diffstat (limited to 'app/workers/delete_user_worker.rb')
-rw-r--r-- | app/workers/delete_user_worker.rb | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/app/workers/delete_user_worker.rb b/app/workers/delete_user_worker.rb index 6a375a0cdd4..4634ea8ff4f 100644 --- a/app/workers/delete_user_worker.rb +++ b/app/workers/delete_user_worker.rb @@ -14,7 +14,7 @@ class DeleteUserWorker # rubocop:disable Scalability/IdempotentWorker delete_user = User.find_by_id(delete_user_id) return unless delete_user.present? - return if delete_user.banned? && ::Feature.enabled?(:delay_delete_own_user) + return if skip_own_account_deletion?(delete_user) current_user = User.find_by_id(current_user_id) return unless current_user.present? @@ -23,4 +23,34 @@ class DeleteUserWorker # rubocop:disable Scalability/IdempotentWorker rescue Gitlab::Access::AccessDeniedError => e Gitlab::AppLogger.warn("User could not be destroyed: #{e}") end + + private + + def skip_own_account_deletion?(user) + return false unless ::Feature.enabled?(:delay_delete_own_user) + + skip = + if user.banned? + true + else + # User is blocked when they delete their own account. Skip record deletion + # when user has been unblocked (e.g. when the user's account is reinstated + # by Trust & Safety) + user.deleted_own_account? && !user.blocked? + end + + if skip + user.custom_attributes.by_key(UserCustomAttribute::DELETED_OWN_ACCOUNT_AT).first&.destroy + UserCustomAttribute.set_skipped_account_deletion_at(user) + + Gitlab::AppLogger.info( + message: 'Skipped own account deletion.', + reason: "User has been #{user.banned? ? 'banned' : 'unblocked'}.", + user_id: user.id, + username: user.username + ) + end + + skip + end end |