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