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

76 lines
2.0 KiB

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