| @@ -1,18 +1,26 @@ | |||||
| class UsersController < ApplicationController | class UsersController < ApplicationController | ||||
| def create | def create | ||||
| user = User.create!(inheritance_code: SecureRandom.uuid, role: 'guest') | |||||
| return head :unprocessable_entity if request.remote_ip.blank? | |||||
| user = nil | |||||
| User.transaction do | |||||
| user = User.create!(inheritance_code: SecureRandom.uuid, role: :guest) | |||||
| attach_ip_address!(user) | |||||
| end | |||||
| render json: { code: user.inheritance_code, | render json: { code: user.inheritance_code, | ||||
| user: user.slice(:id, :name, :inheritance_code, :role) } | |||||
| user: user.slice(:id, :name, :inheritance_code, :role) }, | |||||
| status: :created | |||||
| end | end | ||||
| def verify | def verify | ||||
| ip_bin = IPAddr.new(request.remote_ip).hton | |||||
| ip_address = IpAddress.find_or_create_by!(ip_address: ip_bin) | |||||
| user = User.find_by(inheritance_code: params[:code]) | user = User.find_by(inheritance_code: params[:code]) | ||||
| return render json: { valid: false } unless user | return render json: { valid: false } unless user | ||||
| UserIp.find_or_create_by!(user:, ip_address:) | |||||
| return head :unprocessable_entity if request.remote_ip.blank? | |||||
| attach_ip_address!(user) | |||||
| render json: { valid: true, user: user.slice(:id, :name, :inheritance_code, :role) } | render json: { valid: true, user: user.slice(:id, :name, :inheritance_code, :role) } | ||||
| end | end | ||||
| @@ -41,9 +49,18 @@ class UsersController < ApplicationController | |||||
| return head :bad_request if name.blank? | return head :bad_request if name.blank? | ||||
| if user.update(name:) | if user.update(name:) | ||||
| render json: user.slice(:id, :name, :inheritance_code, :role), status: :created | |||||
| render json: user.slice(:id, :name, :inheritance_code, :role), status: :ok | |||||
| else | else | ||||
| render json: user.errors, status: :unprocessable_entity | render json: user.errors, status: :unprocessable_entity | ||||
| end | end | ||||
| end | end | ||||
| private | |||||
| def attach_ip_address! user | |||||
| ip_bin = IPAddr.new(request.remote_ip).hton | |||||
| ip_address = IpAddress.find_or_create_by!(ip_address: ip_bin) | |||||
| UserIp.create_or_find_by!(user:, ip_address:) | |||||
| end | |||||
| end | end | ||||