summaryrefslogtreecommitdiff
path: root/app/services
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2022-10-10 12:10:24 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2022-10-10 12:10:24 +0000
commite55ef824f5da702b2e1e3edac0115ce5538927e9 (patch)
treea93ce00fbf4440c95d582d530855d88c7b4e70bc /app/services
parentc1d4ac251994b4463fb0cfcc263af26ded0d8eac (diff)
downloadgitlab-ce-e55ef824f5da702b2e1e3edac0115ce5538927e9.tar.gz
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/services')
-rw-r--r--app/services/members/destroy_service.rb25
1 files changed, 18 insertions, 7 deletions
diff --git a/app/services/members/destroy_service.rb b/app/services/members/destroy_service.rb
index 0a8344c58db..ce79907e8a8 100644
--- a/app/services/members/destroy_service.rb
+++ b/app/services/members/destroy_service.rb
@@ -2,6 +2,8 @@
module Members
class DestroyService < Members::BaseService
+ include Gitlab::ExclusiveLeaseHelpers
+
def execute(member, skip_authorization: false, skip_subresources: false, unassign_issuables: false, destroy_bot: false)
unless skip_authorization
raise Gitlab::Access::AccessDeniedError unless authorized?(member, destroy_bot)
@@ -11,13 +13,26 @@ module Members
end
@skip_auth = skip_authorization
+ last_owner = true
+
+ in_lock("delete_members:#{member.source.class}:#{member.source.id}") do
+ break if member.is_a?(GroupMember) && member.source.last_owner?(member.user)
+
+ last_owner = false
+ member.destroy
+ member.user&.invalidate_cache_counts
+ end
- return member if member.is_a?(GroupMember) && member.source.last_owner?(member.user)
+ unless last_owner
+ delete_member_associations(member, skip_subresources, unassign_issuables)
+ end
- member.destroy
+ member
+ end
- member.user&.invalidate_cache_counts
+ private
+ def delete_member_associations(member, skip_subresources, unassign_issuables)
if member.request? && member.user != current_user
notification_service.decline_access_request(member)
end
@@ -28,12 +43,8 @@ module Members
enqueue_unassign_issuables(member) if unassign_issuables
after_execute(member: member)
-
- member
end
- private
-
def authorized?(member, destroy_bot)
return can_destroy_bot_member?(member) if destroy_bot