Sha256: 36a554284a8a89fdf9dcdec1b63252de32f75523ef5924072d972902ad8ec44e

Contents?: true

Size: 1.55 KB

Versions: 6

Compression:

Stored size: 1.55 KB

Contents

class ReeRoda::BuildRouteErrors
  include Ree::FnDSL

  fn :build_route_errors do
    link "ree_swagger/dto/error_dto", -> { ErrorDto }
  end

  contract(ReeRoutes::Route => ArrayOf[ErrorDto])
  def call(route)
    ree_object = route.action
    errors = recursively_extract_errors(ree_object)

    errors
      .select {
        _1.ancestors.include?(ReeErrors::Error) && status_from_error(_1)
      }
      .map {
        e = _1.new
        description = "type: **#{e.type}**, code: **#{e.code}**, message: **#{e.message}**"

        ErrorDto.new(
          status: status_from_error(_1),
          description: description
        )
      }
      .uniq { [_1.status, _1.description] }
  end

  private

  def recursively_extract_errors(ree_object)
    errors = extract_errors(ree_object)

    ree_object.links.each do |link|
      obj = Ree.container.packages_facade.get_object(
        link.package_name, link.object_name
      )

      if obj.fn?
        errors += recursively_extract_errors(obj)
      end
    end

    errors
  end

  def extract_errors(ree_object)
    klass = ree_object.klass
    return [] if ree_object.object?

    method_decorator = Ree::Contracts.get_method_decorator(
      klass, :call, scope: :instance
    )

    method_decorator&.errors || []
  end

  def status_from_error(error)
    case error.instance_variable_get(:@type)
    when :not_found
      404
    when :invalid_param
      400
    when :conflict
      405
    when :auth
      401
    when :permission
      403
    when :payment
      402
    when :validation
      422
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
ree_lib-1.0.45 lib/ree_lib/packages/ree_roda/package/ree_roda/services/build_route_errors.rb
ree_lib-1.0.44 lib/ree_lib/packages/ree_roda/package/ree_roda/services/build_route_errors.rb
ree_lib-1.0.43 lib/ree_lib/packages/ree_roda/package/ree_roda/services/build_route_errors.rb
ree_lib-1.0.42 lib/ree_lib/packages/ree_roda/package/ree_roda/services/build_route_errors.rb
ree_lib-1.0.41 lib/ree_lib/packages/ree_roda/package/ree_roda/services/build_route_errors.rb
ree_lib-1.0.40 lib/ree_lib/packages/ree_roda/package/ree_roda/services/build_route_errors.rb