linked_rails 0.0.3 → 0.0.4.pre.g14b377f91
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE +21 -674
- data/app/controllers/linked_rails/actions/objects_controller.rb +9 -0
- data/app/controllers/linked_rails/bulk_controller.rb +71 -21
- data/app/controllers/linked_rails/enum_values_controller.rb +0 -42
- data/app/models/linked_rails/actions/item.rb +64 -55
- data/app/models/linked_rails/actions/list.rb +6 -31
- data/app/models/linked_rails/actions/object.rb +38 -0
- data/app/models/linked_rails/collection/configuration.rb +55 -0
- data/app/models/linked_rails/collection/filter.rb +1 -1
- data/app/models/linked_rails/collection/filter_field.rb +19 -2
- data/app/models/linked_rails/collection/filter_option.rb +1 -1
- data/app/models/linked_rails/collection/filterable.rb +6 -9
- data/app/models/linked_rails/collection/infinite.rb +113 -0
- data/app/models/linked_rails/collection/infinite_view.rb +1 -90
- data/app/models/linked_rails/collection/iri.rb +47 -43
- data/app/models/linked_rails/collection/iri_mapping.rb +15 -7
- data/app/models/linked_rails/collection/paginated.rb +46 -0
- data/app/models/linked_rails/collection/paginated_view.rb +1 -33
- data/app/models/linked_rails/collection/sortable.rb +1 -9
- data/app/models/linked_rails/collection/sorting.rb +1 -1
- data/app/models/linked_rails/collection/view.rb +51 -14
- data/app/models/linked_rails/collection.rb +53 -85
- data/app/models/linked_rails/creative_work.rb +1 -1
- data/app/models/linked_rails/entry_point.rb +8 -5
- data/app/models/linked_rails/enum_value.rb +40 -2
- data/app/models/linked_rails/form/field/association_input.rb +7 -1
- data/app/models/linked_rails/form/field/file_input.rb +1 -0
- data/app/models/linked_rails/form/field/resource_field.rb +2 -0
- data/{lib/linked_rails/enhancements/indexable/model.rb → app/models/linked_rails/form/field/url_input.rb} +3 -3
- data/app/models/linked_rails/form/field.rb +37 -13
- data/app/models/linked_rails/form/field_factory.rb +48 -18
- data/app/models/linked_rails/form/group.rb +4 -6
- data/app/models/linked_rails/form/page.rb +8 -4
- data/app/models/linked_rails/form.rb +16 -21
- data/app/models/linked_rails/manifest.rb +104 -22
- data/app/models/linked_rails/menus/item.rb +10 -13
- data/app/models/linked_rails/menus/list.rb +16 -7
- data/app/models/linked_rails/ontology/base.rb +3 -1
- data/app/models/linked_rails/ontology/class.rb +3 -3
- data/app/models/linked_rails/ontology.rb +5 -5
- data/app/models/linked_rails/property_query.rb +2 -0
- data/app/models/linked_rails/sequence.rb +4 -13
- data/app/models/linked_rails/shacl/property_shape.rb +1 -1
- data/app/models/linked_rails/web_page.rb +0 -4
- data/app/models/linked_rails/web_site.rb +0 -4
- data/app/models/linked_rails/widget.rb +4 -11
- data/app/policies/linked_rails/actions/object_policy.rb +11 -0
- data/app/policies/linked_rails/collection_policy.rb +2 -2
- data/app/serializers/linked_rails/actions/item_serializer.rb +5 -5
- data/app/serializers/linked_rails/actions/object_serializer.rb +9 -0
- data/app/serializers/linked_rails/collection/filter_field_serializer.rb +3 -2
- data/app/serializers/linked_rails/collection/filter_option_serializer.rb +1 -1
- data/app/serializers/linked_rails/collection/filter_serializer.rb +1 -1
- data/app/serializers/linked_rails/collection/sorting_serializer.rb +1 -1
- data/app/serializers/linked_rails/collection/view_serializer.rb +3 -3
- data/app/serializers/linked_rails/collection_serializer.rb +8 -7
- data/app/serializers/linked_rails/condition_serializer.rb +3 -3
- data/app/serializers/linked_rails/entry_point_serializer.rb +3 -3
- data/app/serializers/linked_rails/enum_value_serializer.rb +1 -0
- data/app/serializers/linked_rails/form/field/association_input_serializer.rb +1 -0
- data/app/serializers/linked_rails/form/field/file_input_serializer.rb +11 -0
- data/app/serializers/linked_rails/form/field_serializer.rb +3 -1
- data/app/serializers/linked_rails/form/group_serializer.rb +1 -1
- data/app/serializers/linked_rails/form/page_serializer.rb +1 -1
- data/app/serializers/linked_rails/menus/item_serializer.rb +3 -3
- data/app/serializers/linked_rails/menus/list_serializer.rb +1 -1
- data/app/serializers/linked_rails/ontology_serializer.rb +2 -2
- data/app/serializers/linked_rails/property_query_serializer.rb +7 -0
- data/app/serializers/linked_rails/sequence_serializer.rb +2 -5
- data/app/serializers/linked_rails/shacl/node_shape_serializer.rb +1 -1
- data/app/serializers/linked_rails/shacl/property_shape_serializer.rb +1 -1
- data/app/serializers/linked_rails/shacl/shape_serializer.rb +5 -5
- data/app/serializers/linked_rails/web_page_serializer.rb +3 -3
- data/app/serializers/linked_rails/web_site_serializer.rb +1 -1
- data/app/serializers/linked_rails/widget_serializer.rb +3 -3
- data/lib/generators/linked_rails/install/install_generator.rb +5 -8
- data/lib/generators/linked_rails/install/templates/README +2 -0
- data/lib/generators/linked_rails/install/templates/app_menu_list.rb +36 -7
- data/lib/generators/linked_rails/install/templates/application_menu_list.rb +40 -1
- data/lib/generators/linked_rails/install/templates/initializer.rb +1 -2
- data/lib/generators/linked_rails/install/templates/locales.yml +14 -0
- data/lib/generators/linked_rails/install/templates/rdf_serializers_initializer.rb +1 -1
- data/lib/generators/linked_rails/install/templates/vocab.rb +1 -0
- data/lib/generators/linked_rails/install/templates/vocab.yml +2 -2
- data/lib/generators/linked_rails/model/model_generator.rb +0 -1
- data/lib/generators/linked_rails/model/templates/controller.rb.tt +5 -1
- data/lib/generators/linked_rails/model/templates/form.rb.tt +3 -0
- data/lib/generators/linked_rails/model/templates/menu_list.rb.tt +15 -0
- data/lib/generators/linked_rails/model/templates/policy.rb.tt +13 -0
- data/lib/generators/linked_rails/model/templates/serializer.rb.tt +5 -1
- data/lib/linked_rails/active_response/controller/collections.rb +1 -1
- data/lib/linked_rails/active_response/controller/crud_defaults.rb +4 -4
- data/lib/linked_rails/active_response/controller/params.rb +10 -10
- data/lib/linked_rails/active_response/controller.rb +8 -18
- data/lib/linked_rails/active_response/responders/rdf.rb +19 -10
- data/lib/linked_rails/callable_variable.rb +1 -1
- data/lib/linked_rails/collection_params_parser.rb +93 -0
- data/lib/linked_rails/controller/actionable.rb +121 -0
- data/lib/linked_rails/controller/authorization.rb +6 -0
- data/lib/linked_rails/controller/default_actions/create.rb +52 -0
- data/lib/linked_rails/controller/default_actions/destroy.rb +42 -0
- data/lib/linked_rails/controller/default_actions/update.rb +43 -0
- data/lib/linked_rails/controller/delta.rb +58 -0
- data/lib/linked_rails/controller/error_handling.rb +10 -10
- data/lib/linked_rails/controller/rendering.rb +48 -0
- data/lib/linked_rails/controller.rb +24 -4
- data/lib/linked_rails/enhancements/creatable/controller.rb +1 -1
- data/lib/linked_rails/enhancements/destroyable/controller.rb +1 -1
- data/lib/linked_rails/enhancements/updatable/controller.rb +1 -1
- data/lib/linked_rails/enhancements.rb +0 -16
- data/lib/linked_rails/helpers/delta_helper.rb +26 -57
- data/lib/linked_rails/helpers/ontola_actions_helper.rb +2 -2
- data/lib/linked_rails/helpers/resource_helper.rb +4 -2
- data/lib/linked_rails/iri_mapper.rb +17 -39
- data/lib/linked_rails/middleware/error_handling.rb +51 -0
- data/lib/linked_rails/middleware/linked_data_params.rb +30 -151
- data/lib/linked_rails/model/actionable.rb +68 -0
- data/lib/linked_rails/model/collections.rb +201 -39
- data/lib/linked_rails/model/dirty.rb +6 -18
- data/lib/linked_rails/model/enhancements.rb +1 -6
- data/lib/linked_rails/model/filtering.rb +4 -6
- data/lib/linked_rails/model/indexable.rb +6 -16
- data/lib/linked_rails/model/iri.rb +28 -19
- data/lib/linked_rails/model/iri_mapping.rb +37 -8
- data/lib/linked_rails/model/menuable.rb +28 -0
- data/lib/linked_rails/model/serialization.rb +2 -15
- data/lib/linked_rails/model/singularable.rb +57 -0
- data/lib/linked_rails/model/sorting.rb +0 -5
- data/lib/linked_rails/model/tables.rb +26 -0
- data/lib/linked_rails/model.rb +17 -7
- data/lib/linked_rails/params_parser.rb +131 -54
- data/lib/linked_rails/policy/attribute_conditions.rb +2 -2
- data/lib/linked_rails/policy.rb +40 -46
- data/lib/linked_rails/railtie.rb +11 -0
- data/lib/linked_rails/rdf_error.rb +2 -2
- data/lib/linked_rails/renderers.rb +1 -0
- data/lib/linked_rails/routes.rb +38 -22
- data/lib/linked_rails/serializer/actionable.rb +27 -0
- data/lib/linked_rails/serializer/menuable.rb +31 -0
- data/lib/linked_rails/serializer/singularable.rb +26 -0
- data/lib/linked_rails/serializer.rb +28 -11
- data/lib/linked_rails/test_methods.rb +114 -0
- data/lib/linked_rails/translate.rb +31 -9
- data/lib/linked_rails/types/iri_type.rb +37 -0
- data/lib/linked_rails/uri_template.rb +30 -0
- data/lib/linked_rails/version.rb +1 -1
- data/lib/linked_rails/vocab.rb +9 -0
- data/lib/linked_rails.rb +30 -13
- data/lib/rails/welcome_controller.rb +3 -3
- data/lib/rdf/list.rb +9 -0
- data/lib/rdf/query_fix.rb +15 -0
- metadata +71 -33
- data/app/models/linked_rails/actions/default_actions/create.rb +0 -60
- data/app/models/linked_rails/actions/default_actions/destroy.rb +0 -45
- data/app/models/linked_rails/actions/default_actions/update.rb +0 -50
- data/app/models/linked_rails/actions/default_actions.rb +0 -17
- data/lib/generators/linked_rails/install/templates/application_action_list.rb +0 -3
- data/lib/generators/linked_rails/model/templates/action_list.rb.tt +0 -6
- data/lib/linked_rails/enhancements/actionable/model.rb +0 -71
- data/lib/linked_rails/enhancements/actionable/serializer.rb +0 -25
- data/lib/linked_rails/enhancements/creatable/action.rb +0 -15
- data/lib/linked_rails/enhancements/destroyable/action.rb +0 -15
- data/lib/linked_rails/enhancements/destroyable/routing.rb +0 -19
- data/lib/linked_rails/enhancements/menuable/model.rb +0 -36
- data/lib/linked_rails/enhancements/menuable/serializer.rb +0 -33
- data/lib/linked_rails/enhancements/route_concerns.rb +0 -56
- data/lib/linked_rails/enhancements/singularable/controller.rb +0 -43
- data/lib/linked_rails/enhancements/singularable/model.rb +0 -47
- data/lib/linked_rails/enhancements/singularable/serializer.rb +0 -28
- data/lib/linked_rails/enhancements/tableable/model.rb +0 -28
- data/lib/linked_rails/enhancements/updatable/action.rb +0 -15
- data/lib/linked_rails/enhancements/updatable/routing.rb +0 -20
@@ -6,12 +6,6 @@ module LinkedRails
|
|
6
6
|
extend ActiveSupport::Concern
|
7
7
|
include ActiveSupport::Rescuable
|
8
8
|
|
9
|
-
included do
|
10
|
-
rescue_from StandardError, with: :handle_and_report_error
|
11
|
-
rescue_from ActiveRecord::RecordNotFound, with: :handle_error
|
12
|
-
rescue_from Pundit::NotAuthorizedError, with: :handle_error
|
13
|
-
end
|
14
|
-
|
15
9
|
private
|
16
10
|
|
17
11
|
def add_error_snackbar(error)
|
@@ -22,7 +16,14 @@ module LinkedRails
|
|
22
16
|
!%w[GET HEAD].include?(request.method)
|
23
17
|
end
|
24
18
|
|
19
|
+
def handle_and_report_error(error)
|
20
|
+
report_error(error) if error_status(error) == 500
|
21
|
+
handle_error(error)
|
22
|
+
end
|
23
|
+
|
25
24
|
def handle_error(error)
|
25
|
+
raise(error) if response_body
|
26
|
+
|
26
27
|
respond_to do |format|
|
27
28
|
(LinkedRails::Renderers.rdf_content_types + [:json]).each do |type|
|
28
29
|
format.send(type) { error_response_serializer(error, type) }
|
@@ -30,11 +31,10 @@ module LinkedRails
|
|
30
31
|
end
|
31
32
|
end
|
32
33
|
|
33
|
-
def
|
34
|
-
raise if Rails.env.development? || Rails.env.test?
|
35
|
-
raise if response_body
|
34
|
+
def report_error(error)
|
35
|
+
raise(error) if Rails.env.development? || Rails.env.test?
|
36
36
|
|
37
|
-
|
37
|
+
Rails.logger.error(error)
|
38
38
|
end
|
39
39
|
|
40
40
|
def error_mode(exception)
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module LinkedRails
|
4
|
+
module Controller
|
5
|
+
module Rendering
|
6
|
+
def _render_with_renderer_json(record, options)
|
7
|
+
self.content_type = Mime[:json]
|
8
|
+
|
9
|
+
return record if record.is_a?(String)
|
10
|
+
return record.to_json if record.is_a?(Hash)
|
11
|
+
|
12
|
+
serializer_opts = RDF::Serializers::Renderers.transform_opts(
|
13
|
+
options,
|
14
|
+
serializer_params
|
15
|
+
)
|
16
|
+
|
17
|
+
serializer = RDF::Serializers.serializer_for(record)&.new(record, serializer_opts)
|
18
|
+
return record.to_json unless serializer
|
19
|
+
|
20
|
+
Oj.dump(serializer.serializable_hash, mode: :compat)
|
21
|
+
end
|
22
|
+
|
23
|
+
def resource_body(resource)
|
24
|
+
resource_serializer(resource).send(:render_emp_json)
|
25
|
+
end
|
26
|
+
|
27
|
+
def resource_hash(resource)
|
28
|
+
resource_serializer(resource).send(:emp_json_hash)
|
29
|
+
end
|
30
|
+
|
31
|
+
def resource_serializer(resource)
|
32
|
+
return if resource.nil?
|
33
|
+
|
34
|
+
serializer_options = RDF::Serializers::Renderers.transform_opts(
|
35
|
+
{include: resource&.try(:preview_includes)},
|
36
|
+
serializer_params
|
37
|
+
)
|
38
|
+
RDF::Serializers
|
39
|
+
.serializer_for(resource)
|
40
|
+
&.new(resource, serializer_options)
|
41
|
+
end
|
42
|
+
|
43
|
+
def serializer_params
|
44
|
+
{}
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -1,23 +1,30 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative 'active_response/controller'
|
4
|
+
require_relative 'controller/actionable'
|
4
5
|
require_relative 'controller/authorization'
|
5
6
|
require_relative 'controller/error_handling'
|
7
|
+
require_relative 'controller/delta'
|
8
|
+
require_relative 'controller/rendering'
|
6
9
|
|
7
10
|
module LinkedRails
|
8
11
|
module Controller
|
9
12
|
extend ActiveSupport::Concern
|
13
|
+
include ::ActiveResponse::Controller
|
10
14
|
|
11
15
|
included do
|
12
16
|
extend Enhanceable
|
13
17
|
|
14
18
|
enhanceable :controller_class, :Controller
|
15
19
|
|
20
|
+
include ActionController::MimeResponds
|
16
21
|
include LinkedRails::ActiveResponse::Controller
|
22
|
+
include LinkedRails::Controller::Actionable
|
17
23
|
include LinkedRails::Controller::Authorization
|
18
24
|
include LinkedRails::Controller::ErrorHandling
|
25
|
+
include LinkedRails::Controller::Rendering
|
26
|
+
include LinkedRails::Controller::Delta
|
19
27
|
include LinkedRails::Helpers::OntolaActionsHelper
|
20
|
-
include LinkedRails::Helpers::DeltaHelper
|
21
28
|
include LinkedRails::Helpers::ResourceHelper
|
22
29
|
|
23
30
|
before_action :set_manifest_header
|
@@ -34,9 +41,22 @@ module LinkedRails
|
|
34
41
|
end
|
35
42
|
|
36
43
|
module ClassMethods
|
37
|
-
def controller_class
|
38
|
-
|
39
|
-
|
44
|
+
def controller_class(klass = nil)
|
45
|
+
if klass.present?
|
46
|
+
@controller_class = klass
|
47
|
+
else
|
48
|
+
@controller_class ||= compute_controller_class || superclass.try(:controller_class)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def compute_controller_class
|
55
|
+
klass =
|
56
|
+
name.sub(/Controller$/, '').classify.safe_constantize ||
|
57
|
+
try(:controller_name)&.classify&.safe_constantize
|
58
|
+
|
59
|
+
klass if klass&.include?(LinkedRails::Model)
|
40
60
|
end
|
41
61
|
end
|
42
62
|
end
|
@@ -1,22 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative 'enhancements/route_concerns'
|
4
|
-
|
5
|
-
require_relative 'enhancements/actionable/model'
|
6
|
-
require_relative 'enhancements/actionable/serializer'
|
7
|
-
require_relative 'enhancements/creatable/action'
|
8
3
|
require_relative 'enhancements/creatable/controller'
|
9
|
-
require_relative 'enhancements/destroyable/action'
|
10
4
|
require_relative 'enhancements/destroyable/controller'
|
11
|
-
require_relative 'enhancements/destroyable/routing'
|
12
|
-
require_relative 'enhancements/indexable/model'
|
13
|
-
require_relative 'enhancements/menuable/model'
|
14
|
-
require_relative 'enhancements/menuable/serializer'
|
15
|
-
require_relative 'enhancements/singularable/controller'
|
16
|
-
require_relative 'enhancements/singularable/model'
|
17
|
-
require_relative 'enhancements/singularable/serializer'
|
18
|
-
require_relative 'enhancements/tableable/model'
|
19
|
-
require_relative 'enhancements/updatable/action'
|
20
5
|
require_relative 'enhancements/updatable/controller'
|
21
|
-
require_relative 'enhancements/updatable/routing'
|
22
6
|
require_relative 'enhancements/updatable/serializer'
|
@@ -3,61 +3,8 @@
|
|
3
3
|
module LinkedRails
|
4
4
|
module Helpers
|
5
5
|
module DeltaHelper
|
6
|
-
def changed_relation_triples(predicate, destructed, resources)
|
7
|
-
related_resource_invalidations = resources.map(&method(:invalidate_resource_delta))
|
8
|
-
|
9
|
-
return related_resource_invalidations unless predicate
|
10
|
-
|
11
|
-
if destructed
|
12
|
-
return related_resource_invalidations + [
|
13
|
-
[current_resource.iri, predicate, Vocab.sp[:Variable], delta_iri(:remove)]
|
14
|
-
]
|
15
|
-
end
|
16
|
-
|
17
|
-
related_resource_invalidations + resources.map do |resource|
|
18
|
-
[current_resource.iri, predicate, resource.iri, delta_iri(:replace)]
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def changed_relations_triples # rubocop:disable Metrics/AbcSize
|
23
|
-
current_resource.previously_changed_relations.flat_map do |key, value|
|
24
|
-
if key.to_s.ends_with?('_collection')
|
25
|
-
[invalidate_collection_delta(current_resource.send(key))]
|
26
|
-
else
|
27
|
-
destructed = current_resource.send(:association_has_destructed?, key)
|
28
|
-
many = value.relationship_type == :has_many
|
29
|
-
relation = current_resource.send(key)
|
30
|
-
changed_relation_triples(value.predicate, destructed, many ? relation : [relation])
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def change_triple(predicate, value)
|
36
|
-
if value.nil?
|
37
|
-
RDF::Statement.new(current_resource.iri, predicate, Vocab.sp[:Variable], graph_name: delta_iri(:remove))
|
38
|
-
else
|
39
|
-
RDF::Statement.new(current_resource.iri, predicate, value, graph_name: delta_iri(:replace))
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def changes_triples # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
44
|
-
serializer = RDF::Serializers.serializer_for(current_resource).new(current_resource)
|
45
|
-
|
46
|
-
current_resource.previous_changes_by_predicate.map do |predicate, (_old_value, _new_value)|
|
47
|
-
serializer_attributes = current_resource.class.predicate_mapping[predicate]
|
48
|
-
next if serializer_attributes.is_a?(FastJsonapi::Relationship)
|
49
|
-
|
50
|
-
attr_name = serializer_attributes.key
|
51
|
-
serialized_value =
|
52
|
-
serializer.class.attributes_to_serialize[attr_name]&.serialize(current_resource, serializer_params, {})
|
53
|
-
(serialized_value.is_a?(Array) ? serialized_value : [serialized_value]).map do |value|
|
54
|
-
change_triple(predicate, value)
|
55
|
-
end
|
56
|
-
end.compact.flatten
|
57
|
-
end
|
58
|
-
|
59
6
|
def delta_iri(delta)
|
60
|
-
%i[remove replace invalidate].include?(delta) ? Vocab.ontola[delta] : Vocab.
|
7
|
+
%i[remove replace invalidate].include?(delta) ? Vocab.ontola[delta] : Vocab.ld[delta]
|
61
8
|
end
|
62
9
|
|
63
10
|
def invalidate_collection_delta(collection)
|
@@ -65,7 +12,9 @@ module LinkedRails
|
|
65
12
|
end
|
66
13
|
|
67
14
|
def invalidate_parent_collections_delta(resource)
|
68
|
-
|
15
|
+
context = user_context if respond_to?(:user_context, true)
|
16
|
+
|
17
|
+
resource&.parent_collections(context)&.map(&method(:invalidate_collection_delta)) || []
|
69
18
|
end
|
70
19
|
|
71
20
|
def invalidate_resource_delta(resource)
|
@@ -75,11 +24,31 @@ module LinkedRails
|
|
75
24
|
end
|
76
25
|
|
77
26
|
def resource_added_delta(resource)
|
78
|
-
invalidate_parent_collections_delta(resource)
|
27
|
+
invalidate_parent_collections_delta(resource) + singular_added_delta(resource)
|
79
28
|
end
|
80
29
|
|
81
30
|
def resource_removed_delta(resource)
|
82
|
-
invalidate_parent_collections_delta(resource)
|
31
|
+
invalidate_parent_collections_delta(resource) + singular_removed_delta(resource)
|
32
|
+
end
|
33
|
+
|
34
|
+
def same_as_statement(from, to)
|
35
|
+
[
|
36
|
+
from,
|
37
|
+
Vocab.owl.sameAs,
|
38
|
+
to
|
39
|
+
]
|
40
|
+
end
|
41
|
+
|
42
|
+
def singular_added_delta(resource)
|
43
|
+
return [] unless resource.try(:singular_resource?)
|
44
|
+
|
45
|
+
[same_as_statement(resource.singular_iri, resource.iri)]
|
46
|
+
end
|
47
|
+
|
48
|
+
def singular_removed_delta(resource)
|
49
|
+
return [] unless resource.try(:singular_resource?)
|
50
|
+
|
51
|
+
[invalidate_resource_delta(resource.singular_iri)]
|
83
52
|
end
|
84
53
|
end
|
85
54
|
end
|
@@ -12,8 +12,8 @@ module LinkedRails
|
|
12
12
|
Vocab.libro["actions/copyToClipboard?#{{value: value}.to_param}"]
|
13
13
|
end
|
14
14
|
|
15
|
-
def ontola_dialog_action(resource, opener: nil)
|
16
|
-
Vocab.libro["actions/dialog/alert?#{{resource: resource, opener: opener}.compact.to_param}"]
|
15
|
+
def ontola_dialog_action(resource, opener: nil, size: nil)
|
16
|
+
Vocab.libro["actions/dialog/alert?#{{resource: resource, opener: opener, size: size}.compact.to_param}"]
|
17
17
|
end
|
18
18
|
|
19
19
|
def ontola_dialog_close_action
|
@@ -41,7 +41,7 @@ module LinkedRails
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def requested_resource_parent
|
44
|
-
requested_resource
|
44
|
+
requested_resource.try(:parent)
|
45
45
|
end
|
46
46
|
|
47
47
|
private
|
@@ -51,6 +51,8 @@ module LinkedRails
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def new_resource_from_parent
|
54
|
+
return requested_resource.child_resource if requested_resource.is_a?(Collection)
|
55
|
+
|
54
56
|
parent_resource.build_child(
|
55
57
|
controller_class,
|
56
58
|
user_context: user_context
|
@@ -59,7 +61,7 @@ module LinkedRails
|
|
59
61
|
|
60
62
|
def resolve_current_resource
|
61
63
|
case action_name
|
62
|
-
when 'create'
|
64
|
+
when 'create'
|
63
65
|
new_resource
|
64
66
|
else
|
65
67
|
requested_resource
|
@@ -12,6 +12,7 @@ module LinkedRails
|
|
12
12
|
# => {
|
13
13
|
# action: 'show',
|
14
14
|
# class: Resource,
|
15
|
+
# iri: 'https://example.com/resource/1?foo=bar',
|
15
16
|
# params: {
|
16
17
|
# id: '1',
|
17
18
|
# foo: 'bar'
|
@@ -22,6 +23,7 @@ module LinkedRails
|
|
22
23
|
# => {
|
23
24
|
# action: 'index',
|
24
25
|
# class: Resource,
|
26
|
+
# iri: 'https://example.com/resources?foo=bar',
|
25
27
|
# params: {
|
26
28
|
# foo: 'bar'
|
27
29
|
# }
|
@@ -35,38 +37,21 @@ module LinkedRails
|
|
35
37
|
query = Rack::Utils.parse_nested_query(URI(iri.to_s).query)
|
36
38
|
params = Rails.application.routes.recognize_path(iri.to_s, method: method)
|
37
39
|
|
38
|
-
route_params_to_opts(params.merge(query))
|
40
|
+
route_params_to_opts(params.merge(query), iri.to_s)
|
39
41
|
rescue ActionController::RoutingError
|
40
42
|
EMPTY_IRI_OPTS.dup
|
41
43
|
end
|
42
44
|
|
43
|
-
def index_resource_from_iri(iri, user_context)
|
44
|
-
ensure_absolute_iri!(iri)
|
45
|
-
|
46
|
-
opts = opts_from_iri(iri)
|
47
|
-
index_resource_from_opts(opts, user_context)
|
48
|
-
end
|
49
|
-
|
50
|
-
def index_resource_from_iri!(iri, user_context)
|
51
|
-
index_resource_from_iri(iri, user_context) || raise(ActiveRecord::RecordNotFound)
|
52
|
-
end
|
53
|
-
|
54
|
-
def index_resource_from_opts(opts, user_context)
|
55
|
-
opts[:class]&.requested_index_resource(opts[:params], user_context) if opts[:action] == 'index'
|
56
|
-
end
|
57
|
-
|
58
45
|
def parent_from_params(params, user_context)
|
59
46
|
return unless params.key?(:parent_iri)
|
60
47
|
|
61
|
-
parent_iri = "/#{params[:parent_iri]}"
|
62
|
-
opts = LinkedRails.iri_mapper.opts_from_iri(parent_iri)
|
63
|
-
opts[:params] = params.except(:parent_iri, :singular_route).merge(opts[:params])
|
48
|
+
parent_iri = LinkedRails.iri(path: "/#{params[:parent_iri]}")
|
64
49
|
|
65
|
-
LinkedRails.iri_mapper.
|
50
|
+
LinkedRails.iri_mapper.resource_from_iri(parent_iri, user_context)
|
66
51
|
end
|
67
52
|
|
68
53
|
def resource_from_iri(iri, user_context)
|
69
|
-
|
54
|
+
return nil unless absolute_iri?(iri)
|
70
55
|
|
71
56
|
opts = opts_from_iri(iri)
|
72
57
|
resource_from_opts(opts, user_context)
|
@@ -80,7 +65,7 @@ module LinkedRails
|
|
80
65
|
opts[:class]&.requested_resource(opts, user_context)
|
81
66
|
end
|
82
67
|
|
83
|
-
def route_params_to_opts(params)
|
68
|
+
def route_params_to_opts(params, iri)
|
84
69
|
controller_class = class_for_controller(params[:controller])
|
85
70
|
|
86
71
|
return EMPTY_IRI_OPTS.dup if controller_class.blank?
|
@@ -88,27 +73,17 @@ module LinkedRails
|
|
88
73
|
{
|
89
74
|
action: params[:action],
|
90
75
|
class: controller_class,
|
91
|
-
|
76
|
+
iri: iri,
|
77
|
+
params: sanitized_route_params(controller_class, params)
|
92
78
|
}.with_indifferent_access
|
93
79
|
end
|
94
80
|
|
95
|
-
|
96
|
-
ensure_absolute_iri!(iri)
|
97
|
-
|
98
|
-
opts = opts_from_iri(iri)
|
99
|
-
single_resource_from_opts(opts, user_context)
|
100
|
-
end
|
101
|
-
|
102
|
-
def single_resource_from_iri!(iri, user_context)
|
103
|
-
single_resource_from_iri(iri, user_context) || raise(ActiveRecord::RecordNotFound)
|
104
|
-
end
|
81
|
+
private
|
105
82
|
|
106
|
-
def
|
107
|
-
|
83
|
+
def absolute_iri?(iri)
|
84
|
+
iri.present? && !URI(iri).relative?
|
108
85
|
end
|
109
86
|
|
110
|
-
private
|
111
|
-
|
112
87
|
def class_for_controller(controller)
|
113
88
|
return if controller.blank?
|
114
89
|
|
@@ -117,8 +92,11 @@ module LinkedRails
|
|
117
92
|
.try(:controller_class)
|
118
93
|
end
|
119
94
|
|
120
|
-
def
|
121
|
-
|
95
|
+
def sanitized_route_params(controller_class, params)
|
96
|
+
new_params = params.except(:action, :controller)
|
97
|
+
nested_key = :"#{controller_class.name.tableize.singularize}_id"
|
98
|
+
new_params[:id] ||= new_params.delete(nested_key) if new_params.key?(nested_key)
|
99
|
+
new_params
|
122
100
|
end
|
123
101
|
end
|
124
102
|
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module LinkedRails
|
4
|
+
module Middleware
|
5
|
+
class ErrorHandling
|
6
|
+
def initialize(app)
|
7
|
+
@app = app
|
8
|
+
end
|
9
|
+
|
10
|
+
def call(env)
|
11
|
+
@app.call(env)
|
12
|
+
rescue StandardError => e
|
13
|
+
handle_error(env, e)
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def controller_class(req)
|
19
|
+
controller = req.controller_class
|
20
|
+
|
21
|
+
return ApplicationController if controller == ActionDispatch::Request::PASS_NOT_FOUND
|
22
|
+
|
23
|
+
controller
|
24
|
+
rescue StandardError
|
25
|
+
ApplicationController
|
26
|
+
end
|
27
|
+
|
28
|
+
def controller_instance(env)
|
29
|
+
return env['action_controller.instance'] if env['action_controller.instance']
|
30
|
+
|
31
|
+
req = ActionDispatch::Request.new(env)
|
32
|
+
res = ApplicationController.make_response!(req)
|
33
|
+
controller = controller_class(req).new
|
34
|
+
controller.set_request!(req)
|
35
|
+
controller.set_response!(res)
|
36
|
+
|
37
|
+
controller
|
38
|
+
end
|
39
|
+
|
40
|
+
def handle_error(env, error)
|
41
|
+
controller = controller_instance(env)
|
42
|
+
|
43
|
+
controller.send(:handle_and_report_error, error)
|
44
|
+
error_response = controller.response
|
45
|
+
body = ActionDispatch::Response::RackBody.new(error_response)
|
46
|
+
|
47
|
+
[error_response.status, error_response.headers, body]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|