ぼざクリタグ広場 https://hub.nizika.monster
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

67 lines
1.7 KiB

  1. class UsersController < ApplicationController
  2. def create
  3. return head :unprocessable_entity if request.remote_ip.blank?
  4. user = nil
  5. User.transaction do
  6. user = User.create!(inheritance_code: SecureRandom.uuid, role: :guest)
  7. attach_ip_address!(user)
  8. end
  9. render json: { code: user.inheritance_code,
  10. user: user.slice(:id, :name, :inheritance_code, :role) },
  11. status: :created
  12. end
  13. def verify
  14. user = User.find_by(inheritance_code: params[:code])
  15. return render json: { valid: false } unless user
  16. return head :unprocessable_entity if request.remote_ip.blank?
  17. attach_ip_address!(user)
  18. render json: { valid: true, user: user.slice(:id, :name, :inheritance_code, :role) }
  19. end
  20. def renew
  21. return head :unauthorized unless current_user
  22. user = current_user
  23. user.inheritance_code = SecureRandom.uuid
  24. user.save!
  25. render json: { code: user.inheritance_code }
  26. end
  27. def me
  28. user = User.find_by(inheritance_code: params[:code])
  29. return head :not_found unless user
  30. render json: user.slice(:id, :name, :inheritance_code, :role)
  31. end
  32. def update
  33. user = current_user
  34. return head :unauthorized if user&.id != params[:id].to_i
  35. name = params[:name]
  36. return head :bad_request if name.blank?
  37. if user.update(name:)
  38. render json: user.slice(:id, :name, :inheritance_code, :role), status: :ok
  39. else
  40. render json: user.errors, status: :unprocessable_entity
  41. end
  42. end
  43. private
  44. def attach_ip_address! user
  45. ip_bin = IPAddr.new(request.remote_ip).hton
  46. ip_address = IpAddress.find_or_create_by!(ip_address: ip_bin)
  47. UserIp.create_or_find_by!(user:, ip_address:)
  48. end
  49. end