55 lines
1.6 KiB
Ruby
55 lines
1.6 KiB
Ruby
![]() |
class GroupChildrenFinder
|
||
|
include Gitlab::Allowable
|
||
|
|
||
|
attr_reader :current_user, :parent_group, :params
|
||
|
|
||
|
def initialize(current_user = nil, parent_group:, params: {})
|
||
|
@current_user = current_user
|
||
|
@parent_group = parent_group
|
||
|
@params = params
|
||
|
end
|
||
|
|
||
|
def execute
|
||
|
Kaminari.paginate_array(children)
|
||
|
end
|
||
|
|
||
|
# This allows us to fetch only the count without loading the objects. Unless
|
||
|
# the objects were already loaded.
|
||
|
def total_count
|
||
|
@total_count ||= if defined?(@children)
|
||
|
children.size
|
||
|
else
|
||
|
child_groups.count + projects.count
|
||
|
end
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def children
|
||
|
@children ||= child_groups + projects
|
||
|
end
|
||
|
|
||
|
def child_groups
|
||
|
return Group.none unless Group.supports_nested_groups?
|
||
|
return Group.none unless can?(current_user, :read_group, parent_group)
|
||
|
|
||
|
groups = GroupsFinder.new(current_user,
|
||
|
parent: parent_group,
|
||
|
all_available: true,
|
||
|
all_children_for_parent: params[:filter_groups].present?).execute
|
||
|
|
||
|
groups = groups.search(params[:filter]) if params[:filter].present?
|
||
|
groups = groups.includes(:route).includes(:children)
|
||
|
groups.sort(params[:sort])
|
||
|
end
|
||
|
|
||
|
def projects
|
||
|
return Project.none unless can?(current_user, :read_group, parent_group)
|
||
|
|
||
|
projects = GroupProjectsFinder.new(group: parent_group, params: params, current_user: current_user).execute
|
||
|
projects = projects.includes(:route)
|
||
|
projects = projects.search(params[:filter]) if params[:filter].present?
|
||
|
projects.sort(params[:sort])
|
||
|
end
|
||
|
end
|