debian-mirror-gitlab/lib/atlassian/jira_connect/serializers/feature_flag_entity.rb
2021-03-11 19:13:27 +05:30

84 lines
2.7 KiB
Ruby

# frozen_string_literal: true
module Atlassian
module JiraConnect
module Serializers
class FeatureFlagEntity < Grape::Entity
include Gitlab::Routing
alias_method :flag, :object
format_with(:string, &:to_s)
expose :schema_version, as: :schemaVersion
expose :id, format_with: :string
expose :name, as: :key
expose :update_sequence_id, as: :updateSequenceId
expose :name, as: :displayName
expose :summary
expose :details
expose :issue_keys, as: :issueKeys
def issue_keys
@issue_keys ||= JiraIssueKeyExtractor.new(flag.description).issue_keys
end
def schema_version
'1.0'
end
def update_sequence_id
options[:update_sequence_id] || Client.generate_update_sequence_id
end
STRATEGY_NAMES = {
::Operations::FeatureFlags::Strategy::STRATEGY_DEFAULT => 'All users',
::Operations::FeatureFlags::Strategy::STRATEGY_GITLABUSERLIST => 'User List',
::Operations::FeatureFlags::Strategy::STRATEGY_GRADUALROLLOUTUSERID => 'Percent of users',
::Operations::FeatureFlags::Strategy::STRATEGY_FLEXIBLEROLLOUT => 'Percent rollout',
::Operations::FeatureFlags::Strategy::STRATEGY_USERWITHID => 'User IDs'
}.freeze
private
# The summary does not map very well to our FeatureFlag model.
#
# We allow feature flags to have multiple strategies, depending
# on the environment. Jira expects a single rollout strategy.
#
# Also, we don't actually support showing a single flag, so we use the
# edit path as an interim solution.
def summary(strategies = flag.strategies)
{
url: edit_project_feature_flag_url(flag.project, flag),
lastUpdated: flag.updated_at.iso8601,
status: {
enabled: flag.active,
defaultValue: '',
rollout: {
percentage: strategies.map do |s|
s.parameters['rollout'] || s.parameters['percentage']
end.compact.first&.to_f,
text: strategies.map { |s| STRATEGY_NAMES[s.name] }.compact.join(', ')
}.compact
}
}
end
def details
envs = flag.strategies.flat_map do |s|
s.scopes.map do |es|
env_type = es.environment_scope.scan(/development|testing|staging|production/).first
[es.environment_scope, env_type, s]
end
end
envs.map do |env_name, env_type, strat|
summary([strat]).merge(environment: { name: env_name, type: env_type }.compact)
end
end
end
end
end
end