summaryrefslogtreecommitdiff
path: root/app/services/admin/set_feature_flag_service.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/admin/set_feature_flag_service.rb')
-rw-r--r--app/services/admin/set_feature_flag_service.rb85
1 files changed, 85 insertions, 0 deletions
diff --git a/app/services/admin/set_feature_flag_service.rb b/app/services/admin/set_feature_flag_service.rb
new file mode 100644
index 00000000000..d72a18a6a58
--- /dev/null
+++ b/app/services/admin/set_feature_flag_service.rb
@@ -0,0 +1,85 @@
+# frozen_string_literal: true
+
+module Admin
+ class SetFeatureFlagService
+ def initialize(feature_flag_name:, params:)
+ @name = feature_flag_name
+ @params = params
+ end
+
+ def execute
+ unless params[:force]
+ error = validate_feature_flag_name
+ return ServiceResponse.error(message: error, reason: :invalid_feature_flag) if error
+ end
+
+ flag_target = Feature::Target.new(params)
+ value = gate_value(params)
+
+ case value
+ when true
+ enable!(flag_target)
+ when false
+ disable!(flag_target)
+ else
+ enable_partially!(value, params)
+ end
+
+ feature_flag = Feature.get(name) # rubocop:disable Gitlab/AvoidFeatureGet
+
+ ServiceResponse.success(payload: { feature_flag: feature_flag })
+ rescue Feature::Target::UnknowTargetError => e
+ ServiceResponse.error(message: e.message, reason: :actor_not_found)
+ end
+
+ private
+
+ attr_reader :name, :params
+
+ def enable!(flag_target)
+ if flag_target.gate_specified?
+ flag_target.targets.each { |target| Feature.enable(name, target) }
+ else
+ Feature.enable(name)
+ end
+ end
+
+ def disable!(flag_target)
+ if flag_target.gate_specified?
+ flag_target.targets.each { |target| Feature.disable(name, target) }
+ else
+ Feature.disable(name)
+ end
+ end
+
+ def enable_partially!(value, params)
+ if params[:key] == 'percentage_of_actors'
+ Feature.enable_percentage_of_actors(name, value)
+ else
+ Feature.enable_percentage_of_time(name, value)
+ end
+ end
+
+ def validate_feature_flag_name
+ # overridden in EE
+ end
+
+ def gate_value(params)
+ case params[:value]
+ when 'true'
+ true
+ when '0', 'false'
+ false
+ else
+ # https://github.com/jnunemaker/flipper/blob/master/lib/flipper/typecast.rb#L47
+ if params[:value].to_s.include?('.')
+ params[:value].to_f
+ else
+ params[:value].to_i
+ end
+ end
+ end
+ end
+end
+
+Admin::SetFeatureFlagService.prepend_mod