diff options
Diffstat (limited to 'lib/api')
-rw-r--r-- | lib/api/entities.rb | 6 | ||||
-rw-r--r-- | lib/api/groups.rb | 2 | ||||
-rw-r--r-- | lib/api/projects.rb | 34 | ||||
-rw-r--r-- | lib/api/projects_batch_counting.rb | 27 | ||||
-rw-r--r-- | lib/api/projects_relation_builder.rb | 36 |
5 files changed, 49 insertions, 56 deletions
diff --git a/lib/api/entities.rb b/lib/api/entities.rb index 8a60127ff59..6d33cb214ee 100644 --- a/lib/api/entities.rb +++ b/lib/api/entities.rb @@ -188,7 +188,7 @@ module API end class BasicProjectDetails < ProjectIdentity - include ::API::ProjectsBatchCounting + include ::API::ProjectsRelationBuilder expose :default_branch, if: -> (project, options) { Ability.allowed?(options[:current_user], :download_code, project) } # Avoids an N+1 query: https://github.com/mbleigh/acts-as-taggable-on/issues/91#issuecomment-168273770 @@ -430,7 +430,7 @@ module API options: { only_owned: true, limit: projects_limit } ).execute - Entities::Project.preload_and_batch_count!(projects) + Entities::Project.prepare_relation(projects) end expose :shared_projects, using: Entities::Project do |group, options| @@ -440,7 +440,7 @@ module API options: { only_shared: true, limit: projects_limit } ).execute - Entities::Project.preload_and_batch_count!(projects) + Entities::Project.prepare_relation(projects) end def projects_limit diff --git a/lib/api/groups.rb b/lib/api/groups.rb index b9cfc16fb23..6c88b61eee8 100644 --- a/lib/api/groups.rb +++ b/lib/api/groups.rb @@ -231,7 +231,7 @@ module API projects, options = with_custom_attributes(projects, options) - present options[:with].preload_and_batch_count!(projects), options + present options[:with].prepare_relation(projects), options end desc 'Get a list of subgroups in this group.' do diff --git a/lib/api/projects.rb b/lib/api/projects.rb index ea7087d2f46..a1fce9e8b20 100644 --- a/lib/api/projects.rb +++ b/lib/api/projects.rb @@ -75,17 +75,15 @@ module API mutually_exclusive :import_url, :template_name, :template_project_id end - def find_projects + def load_projects ProjectsFinder.new(current_user: current_user, params: project_finder_params).execute end - # Prepare the full projects query - # None of this is supposed to actually execute any database query - def prepare_query(projects) + def present_projects(projects, options = {}) projects = reorder_projects(projects) projects = apply_filters(projects) - - projects, options = with_custom_attributes(projects) + projects = paginate(projects) + projects, options = with_custom_attributes(projects, options) options = options.reverse_merge( with: current_user ? Entities::ProjectWithAccess : Entities::BasicProjectDetails, @@ -93,23 +91,9 @@ module API current_user: current_user, license: false ) - options[:with] = Entities::BasicProjectDetails if params[:simple] - projects = options[:with].preload_relation(projects, options) - - [projects, options] - end - - def prepare_and_present(project_relation) - projects, options = prepare_query(project_relation) - - projects = paginate_and_retrieve!(projects) - - # Refresh count caches - options[:with].execute_batch_counting(projects) - - present projects, options + present options[:with].prepare_relation(projects, options), options end def translate_params_for_compatibility(params) @@ -134,7 +118,7 @@ module API params[:user] = user - prepare_and_present find_projects + present_projects load_projects end desc 'Get projects starred by a user' do @@ -150,7 +134,7 @@ module API not_found!('User') unless user starred_projects = StarredProjectsFinder.new(user, params: project_finder_params, current_user: current_user).execute - prepare_and_present starred_projects + present_projects starred_projects end end @@ -166,7 +150,7 @@ module API use :with_custom_attributes end get do - prepare_and_present find_projects + present_projects load_projects end desc 'Create new project' do @@ -303,7 +287,7 @@ module API get ':id/forks' do forks = ForkProjectsFinder.new(user_project, params: project_finder_params, current_user: current_user).execute - prepare_and_present forks + present_projects forks end desc 'Check pages access of this project' diff --git a/lib/api/projects_batch_counting.rb b/lib/api/projects_batch_counting.rb deleted file mode 100644 index 4e5124c8791..00000000000 --- a/lib/api/projects_batch_counting.rb +++ /dev/null @@ -1,27 +0,0 @@ -# frozen_string_literal: true - -module API - module ProjectsBatchCounting - extend ActiveSupport::Concern - - class_methods do - # This adds preloading to the query and executes batch counting - # Side-effect: The query will be executed during batch counting - def preload_and_batch_count!(projects_relation) - preload_relation(projects_relation).tap do |projects| - execute_batch_counting(projects) - end - end - - def execute_batch_counting(projects) - ::Projects::BatchForksCountService.new(forks_counting_projects(projects)).refresh_cache - - ::Projects::BatchOpenIssuesCountService.new(projects).refresh_cache - end - - def forks_counting_projects(projects) - projects - end - end - end -end diff --git a/lib/api/projects_relation_builder.rb b/lib/api/projects_relation_builder.rb new file mode 100644 index 00000000000..263468c9aa6 --- /dev/null +++ b/lib/api/projects_relation_builder.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +module API + module ProjectsRelationBuilder + extend ActiveSupport::Concern + + class_methods do + def prepare_relation(projects_relation, options = {}) + projects_relation = preload_relation(projects_relation, options) + execute_batch_counting(projects_relation) + projects_relation + end + + def preload_relation(projects_relation, options = {}) + projects_relation + end + + def forks_counting_projects(projects_relation) + projects_relation + end + + def batch_forks_counting(projects_relation) + ::Projects::BatchForksCountService.new(forks_counting_projects(projects_relation)).refresh_cache + end + + def batch_open_issues_counting(projects_relation) + ::Projects::BatchOpenIssuesCountService.new(projects_relation).refresh_cache + end + + def execute_batch_counting(projects_relation) + batch_forks_counting(projects_relation) + batch_open_issues_counting(projects_relation) + end + end + end +end |