Class: API::Entities::Project

Inherits:
BasicProjectDetails show all
Includes:
Helpers::RelatedResourcesHelpers
Defined in:
lib/api/entities/project.rb

Direct Known Subclasses

ProjectWithAccess

Class Method Summary collapse

Methods included from Helpers::RelatedResourcesHelpers

#expose_path, #expose_url, #issues_available?, #mrs_available?, #project_feature_string_access_level

Methods inherited from BasicProjectDetails

postload_relation

Class Method Details

.execute_batch_counting(projects_relation) ⇒ Object

rubocop: enable CodeReuse/ActiveRecord



189
190
191
192
193
194
195
196
# File 'lib/api/entities/project.rb', line 189

def self.execute_batch_counting(projects_relation)
  # Call the count methods on every project, so the BatchLoader would load them all at
  # once when the entities are rendered
  projects_relation.each(&:open_issues_count)
  projects_relation.map(&:forked_from_project).compact.each(&:forks_count)

  super
end

.preload_relation(projects_relation, options = {}) ⇒ Object



171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
# File 'lib/api/entities/project.rb', line 171

def self.preload_relation(projects_relation, options = {})
  # Preloading topics, should be done with using only `:topics`,
  # as `:topics` are defined as: `has_many :topics, through: :project_topics`
  # N+1 is solved then by using `subject.topics.map(&:name)`
  # MR describing the solution: https://gitlab.com/gitlab-org/gitlab-foss/merge_requests/20555
  super(projects_relation).preload(group: :namespace_settings)
                          .preload(:ci_cd_settings)
                          .preload(:project_setting)
                          .preload(:container_expiration_policy)
                          .preload(:auto_devops)
                          .preload(:service_desk_setting)
                          .preload(project_group_links: { group: :route },
                                   fork_network: :root_project,
                                   fork_network_member: :forked_from_project,
                                   forked_from_project: [:route, :topics, :group, :project_feature, namespace: [:route, :owner]])
end

.preload_resource(project) ⇒ Object

rubocop: disable CodeReuse/ActiveRecord



167
168
169
# File 'lib/api/entities/project.rb', line 167

def self.preload_resource(project)
  ActiveRecord::Associations::Preloader.new(records: [project], associations: { project_group_links: { group: :route } }).call
end

.repositories_for_preload(projects_relation) ⇒ Object



198
199
200
# File 'lib/api/entities/project.rb', line 198

def self.repositories_for_preload(projects_relation)
  super + projects_relation.map(&:forked_from_project).compact.map(&:repository)
end