Reviewed-on: #397 Co-authored-by: miteruzo <miteruzo@naver.com> Co-committed-by: miteruzo <miteruzo@naver.com>
このコミットはPull リクエスト #397 でマージされました.
このコミットが含まれているのは:
@@ -0,0 +1,61 @@
|
||||
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
|
||||
@@ -0,0 +1,38 @@
|
||||
class UserThemeSlotsController < ApplicationController
|
||||
wrap_parameters false
|
||||
|
||||
def index
|
||||
return head :unauthorized unless current_user
|
||||
|
||||
render json: current_user
|
||||
.theme_slots
|
||||
.order(:base_theme, :slot_no)
|
||||
.map { |slot| slot.serializable_hash }
|
||||
end
|
||||
|
||||
def update
|
||||
return head :unauthorized unless current_user
|
||||
|
||||
base_theme = params[:base_theme].to_s
|
||||
slot_no = params[:slot_no].to_i
|
||||
tokens = params[:tokens]
|
||||
|
||||
unless UserThemeSlot::BASE_THEMES.include?(base_theme)
|
||||
return render_validation_error fields: { base_theme: ['値が不正です.'] }
|
||||
end
|
||||
unless UserThemeSlot::SLOT_NOS.include?(slot_no)
|
||||
return render_validation_error fields: { slot_no: ['値が不正です.'] }
|
||||
end
|
||||
unless tokens.is_a?(ActionController::Parameters) || tokens.is_a?(Hash)
|
||||
return render_validation_error fields: { tokens: ['JSON object で指定してください.'] }
|
||||
end
|
||||
|
||||
slot = UserThemeSlot.find_or_initialize_by(user: current_user,
|
||||
base_theme:,
|
||||
slot_no:)
|
||||
slot.tokens = tokens.is_a?(ActionController::Parameters) ? tokens.to_unsafe_h : tokens
|
||||
slot.save!
|
||||
|
||||
render json: slot.serializable_hash, status: :ok
|
||||
end
|
||||
end
|
||||
新しい課題から参照
ユーザをブロックする