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

.index_resource_from_iri(iri, user_context) ⇒ Object



43
44
45
46
47
48
# 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) ⇒ Object



50
51
52
# 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) ⇒ Object



54
55
56
# 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') ⇒ 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,
  params: {
    id: '1',
    foo: 'bar'
  }
}

Valid collection IRI

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

Invalid IRI

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

Returns:

  • (Hash)


34
35
36
37
38
39
40
41
# 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) ⇒ Object



58
59
60
61
62
63
64
65
66
# 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) ⇒ Object



68
69
70
71
72
73
# 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) ⇒ Object



75
76
77
# 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) ⇒ Object



79
80
81
# 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) ⇒ Object



83
84
85
86
87
88
89
90
91
92
93
# 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) ⇒ Object



95
96
97
98
99
100
# 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) ⇒ Object



102
103
104
# 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) ⇒ Object



106
107
108
# 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