Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app/finders/groups/accepting_group_transfers_finder.rb')
-rw-r--r--app/finders/groups/accepting_group_transfers_finder.rb69
1 files changed, 69 insertions, 0 deletions
diff --git a/app/finders/groups/accepting_group_transfers_finder.rb b/app/finders/groups/accepting_group_transfers_finder.rb
new file mode 100644
index 00000000000..df67f940d20
--- /dev/null
+++ b/app/finders/groups/accepting_group_transfers_finder.rb
@@ -0,0 +1,69 @@
+# 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