Commit 9ad8de36 authored by Andreas Brandl's avatar Andreas Brandl
Browse files

Shortcut when all levels visible.

parent 0bd5751b3b07
......@@ -325,6 +325,12 @@ def self.public_or_visible_to_user(user = nil)
levels = Gitlab::VisibilityLevel.levels_for_user(user)
if Gitlab::VisibilityLevel.all_levels?(levels)
# If the user is allowed to see all projects,
# we can shortcut and just return.
return all
end
authorized_projects = where('EXISTS (?)', authorized).select(:id)
visible_projects = where('visibility_level IN (?)', levels).select(:id)
......
......@@ -20,6 +20,7 @@ module VisibilityLevel
PRIVATE = 0 unless const_defined?(:PRIVATE)
INTERNAL = 10 unless const_defined?(:INTERNAL)
PUBLIC = 20 unless const_defined?(:PUBLIC)
ALL_LEVELS = [PRIVATE, INTERNAL, PUBLIC].freeze unless const_defined?(:ALL_LEVELS)
class << self
delegate :values, to: :options
......@@ -28,7 +29,7 @@ def levels_for_user(user = nil)
return [PUBLIC] unless user
if user.full_private_access?
[PRIVATE, INTERNAL, PUBLIC]
ALL_LEVELS
elsif user.external?
[PUBLIC]
else
......@@ -36,6 +37,10 @@ def levels_for_user(user = nil)
end
end
def all_levels?(levels = [])
levels&.sort == ALL_LEVELS
end
def string_values
string_options.keys
end
......
......@@ -50,6 +50,28 @@
end
end
describe '.all_levels?' do
let(:levels) do
[
Gitlab::VisibilityLevel::PUBLIC,
Gitlab::VisibilityLevel::INTERNAL,
Gitlab::VisibilityLevel::PRIVATE
].shuffle
end
it 'returns true only when given all levels defined at once' do
expect(described_class.all_levels?(levels)).to be_truthy
end
it 'returns true for ALL_LEVELS' do
expect(described_class.all_levels?(Gitlab::VisibilityLevel::ALL_LEVELS)).to be_truthy
end
it 'returns false if any one level is missing' do
expect(described_class.all_levels?(levels[0..-2])).to be_falsey
end
end
describe '.allowed_levels' do
it 'only includes the levels that arent restricted' do
stub_application_setting(restricted_visibility_levels: [Gitlab::VisibilityLevel::INTERNAL])
......
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