85 lines
2 KiB
Ruby
85 lines
2 KiB
Ruby
# 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
|