Module: API::ProjectsRelationBuilder

Included in:
Entities::BasicProjectDetails
Defined in:
lib/api/projects_relation_builder.rb

Instance Method Summary collapse

Instance Method Details

#execute_batch_counting(projects_relation) ⇒ Object

This is overridden by the specific Entity class to batch load certain counts



32
# File 'lib/api/projects_relation_builder.rb', line 32

def execute_batch_counting(projects_relation); end

#preload_groups(projects_relation) ⇒ Object

For all projects except those in a user namespace, the namespace and group are identical. Preload the group when it’s not a user namespace.



48
49
50
51
52
53
54
55
56
57
# File 'lib/api/projects_relation_builder.rb', line 48

def preload_groups(projects_relation)
  group_projects = projects_for_group_preload(projects_relation)
  groups = group_projects.map(&:namespace)

  ::Namespaces::Preloaders::GroupRootAncestorPreloader.new(groups).execute

  group_projects.each do |project|
    project.group = project.namespace
  end
end

#preload_member_roles(projects_relation, user) ⇒ Object



63
64
65
# File 'lib/api/projects_relation_builder.rb', line 63

def preload_member_roles(projects_relation, user)
  # overridden in EE
end

#preload_relation(projects_relation, _options = {}) ⇒ Object

This is overridden by the specific Entity class to preload assocations that it needs



26
27
28
# File 'lib/api/projects_relation_builder.rb', line 26

def preload_relation(projects_relation, _options = {})
  projects_relation
end

#preload_repository_cache(projects_relation) ⇒ Object



34
35
36
37
38
39
40
# File 'lib/api/projects_relation_builder.rb', line 34

def preload_repository_cache(projects_relation)
  repositories = repositories_for_preload(projects_relation)

  Gitlab::RepositoryCache::Preloader.new(repositories).preload( # rubocop:disable CodeReuse/ActiveRecord
    %i[exists? root_ref has_visible_content? avatar readme_path]
  )
end

#prepare_relation(projects_relation, options = {}) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/api/projects_relation_builder.rb', line 5

def prepare_relation(projects_relation, options = {})
  projects_relation = preload_relation(projects_relation, options)

  execute_batch_counting(projects_relation)

  postload_relation(projects_relation, options)

  preload_repository_cache(projects_relation)

  if options[:current_user]
    Preloaders::UserMaxAccessLevelInProjectsPreloader.new(projects_relation, options[:current_user]).execute
  end

  preload_member_roles(projects_relation, options[:current_user]) if options[:current_user]
  preload_groups(projects_relation) if options[:with] == Entities::Project

  projects_relation
end

#projects_for_group_preload(projects_relation) ⇒ Object



59
60
61
# File 'lib/api/projects_relation_builder.rb', line 59

def projects_for_group_preload(projects_relation)
  projects_relation.select { |project| project.namespace.type == Group.sti_name }
end

#repositories_for_preload(projects_relation) ⇒ Object



42
43
44
# File 'lib/api/projects_relation_builder.rb', line 42

def repositories_for_preload(projects_relation)
  projects_relation.map(&:repository)
end