1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
|
# frozen_string_literal: true
class Projects::FeatureFlagsController < Projects::ApplicationController
respond_to :html
before_action :authorize_read_feature_flag!
before_action :authorize_create_feature_flag!, only: [:new, :create]
before_action :authorize_update_feature_flag!, only: [:edit, :update]
before_action :authorize_destroy_feature_flag!, only: [:destroy]
before_action :feature_flag, only: [:edit, :update, :destroy]
feature_category :feature_flags
urgency :low
def index
@feature_flags = FeatureFlagsFinder
.new(project, current_user, scope: params[:scope])
.execute
.page(params[:page])
.per(30)
respond_to do |format|
format.html
format.json do
Gitlab::PollingInterval.set_header(response, interval: 10_000)
render json: { feature_flags: feature_flags_json }.merge(summary_json)
end
end
end
def new; end
def show
respond_to do |format|
format.json do
Gitlab::PollingInterval.set_header(response, interval: 10_000)
render_success_json(feature_flag)
end
end
end
def create
result = FeatureFlags::CreateService.new(project, current_user, create_params).execute
if result[:status] == :success
respond_to do |format|
format.json { render_success_json(result[:feature_flag]) }
end
else
respond_to do |format|
format.json { render_error_json(result[:message]) }
end
end
end
def edit; end
def update
result = FeatureFlags::UpdateService.new(project, current_user, update_params).execute(feature_flag)
if result[:status] == :success
respond_to do |format|
format.json { render_success_json(result[:feature_flag]) }
end
else
respond_to do |format|
format.json { render_error_json(result[:message], result[:http_status]) }
end
end
end
def destroy
result = FeatureFlags::DestroyService.new(project, current_user).execute(feature_flag)
if result[:status] == :success
respond_to do |format|
format.html { redirect_to_index(notice: _('Feature flag was successfully removed.')) }
format.json { render_success_json(feature_flag) }
end
else
respond_to do |format|
format.html { redirect_to_index(alert: _('Feature flag was not removed.')) }
format.json { render_error_json(result[:message]) }
end
end
end
protected
def feature_flag
@feature_flag ||= @noteable = project.operations_feature_flags.find_by_iid!(params[:iid])
end
def create_params
params.require(:operations_feature_flag).permit(
:name,
:description,
:active,
:version,
scopes_attributes: [
:environment_scope, :active,
{ strategies: [:name, { parameters: [:groupId, :percentage, :userIds] }] }
],
strategies_attributes: [
:name,
:user_list_id,
{ parameters: [:groupId, :percentage, :userIds, :rollout, :stickiness],
scopes_attributes: [:environment_scope] }
]
)
end
def update_params
params.require(:operations_feature_flag).permit(
:name,
:description,
:active,
scopes_attributes: [
:id,
:environment_scope,
:active,
:_destroy,
{ strategies: [:name, { parameters: [:groupId, :percentage, :userIds] }] }
],
strategies_attributes: [
:id,
:name,
:user_list_id,
:_destroy,
{ parameters: [:groupId, :percentage, :userIds, :rollout, :stickiness],
scopes_attributes: [:id, :environment_scope, :_destroy] }
]
)
end
def feature_flag_json(feature_flag)
FeatureFlagSerializer
.new(project: @project, current_user: @current_user)
.represent(feature_flag)
end
def feature_flags_json
FeatureFlagSerializer
.new(project: @project, current_user: @current_user)
.with_pagination(request, response)
.represent(@feature_flags)
end
def summary_json
FeatureFlagSummarySerializer
.new(project: @project, current_user: @current_user)
.represent(@project)
end
def redirect_to_index(**args)
redirect_to project_feature_flags_path(@project), status: :found, **args
end
def render_success_json(feature_flag)
render json: feature_flag_json(feature_flag), status: :ok
end
def render_error_json(messages, status = :bad_request)
render json: { message: messages }, status: status
end
end
|