From 39d14f2f4bd30254e5777e05ad9a0f190f6f9182 Mon Sep 17 00:00:00 2001 From: Andreas Brandl Date: Tue, 13 Feb 2018 14:14:19 +0100 Subject: Shortcut when all levels visible. --- app/models/project.rb | 6 ++++++ lib/gitlab/visibility_level.rb | 7 ++++++- spec/lib/gitlab/visibility_level_spec.rb | 22 ++++++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/app/models/project.rb b/app/models/project.rb index 2dc3dd38099..8bf220b2ae4 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -325,6 +325,12 @@ class Project < ActiveRecord::Base 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) diff --git a/lib/gitlab/visibility_level.rb b/lib/gitlab/visibility_level.rb index 2612208a927..d0ec5d57aab 100644 --- a/lib/gitlab/visibility_level.rb +++ b/lib/gitlab/visibility_level.rb @@ -20,6 +20,7 @@ module Gitlab 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 @@ module Gitlab return [PUBLIC] unless user if user.full_private_access? - [PRIVATE, INTERNAL, PUBLIC] + ALL_LEVELS elsif user.external? [PUBLIC] else @@ -36,6 +37,10 @@ module Gitlab end end + def all_levels?(levels = []) + levels&.sort == ALL_LEVELS + end + def string_values string_options.keys end diff --git a/spec/lib/gitlab/visibility_level_spec.rb b/spec/lib/gitlab/visibility_level_spec.rb index 2c1146ceff5..71eff6e81ef 100644 --- a/spec/lib/gitlab/visibility_level_spec.rb +++ b/spec/lib/gitlab/visibility_level_spec.rb @@ -50,6 +50,28 @@ describe Gitlab::VisibilityLevel do 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]) -- cgit v1.2.1