70 lines
1.7 KiB
Ruby
70 lines
1.7 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
module Groups
|
||
|
class AcceptingGroupTransfersFinder < Base
|
||
|
include Gitlab::Utils::StrongMemoize
|
||
|
|
||
|
def initialize(current_user, group_to_be_transferred, params = {})
|
||
|
@current_user = current_user
|
||
|
@group_to_be_transferred = group_to_be_transferred
|
||
|
@params = params
|
||
|
end
|
||
|
|
||
|
def execute
|
||
|
return Group.none unless can_transfer_group?
|
||
|
|
||
|
items = if Feature.enabled?(:include_groups_from_group_shares_in_group_transfer_locations)
|
||
|
find_all_groups
|
||
|
else
|
||
|
find_groups
|
||
|
end
|
||
|
|
||
|
items = by_search(items)
|
||
|
|
||
|
sort(items)
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
attr_reader :current_user, :group_to_be_transferred, :params
|
||
|
|
||
|
def find_groups
|
||
|
GroupsFinder.new( # rubocop: disable CodeReuse/Finder
|
||
|
current_user,
|
||
|
min_access_level: Gitlab::Access::OWNER,
|
||
|
exclude_group_ids: exclude_groups
|
||
|
).execute.without_order
|
||
|
end
|
||
|
|
||
|
def find_all_groups
|
||
|
::Namespace.from_union(
|
||
|
[
|
||
|
find_groups,
|
||
|
groups_originating_from_group_shares_with_owner_access
|
||
|
]
|
||
|
)
|
||
|
end
|
||
|
|
||
|
def groups_originating_from_group_shares_with_owner_access
|
||
|
GroupGroupLink
|
||
|
.with_owner_access
|
||
|
.groups_accessible_via(
|
||
|
current_user.owned_groups.select(:id)
|
||
|
).id_not_in(exclude_groups)
|
||
|
end
|
||
|
|
||
|
def exclude_groups
|
||
|
strong_memoize(:exclude_groups) do
|
||
|
exclude_groups = group_to_be_transferred.self_and_descendants.pluck_primary_key
|
||
|
exclude_groups << group_to_be_transferred.parent_id if group_to_be_transferred.parent_id
|
||
|
|
||
|
exclude_groups
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def can_transfer_group?
|
||
|
Ability.allowed?(current_user, :admin_group, group_to_be_transferred)
|
||
|
end
|
||
|
end
|
||
|
end
|