class UsersController < ApplicationController def create if current_user return render json: { code: current_user.inheritance_code, user: current_user.slice(:id, :name, :inheritance_code, :role) } end user = nil User.transaction do user = User.create!(inheritance_code: SecureRandom.uuid, role: :guest) attach_ip_address!(user) end establish_user_session(user) render json: { code: user.inheritance_code, user: user.slice(:id, :name, :inheritance_code, :role) }, status: :created end def verify user = if bool?(:restore) && current_user current_user else User.find_by(inheritance_code: params[:code]) end return render json: { valid: false } unless user return head :forbidden if user.banned? attach_ip_address!(user) establish_user_session(user) render json: { valid: true, user: user.slice(:id, :name, :inheritance_code, :role) } end def show_session return head :unauthorized unless current_user render json: current_user.slice(:id, :name, :role) end def csrf response.headers['Cache-Control'] = 'private, no-store' render json: { token: form_authenticity_token } end def destroy_session reset_session response.headers['Cache-Control'] = 'private, no-store' head :no_content end def renew return head :unauthorized unless current_user user = current_user user.inheritance_code = SecureRandom.uuid user.save! establish_user_session(user) render json: { code: user.inheritance_code } end def me user = current_user return head :unauthorized unless user attach_ip_address!(user) render json: user.slice(:id, :name, :inheritance_code, :role) end def update user = current_user return head :unauthorized if user&.id != params[:id].to_i name = params[:name] return render_unprocessable_entity('名前は必須です.', field: :name) if name.blank? if user.update(name:) render json: user.slice(:id, :name, :inheritance_code, :role), status: :ok else render_validation_error user end end private def attach_ip_address! user ip_bin = IPAddr.new(request.remote_ip).hton ip_address = IpAddress.create_or_find_by!(ip_address: ip_bin) UserIp.create_or_find_by!(user:, ip_address:) end end