class LinkedRails::IRIMapper

Constants

EMPTY_IRI_OPTS

Public Class Methods

index_resource_from_iri(iri, user_context) click to toggle source
# File lib/linked_rails/iri_mapper.rb, line 43
def index_resource_from_iri(iri, user_context)
  ensure_absolute_iri!(iri)

  opts = opts_from_iri(iri)
  index_resource_from_opts(opts, user_context)
end
index_resource_from_iri!(iri, user_context) click to toggle source
# File lib/linked_rails/iri_mapper.rb, line 50
def index_resource_from_iri!(iri, user_context)
  index_resource_from_iri(iri, user_context) || raise(ActiveRecord::RecordNotFound)
end
index_resource_from_opts(opts, user_context) click to toggle source
# File lib/linked_rails/iri_mapper.rb, line 54
def index_resource_from_opts(opts, user_context)
  opts[:class]&.requested_index_resource(opts[:params], user_context) if opts[:action] == 'index'
end
opts_from_iri(iri, method: 'GET') click to toggle source

Converts an IRI into a hash containing the action, class, iri and the params of the iri @return [Hash] @example Valid resource IRI

opts_from_iri('https://example.com/resource/1?foo=bar')
=> {
  action: 'show',
  class: Resource,
  params: {
    id: '1',
    foo: 'bar'
  }
}

@example Valid collection IRI

opts_from_iri('https://example.com/resources?foo=bar')
=> {
  action: 'index',
  class: Resource,
  params: {
    foo: 'bar'
  }
}

@example Invalid IRI

opts_from_iri('https://example.com/invalid/1')
=> {
  params: {}
}
# File lib/linked_rails/iri_mapper.rb, line 34
def opts_from_iri(iri, method: 'GET')
  query = Rack::Utils.parse_nested_query(URI(iri.to_s).query)
  params = Rails.application.routes.recognize_path(iri.to_s, method: method)

  route_params_to_opts(params.merge(query))
rescue ActionController::RoutingError
  EMPTY_IRI_OPTS.dup
end
parent_from_params(params, user_context) click to toggle source
# File lib/linked_rails/iri_mapper.rb, line 58
def parent_from_params(params, user_context)
  return unless params.key?(:parent_iri)

  parent_iri = "/#{params[:parent_iri]}"
  opts = LinkedRails.iri_mapper.opts_from_iri(parent_iri)
  opts[:params] = params.except(:parent_iri, :singular_route).merge(opts[:params])

  LinkedRails.iri_mapper.resource_from_opts(opts, user_context)
end
resource_from_iri(iri, user_context) click to toggle source
# File lib/linked_rails/iri_mapper.rb, line 68
def resource_from_iri(iri, user_context)
  ensure_absolute_iri!(iri)

  opts = opts_from_iri(iri)
  resource_from_opts(opts, user_context)
end
resource_from_iri!(iri, user_context) click to toggle source
# File lib/linked_rails/iri_mapper.rb, line 75
def resource_from_iri!(iri, user_context)
  resource_from_iri(iri, user_context) || raise(ActiveRecord::RecordNotFound)
end
resource_from_opts(opts, user_context) click to toggle source
# File lib/linked_rails/iri_mapper.rb, line 79
def resource_from_opts(opts, user_context)
  opts[:class]&.requested_resource(opts, user_context)
end
route_params_to_opts(params) click to toggle source
# File lib/linked_rails/iri_mapper.rb, line 83
def route_params_to_opts(params)
  controller_class = class_for_controller(params[:controller])

  return EMPTY_IRI_OPTS.dup if controller_class.blank?

  {
    action: params[:action],
    class: controller_class,
    params: params.except(:action, :controller)
  }.with_indifferent_access
end
single_resource_from_iri(iri, user_context) click to toggle source
# File lib/linked_rails/iri_mapper.rb, line 95
def single_resource_from_iri(iri, user_context)
  ensure_absolute_iri!(iri)

  opts = opts_from_iri(iri)
  single_resource_from_opts(opts, user_context)
end
single_resource_from_iri!(iri, user_context) click to toggle source
# File lib/linked_rails/iri_mapper.rb, line 102
def single_resource_from_iri!(iri, user_context)
  single_resource_from_iri(iri, user_context) || raise(ActiveRecord::RecordNotFound)
end
single_resource_from_opts(opts, user_context) click to toggle source
# File lib/linked_rails/iri_mapper.rb, line 106
def single_resource_from_opts(opts, user_context)
  opts[:class]&.requested_single_resource(opts[:params], user_context) unless opts[:params] == 'index'
end

Private Class Methods

class_for_controller(controller) click to toggle source
# File lib/linked_rails/iri_mapper.rb, line 112
def class_for_controller(controller)
  return if controller.blank?

  "::#{controller.camelize}Controller"
    .safe_constantize
    .try(:controller_class)
end
ensure_absolute_iri!(iri) click to toggle source
# File lib/linked_rails/iri_mapper.rb, line 120
def ensure_absolute_iri!(iri)
  raise("An absolute url is expected. #{iri} is given.") if iri.blank? || URI(iri).relative?
end