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

group_children_finder.rb « finders « app - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: bac3fb208d08cada02c45bc65686d14208a0cc95 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
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 ||= subgroup_count + project_count
  end

  def subgroup_count
    @subgroup_count ||= if defined?(@children)
                          children.count { |child| child.is_a?(Group) }
                        else
                          subgroups.count
                        end
  end

  def project_count
    @project_count ||= if defined?(@children)
                         children.count { |child| child.is_a?(Project) }
                       else
                         projects.count
                       end
  end

  private

  def children
    @children ||= subgroups + projects
  end

  def base_groups
    GroupsFinder.new(current_user,
                     parent: parent_group,
                     all_available: true).execute
  end

  def all_subgroups
    Gitlab::GroupHierarchy.new(Group.where(id: parent_group)).all_groups
  end

  def subgroups_matching_filter
    all_subgroups.search(params[:filter])
  end

  def subgroups
    return Group.none unless Group.supports_nested_groups?
    return Group.none unless can?(current_user, :read_group, parent_group)

    groups = if params[:filter]
               subgroups_matching_filter
             else
               base_groups
             end
    groups = groups
    groups.sort(params[:sort])
  end

  def base_projects
    GroupProjectsFinder.new(group: parent_group, params: params, current_user: current_user).execute
  end

  def projects_matching_filter
    ProjectsFinder.new(current_user: current_user).execute
      .search(params[:filter])
      .where(namespace: all_subgroups)
  end

  def projects
    return Project.none unless can?(current_user, :read_group, parent_group)

    projects = if params[:filter]
                 projects_matching_filter
               else
                 base_projects
               end
    projects.sort(params[:sort])
  end
end