# frozen_string_literal: true # require 'jwt' require "cancancan" require "active_support/rescuable" module ExceptionHandler extend ActiveSupport::Concern included do # Вернуть 400 - Bad Request, если параметры ошибочны rescue_from ActiveRecord::StatementInvalid, ActionController::ParameterMissing do |e| Rails.logger.error e.to_s render json: { errors: [e.message] }, status: :bad_request end # Вернуть 401 - unauthorized, если учетная запись неавторизована rescue_from Authentication::AuthenticationError, ::JWT::DecodeError do |e| render json: { errors: [e.message] }, status: :unauthorized end # Вернуть 403 - Forbidden rescue_from ::CanCan::AccessDenied do |_e| render json: { errors: ["У вас нет прав доступа к этому ресурсу"] }, status: :forbidden end # Вернуть 404 - Not Found rescue_from ProfileNotBindedError do |e| render json: { errors: [e.message] }, status: :not_found end # Вернуть 404 - Not Found, если запись в БД отсутствует rescue_from ActiveRecord::RecordNotFound do |_e| render json: { errors: ["Запись не найдена"] }, status: :not_found end # Вернуть 422 - Unprocessable Entity, если при записе в БД произошли ошибки, либо не пройдена валидация # в ответ возвращаем дополнительно структуру с описанием ошибок rescue_from ActiveRecord::RecordInvalid do |e| render json: { errors: [e.message], source: e.record.errors.as_json }, status: :unprocessable_entity end end # # Используется для сигнализации ошибки, что аккаунт не прикреплен ни к одному профилю # class ProfileNotBindedError < StandardError attr_reader :param def initialize(param) @param = param super("No active profile: #{param}") end end # # Используется для сигнализации ошибки, что нельзя отвязать аккаунт # class AccountUnbindDisallowedError < StandardError attr_reader :param def initialize super("Невозможно отвязать аккаунт от профиля, если это единственный или активный профиль") end end end