summaryrefslogtreecommitdiff
path: root/app/models/operations/feature_flag_scope.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/operations/feature_flag_scope.rb')
-rw-r--r--app/models/operations/feature_flag_scope.rb62
1 files changed, 62 insertions, 0 deletions
diff --git a/app/models/operations/feature_flag_scope.rb b/app/models/operations/feature_flag_scope.rb
new file mode 100644
index 00000000000..78be29f2531
--- /dev/null
+++ b/app/models/operations/feature_flag_scope.rb
@@ -0,0 +1,62 @@
+# frozen_string_literal: true
+
+module Operations
+ class FeatureFlagScope < ApplicationRecord
+ prepend HasEnvironmentScope
+ include Gitlab::Utils::StrongMemoize
+
+ self.table_name = 'operations_feature_flag_scopes'
+
+ belongs_to :feature_flag
+
+ validates :environment_scope, uniqueness: {
+ scope: :feature_flag,
+ message: "(%{value}) has already been taken"
+ }
+
+ validates :environment_scope,
+ if: :default_scope?, on: :update,
+ inclusion: { in: %w(*), message: 'cannot be changed from default scope' }
+
+ validates :strategies, feature_flag_strategies: true
+
+ before_destroy :prevent_destroy_default_scope, if: :default_scope?
+
+ scope :ordered, -> { order(:id) }
+ scope :enabled, -> { where(active: true) }
+ scope :disabled, -> { where(active: false) }
+
+ def self.with_name_and_description
+ joins(:feature_flag)
+ .select(FeatureFlag.arel_table[:name], FeatureFlag.arel_table[:description])
+ end
+
+ def self.for_unleash_client(project, environment)
+ select_columns = [
+ 'DISTINCT ON (operations_feature_flag_scopes.feature_flag_id) operations_feature_flag_scopes.id',
+ '(operations_feature_flags.active AND operations_feature_flag_scopes.active) AS active',
+ 'operations_feature_flag_scopes.strategies',
+ 'operations_feature_flag_scopes.environment_scope',
+ 'operations_feature_flag_scopes.created_at',
+ 'operations_feature_flag_scopes.updated_at'
+ ]
+
+ select(select_columns)
+ .with_name_and_description
+ .where(feature_flag_id: project.operations_feature_flags.select(:id))
+ .order(:feature_flag_id)
+ .on_environment(environment)
+ .reverse_order
+ end
+
+ private
+
+ def default_scope?
+ environment_scope_was == '*'
+ end
+
+ def prevent_destroy_default_scope
+ raise ActiveRecord::ReadOnlyRecord, "default scope cannot be destroyed"
+ end
+ end
+end