diff options
Diffstat (limited to 'app/services/admin/set_feature_flag_service.rb')
-rw-r--r-- | app/services/admin/set_feature_flag_service.rb | 85 |
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 |