Class: LinkedRails::IRIMapper

Inherits:
Object
  • Object
show all
Defined in:
lib/linked_rails/iri_mapper.rb

Constant Summary collapse

EMPTY_IRI_OPTS =
{params: {}}.freeze

Class Method Summary collapse

Class Method Details

.opts_from_iri(iri, method: 'GET') ⇒ Hash

Converts an IRI into a hash containing the action, class, iri and the params of the iri

Examples:

Valid resource IRI

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

Valid collection IRI

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

Invalid IRI

opts_from_iri('https://example.com/invalid/1')
=> {
  params: {}
}

Returns:

  • (Hash)


36
37
38
39
40
41
42
43
# File 'lib/linked_rails/iri_mapper.rb', line 36

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), iri.to_s)
rescue ActionController::RoutingError, SystemStackError
  EMPTY_IRI_OPTS.dup
end

.parent_from_params(params, user_context) ⇒ Object



45
46
47
48
49
50
51
# File 'lib/linked_rails/iri_mapper.rb', line 45

def parent_from_params(params, user_context)
  return unless params.key?(:parent_iri)

  parent_iri = LinkedRails.iri(path: "/#{params[:parent_iri]}")

  LinkedRails.iri_mapper.resource_from_iri(parent_iri, user_context)
end

.resource_from_iri(iri, user_context) ⇒ Object



53
54
55
56
57
58
# File 'lib/linked_rails/iri_mapper.rb', line 53

def resource_from_iri(iri, user_context)
  return nil unless absolute_iri?(iri)

  opts = opts_from_iri(iri)
  resource_from_opts(opts, user_context)
end

.resource_from_iri!(iri, user_context) ⇒ Object



60
61
62
# File 'lib/linked_rails/iri_mapper.rb', line 60

def resource_from_iri!(iri, user_context)
  resource_from_iri(iri, user_context) || raise(ActiveRecord::RecordNotFound)
end

.resource_from_opts(opts, user_context) ⇒ Object



64
65
66
# File 'lib/linked_rails/iri_mapper.rb', line 64

def resource_from_opts(opts, user_context)
  opts[:class]&.requested_resource(opts, user_context)
end

.route_params_to_opts(params, iri) ⇒ Object



68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/linked_rails/iri_mapper.rb', line 68

def route_params_to_opts(params, iri)
  controller_class = class_for_controller(params[:controller])

  return EMPTY_IRI_OPTS.dup if controller_class.blank?

  {
    action: params[:action],
    class: controller_class,
    iri: iri,
    params: sanitized_route_params(controller_class, params)
  }.with_indifferent_access
end