summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorRobert Speicher <robert@gitlab.com>2017-07-07 02:06:27 +0000
committerRobert Speicher <robert@gitlab.com>2017-07-07 02:06:27 +0000
commit49430c47d4d34072ff43cc1e35213317802055d7 (patch)
tree1d79663f12ca403f8e14dd3eabd7747fd89c588b /lib
parent7c096f68476b68784464530ccd89959af872e163 (diff)
parent6d0607e5f6ca038c101478b780dd019c9ff452f4 (diff)
downloadgitlab-ce-49430c47d4d34072ff43cc1e35213317802055d7.tar.gz
Merge branch '33748-fix-n-plus-1-query-in-the-projects-api' into 'master'
Fix some N+1 queries in the GET /projects API Closes #33748 See merge request !12679
Diffstat (limited to 'lib')
-rw-r--r--lib/api/entities.rb12
-rw-r--r--lib/api/projects.rb8
2 files changed, 18 insertions, 2 deletions
diff --git a/lib/api/entities.rb b/lib/api/entities.rb
index 99eda3b0c4b..94168fa4ebc 100644
--- a/lib/api/entities.rb
+++ b/lib/api/entities.rb
@@ -503,12 +503,20 @@ module API
class ProjectWithAccess < Project
expose :permissions do
expose :project_access, using: Entities::ProjectAccess do |project, options|
- project.project_members.find_by(user_id: options[:current_user].id)
+ if options.key?(:project_members)
+ (options[:project_members] || []).find { |member| member.source_id == project.id }
+ else
+ project.project_members.find_by(user_id: options[:current_user].id)
+ end
end
expose :group_access, using: Entities::GroupAccess do |project, options|
if project.group
- project.group.group_members.find_by(user_id: options[:current_user].id)
+ if options.key?(:group_members)
+ (options[:group_members] || []).find { |member| member.source_id == project.namespace_id }
+ else
+ project.group.group_members.find_by(user_id: options[:current_user].id)
+ end
end
end
end
diff --git a/lib/api/projects.rb b/lib/api/projects.rb
index 27d49eae844..c459257158d 100644
--- a/lib/api/projects.rb
+++ b/lib/api/projects.rb
@@ -77,9 +77,17 @@ module API
projects = projects.with_issues_enabled if params[:with_issues_enabled]
projects = projects.with_merge_requests_enabled if params[:with_merge_requests_enabled]
+ if current_user
+ projects = projects.includes(:route, :taggings, namespace: :route)
+ project_members = current_user.project_members
+ group_members = current_user.group_members
+ end
+
options = options.reverse_merge(
with: current_user ? Entities::ProjectWithAccess : Entities::BasicProjectDetails,
statistics: params[:statistics],
+ project_members: project_members,
+ group_members: group_members,
current_user: current_user
)
options[:with] = Entities::BasicProjectDetails if params[:simple]