diff options
Diffstat (limited to 'app/models/concerns/featurable.rb')
-rw-r--r-- | app/models/concerns/featurable.rb | 38 |
1 files changed, 35 insertions, 3 deletions
diff --git a/app/models/concerns/featurable.rb b/app/models/concerns/featurable.rb index 70d67fc7559..08189d83534 100644 --- a/app/models/concerns/featurable.rb +++ b/app/models/concerns/featurable.rb @@ -50,7 +50,7 @@ module Featurable end def available_features - @available_features + @available_features || [] end def access_level_attribute(feature) @@ -74,6 +74,12 @@ module Featurable STRING_OPTIONS.key(level) end + def required_minimum_access_level(feature) + ensure_feature!(feature) + + Gitlab::Access::GUEST + end + def ensure_feature!(feature) feature = feature.model_name.plural if feature.respond_to?(:model_name) feature = feature.to_sym @@ -91,8 +97,8 @@ module Featurable public_send(self.class.access_level_attribute(feature)) # rubocop:disable GitlabSecurity/PublicSend end - def feature_available?(feature, user) - get_permission(user, feature) + def feature_available?(feature, user = nil) + has_permission?(user, feature) end def string_access_level(feature) @@ -115,4 +121,30 @@ module Featurable def feature_validation_exclusion [] end + + def has_permission?(user, feature) + case access_level(feature) + when DISABLED + false + when PRIVATE + member?(user, feature) + when ENABLED + true + when PUBLIC + true + else + true + end + end + + def member?(user, feature) + return false unless user + return true if user.can_read_all_resources? + + resource_member?(user, feature) + end + + def resource_member?(user, feature) + raise NotImplementedError + end end |