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

104 lines
2.8 KiB

  1. class ApplicationController < ActionController::API
  2. rescue_from ActiveRecord::RecordInvalid, with: :render_record_invalid
  3. rescue_from ActiveRecord::RecordNotUnique, with: :render_record_not_unique
  4. before_action :reject_banned_ip_address!
  5. before_action :authenticate_user
  6. before_action :reject_banned_user!
  7. def current_user = @current_user
  8. private
  9. def authenticate_user
  10. code = request.headers['X-Transfer-Code'] || request.headers['HTTP_X_TRANSFER_CODE']
  11. return if code.blank?
  12. @current_user = User.find_by(inheritance_code: code)
  13. end
  14. def bool? key, default: false
  15. return default if params[key].nil?
  16. s = params[key].to_s.strip.downcase
  17. if default
  18. !(s.in?(['0', 'false', 'off', 'no']))
  19. else
  20. s.in?(['', '1', 'true', 'on', 'yes'])
  21. end
  22. end
  23. def render_bad_request message = 'リクエストが不正です.', field: nil, code: :bad_request
  24. render_error(:bad_request, message, field:, code:)
  25. end
  26. def render_unprocessable_entity message = '入力を確認してください.', field: nil, code: :invalid
  27. render_error(:unprocessable_entity, message, field:, code:)
  28. end
  29. def render_error status, message, field: nil, code: status
  30. error = { code: code.to_s, message: }
  31. error[:field] = field.to_s if field.present?
  32. render json: { errors: [error] }, status:
  33. end
  34. def render_model_errors record, status: :unprocessable_entity
  35. errors =
  36. record.errors.map do |error|
  37. { code: error.type.to_s,
  38. field: error.attribute.to_s,
  39. message: error.full_message }
  40. end
  41. errors = [{ code: 'invalid', message: '入力を確認してください.' }] if errors.empty?
  42. render json: { errors: }, status:
  43. end
  44. def render_record_invalid error
  45. render_model_errors(error.record)
  46. end
  47. def render_record_not_unique _error = nil
  48. render_unprocessable_entity('既に存在してゐます.', code: :taken)
  49. end
  50. def reject_banned_ip_address!
  51. ip_address = IpAddress.find_by(ip_address: IPAddr.new(request.remote_ip).hton)
  52. return unless ip_address&.banned?
  53. head :forbidden
  54. end
  55. def reject_banned_user!
  56. return unless current_user&.banned?
  57. head :forbidden
  58. end
  59. def render_validation_error record = nil, fields: { }, base: []
  60. errors = { }
  61. if record
  62. record.errors.messages.each do |attr, messages|
  63. errors[attr] ||= []
  64. errors[attr].concat(messages)
  65. end
  66. end
  67. fields.each do |attr, messages|
  68. errors[attr] ||= []
  69. errors[attr].concat(Array(messages))
  70. end
  71. base_errors = Array(base) - Array(errors.delete(:base))
  72. render json: { type: 'validation_error',
  73. message: '入力内容を確認してください.',
  74. errors:,
  75. base_errors: },
  76. status: :unprocessable_entity
  77. end
  78. end