diff options
| author | Robert Speicher <robert@gitlab.com> | 2017-07-07 02:06:27 +0000 |
|---|---|---|
| committer | Robert Speicher <robert@gitlab.com> | 2017-07-07 02:06:27 +0000 |
| commit | 49430c47d4d34072ff43cc1e35213317802055d7 (patch) | |
| tree | 1d79663f12ca403f8e14dd3eabd7747fd89c588b /lib/api | |
| parent | 7c096f68476b68784464530ccd89959af872e163 (diff) | |
| parent | 6d0607e5f6ca038c101478b780dd019c9ff452f4 (diff) | |
| download | gitlab-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/api')
| -rw-r--r-- | lib/api/entities.rb | 12 | ||||
| -rw-r--r-- | lib/api/projects.rb | 8 |
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] |
