ぼざクリタグ広場 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.
 
 
 
 
 

63 lines
1.6 KiB

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