Commit 3b163a75 authored by Rémy Coutable's avatar Rémy Coutable

Merge branch 'revert-2cc01f12' into 'master'

Revert "Merge branch 'sh-optimize-projects-api' into 'master'"

Closes #60315

See merge request gitlab-org/gitlab-ce!27195
parents 112741ef bcfd04a2
...@@ -81,7 +81,7 @@ class ProjectsFinder < UnionFinder ...@@ -81,7 +81,7 @@ class ProjectsFinder < UnionFinder
if private_only? if private_only?
current_user.authorized_projects current_user.authorized_projects
else else
Project.public_or_visible_to_user(current_user, params[:visibility_level]) Project.public_or_visible_to_user(current_user)
end end
end end
end end
......
...@@ -459,41 +459,14 @@ class Project < ApplicationRecord ...@@ -459,41 +459,14 @@ class Project < ApplicationRecord
# Returns a collection of projects that is either public or visible to the # Returns a collection of projects that is either public or visible to the
# logged in user. # logged in user.
# def self.public_or_visible_to_user(user = nil)
# requested_visiblity_levels: Normally all projects that are visible if user
# to the user (e.g. internal and public) are queried, but this where('EXISTS (?) OR projects.visibility_level IN (?)',
# parameter allows the caller to narrow the search space to optimize user.authorizations_for_projects,
# database queries. For instance, a caller may only want to see Gitlab::VisibilityLevel.levels_for_user(user))
# internal projects. Instead of querying for internal and public else
# projects and throwing away public projects, this parameter allows public_to_user
# the query to be targeted for only internal projects. end
def self.public_or_visible_to_user(user = nil, requested_visibility_levels = [])
return public_to_user unless user
visible_levels = Gitlab::VisibilityLevel.levels_for_user(user)
include_private = true
requested_visibility_levels = Array(requested_visibility_levels)
if requested_visibility_levels.present?
visible_levels &= requested_visibility_levels
include_private = requested_visibility_levels.include?(Gitlab::VisibilityLevel::PRIVATE)
end
public_or_internal_rel =
if visible_levels.present?
where('projects.visibility_level IN (?)', visible_levels)
else
Project.none
end
private_rel =
if include_private
where('EXISTS (?)', user.authorizations_for_projects)
else
Project.none
end
public_or_internal_rel.or(private_rel)
end end
# project features may be "disabled", "internal", "enabled" or "public". If "internal", # project features may be "disabled", "internal", "enabled" or "public". If "internal",
......
---
title: Optimize /api/v4/projects endpoint for visibility level
merge_request: 26481
author:
type: performance
...@@ -2722,7 +2722,7 @@ describe Project do ...@@ -2722,7 +2722,7 @@ describe Project do
end end
describe '#any_lfs_file_locks?', :request_store do describe '#any_lfs_file_locks?', :request_store do
let!(:project) { create(:project) } set(:project) { create(:project) }
it 'returns false when there are no LFS file locks' do it 'returns false when there are no LFS file locks' do
expect(project.any_lfs_file_locks?).to be_falsey expect(project.any_lfs_file_locks?).to be_falsey
...@@ -3160,53 +3160,6 @@ describe Project do ...@@ -3160,53 +3160,6 @@ describe Project do
expect(projects).to eq([public_project]) expect(projects).to eq([public_project])
end end
end end
context 'with requested visibility levels' do
set(:internal_project) { create(:project, :internal, :repository) }
set(:private_project_2) { create(:project, :private) }
context 'with admin user' do
set(:admin) { create(:admin) }
it 'returns all projects' do
projects = described_class.all.public_or_visible_to_user(admin, [])
expect(projects).to match_array([public_project, private_project, private_project_2, internal_project])
end
it 'returns all public and private projects' do
projects = described_class.all.public_or_visible_to_user(admin, [Gitlab::VisibilityLevel::PUBLIC, Gitlab::VisibilityLevel::PRIVATE])
expect(projects).to match_array([public_project, private_project, private_project_2])
end
it 'returns all private projects' do
projects = described_class.all.public_or_visible_to_user(admin, [Gitlab::VisibilityLevel::PRIVATE])
expect(projects).to match_array([private_project, private_project_2])
end
end
context 'with regular user' do
it 'returns authorized projects' do
projects = described_class.all.public_or_visible_to_user(user, [])
expect(projects).to match_array([public_project, private_project, internal_project])
end
it "returns user's public and private projects" do
projects = described_class.all.public_or_visible_to_user(user, [Gitlab::VisibilityLevel::PUBLIC, Gitlab::VisibilityLevel::PRIVATE])
expect(projects).to match_array([public_project, private_project])
end
it 'returns one private project' do
projects = described_class.all.public_or_visible_to_user(user, [Gitlab::VisibilityLevel::PRIVATE])
expect(projects).to eq([private_project])
end
end
end
end end
describe '.with_feature_available_for_user' do describe '.with_feature_available_for_user' do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment