f5b632ed89
Reviewed-on: #397 Co-authored-by: miteruzo <miteruzo@naver.com> Co-committed-by: miteruzo <miteruzo@naver.com>
62 行
1.5 KiB
Ruby
62 行
1.5 KiB
Ruby
class UserSettingsController < ApplicationController
|
|
wrap_parameters false
|
|
|
|
def show
|
|
return head :unauthorized unless current_user
|
|
|
|
render json: current_setting.serializable_hash
|
|
end
|
|
|
|
def update
|
|
return head :unauthorized unless current_user
|
|
|
|
raw_attributes = editable_raw_attributes
|
|
field_errors = validate_raw_attributes(raw_attributes)
|
|
return render_validation_error fields: field_errors if field_errors.present?
|
|
|
|
setting = current_setting
|
|
setting.assign_attributes(raw_attributes)
|
|
|
|
if setting.save
|
|
render json: setting.serializable_hash, status: :ok
|
|
else
|
|
render_validation_error setting
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def current_setting
|
|
Setting.find_or_create_by!(user: current_user) do |setting|
|
|
setting.assign_attributes(Setting.defaults)
|
|
end
|
|
rescue ActiveRecord::RecordNotUnique
|
|
Setting.find_by!(user: current_user)
|
|
end
|
|
|
|
def editable_raw_attributes
|
|
request.request_parameters.slice(*Setting::EDITABLE_ATTRIBUTES)
|
|
end
|
|
|
|
def validate_raw_attributes raw_attributes
|
|
raw_attributes.each_with_object({ }) do |(key, value), errors|
|
|
next if value_matches_type?(key, value)
|
|
|
|
errors[key.to_sym] = ['値の型が不正です.']
|
|
end
|
|
end
|
|
|
|
def value_matches_type? key, value
|
|
case Setting::TYPE_BY_ATTRIBUTE.fetch(key)
|
|
when :string
|
|
value.is_a?(String)
|
|
when :integer
|
|
value.is_a?(Integer)
|
|
when :boolean
|
|
value == true || value == false
|
|
else
|
|
false
|
|
end
|
|
end
|
|
end
|