linked_rails 0.0.4.pre.g8d7195543 → 0.0.4.pre.g9b7bc9073

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/linked_rails/bulk_controller.rb +2 -37
  3. data/app/models/linked_rails/actions/item.rb +1 -1
  4. data/app/models/linked_rails/collection/view.rb +3 -4
  5. data/app/models/linked_rails/form/field_factory.rb +7 -1
  6. data/app/models/linked_rails/form.rb +0 -1
  7. data/app/models/linked_rails/manifest.rb +20 -94
  8. data/app/models/linked_rails/menus/item.rb +1 -1
  9. data/app/models/linked_rails/menus/list.rb +1 -1
  10. data/app/models/linked_rails/ontology.rb +0 -1
  11. data/app/serializers/linked_rails/collection/view_serializer.rb +0 -1
  12. data/lib/generators/linked_rails/install/templates/locales.yml +0 -2
  13. data/lib/linked_rails/controller/delta.rb +21 -1
  14. data/lib/linked_rails/controller/error_handling.rb +0 -5
  15. data/lib/linked_rails/helpers/resource_helper.rb +1 -11
  16. data/lib/linked_rails/iri_mapper.rb +1 -1
  17. data/lib/linked_rails/middleware/linked_data_params.rb +1 -1
  18. data/lib/linked_rails/model/dirty.rb +11 -0
  19. data/lib/linked_rails/model/iri.rb +0 -1
  20. data/lib/linked_rails/model.rb +0 -1
  21. data/lib/linked_rails/params_parser.rb +7 -6
  22. data/lib/linked_rails/policy.rb +0 -4
  23. data/lib/linked_rails.rb +2 -11
  24. metadata +4 -26
  25. data/app/policies/linked_rails/form_policy.rb +0 -13
  26. data/app/policies/linked_rails/ontology_policy.rb +0 -13
  27. data/app/workers/linked_rails/invalidation_stream_worker.rb +0 -16
  28. data/lib/linked_rails/errors/forbidden.rb +0 -37
  29. data/lib/linked_rails/errors.rb +0 -3
  30. data/lib/linked_rails/model/cacheable.rb +0 -45
  31. data/lib/linked_rails/storage.rb +0 -32
  32. data/lib/linked_rails/url.rb +0 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 52592ddbab37c67682af36b68c3937b75e30ef3d2524572061c8b1e7b8b33f43
4
- data.tar.gz: 93f154436fc269dcff4ad704f3813f9ec2c708bb3544a88dd902416faf6b2ac8
3
+ metadata.gz: d86a69fbe49260dc07acefa64442a1a3a886a9d1b45cab169fc4e514ffe27b75
4
+ data.tar.gz: 2bd8aa4736a567bbb045889c96b3c5f8c02bcfbab7bbd90b8374c86d614599d0
5
5
  SHA512:
6
- metadata.gz: 7c34836c7195df7ad3de8f38f97dbcdc82eea1cd13a3928693dba0622e0d81b9ffc7b511ac10244e8199ac62874fe1f3c4a9eca3babd7403e986cc3b6c200487
7
- data.tar.gz: 6ef666de7b7212f973f369b1bafbbe60ec2fe79602c7f6e9df8264f00ae2b391d097667e7314e30c9c2e924d716282cdcec0a9323fb9c08bbf37d0779b06de99
6
+ metadata.gz: e907be3993d7b5a334649d29f5b8703a0a3bccb5ca0c8a747b96c93e8a1e27fe30c5ae110f3cab02c80ae75e69fc5e59a33abeee0a22e6e87e030fa7d03a6410
7
+ data.tar.gz: ec7768a12f8801cccf9e2ff3b95ce295bd5257cc4d888ab010a436ec74469ec53b9f910043ef094b10239d4c2672310b4e45b08aff57a44f1a4f30af6fb5004a
@@ -21,11 +21,8 @@ module LinkedRails
21
21
  return response_for_wrong_host(opts) if wrong_host?(opts[:iri])
22
22
 
23
23
  include = opts[:include].to_s == 'true'
24
- resource = LinkedRails.iri_mapper.resource_from_iri(request_path_to_url(opts[:iri]), user_context)
25
24
 
26
- return response_from_request(include, RDF::URI(opts[:iri])) if resource.blank?
27
-
28
- response_from_resource(include, opts[:iri], resource)
25
+ response_from_request(include, RDF::URI(opts[:iri]))
29
26
  rescue StandardError => e
30
27
  handle_resource_error(opts, e)
31
28
  end
@@ -87,19 +84,10 @@ module LinkedRails
87
84
  false
88
85
  end
89
86
 
90
- def resource_cache_control(cacheable, status, resource_policy)
91
- return :private unless status == 200 && cacheable
92
- return 'no-cache' unless resource_policy.try(:public_resource?)
93
-
94
- :public
95
- end
96
-
97
87
  def resource_params(param)
98
88
  params = param.permit(:include, :iri)
99
89
  params[:iri] = URI(params[:iri])
100
90
  params
101
- rescue URI::InvalidURIError
102
- params.except(:iri)
103
91
  end
104
92
 
105
93
  def resource_response_body(iri, rack_body, status)
@@ -143,12 +131,6 @@ module LinkedRails
143
131
  }.merge(opts)
144
132
  end
145
133
 
146
- def resource_status(resource_policy)
147
- raise(LinkedRails::Errors::Forbidden.new(query: :show?)) unless resource_policy.show?
148
-
149
- 200
150
- end
151
-
152
134
  def response_for_wrong_host(opts)
153
135
  iri = opts[:iri]
154
136
  term = term_from_vocab(iri)
@@ -157,23 +139,6 @@ module LinkedRails
157
139
  ontology_term_response(iri, term, opts[:include])
158
140
  end
159
141
 
160
- def response_from_resource(include, iri, resource)
161
- resource_policy = policy(resource)
162
- status = resource_status(resource_policy)
163
-
164
- resource_response(
165
- iri,
166
- body: response_from_resource_body(include, iri, resource, status),
167
- cache: resource_cache_control(resource.try(:cacheable?), status, resource_policy),
168
- language: I18n.locale,
169
- status: status
170
- )
171
- end
172
-
173
- def response_from_resource_body(include, _iri, resource, status)
174
- include && status == 200 ? resource_body(resource) : nil
175
- end
176
-
177
142
  def term_from_vocab(iri)
178
143
  vocab = Vocab.for(iri)
179
144
  tag = iri.to_s.split(vocab.to_s).last
@@ -251,7 +216,7 @@ module LinkedRails
251
216
 
252
217
  def sanitized_relative_path(iri) # rubocop:disable Metrics/AbcSize
253
218
  iri.path = "#{iri.path}/" unless iri.path&.ends_with?('/')
254
- uri = URI(LinkedRails.iri.path.chomp('/').present? ? iri.to_s.split("#{LinkedRails.iri.path}/").last : iri)
219
+ uri = URI(LinkedRails.iri.path.present? ? iri.to_s.split("#{LinkedRails.iri.path}/").last : iri)
255
220
 
256
221
  [uri.path, uri.query].compact.join('?')
257
222
  end
@@ -187,7 +187,7 @@ module LinkedRails
187
187
 
188
188
  def target_url_fallback # rubocop:disable Metrics/AbcSize
189
189
  base = (resource.try(:singular_resource?) ? resource.singular_iri : resource.iri).dup
190
- base.path = "#{base.path.chomp('/')}/#{target_path}" if target_path.present?
190
+ base.path = "#{base.path}/#{target_path}" if target_path.present?
191
191
  base.query = Rack::Utils.parse_nested_query(base.query).merge(target_query).to_param if target_query.present?
192
192
  base
193
193
  end
@@ -8,9 +8,8 @@ module LinkedRails
8
8
  include LinkedRails::Model
9
9
 
10
10
  attr_accessor :collection, :filter
11
- delegate :apply_scope, :association_base, :association_class, :child_resource, :default_page_size, :display,
12
- :include_members,:parent, :policy, :total_page_count, :unfiltered_collection, :user_context,
13
- to: :collection
11
+ delegate :apply_scope, :association_base, :association_class, :default_page_size, :display, :include_members,
12
+ :parent, :policy, :total_page_count, :unfiltered_collection, :user_context, to: :collection
14
13
  delegate :count, to: :members
15
14
 
16
15
  alias id iri
@@ -43,7 +42,7 @@ module LinkedRails
43
42
  end
44
43
 
45
44
  def preview_includes
46
- include_members ? %i[members] : []
45
+ include_members ? {member_sequence: :members} : %i[member_sequence]
47
46
  end
48
47
 
49
48
  def title
@@ -52,7 +52,13 @@ module LinkedRails
52
52
  private
53
53
 
54
54
  def attr_column(name)
55
- model_class.column_for_attribute(name)
55
+ column_model =
56
+ if model_class.is_delegated_attribute?(name)
57
+ model_class.class_for_delegated_attribute(name)
58
+ else
59
+ model_class
60
+ end
61
+ column_model.column_for_attribute(name)
56
62
  end
57
63
 
58
64
  def attr_to_datatype # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
@@ -5,7 +5,6 @@ require 'pundit'
5
5
  module LinkedRails
6
6
  class Form # rubocop:disable Metrics/ClassLength
7
7
  include LinkedRails::Model
8
- include LinkedRails::Model::Cacheable
9
8
 
10
9
  class_attribute :abstract_form, :pages, :model_class
11
10
 
@@ -5,27 +5,6 @@ module LinkedRails
5
5
  include ActiveModel::Model
6
6
  include LinkedRails::Model
7
7
 
8
- def save
9
- Storage.hset(
10
- :persistent,
11
- :manifest,
12
- URL.as_href(LinkedRails.iri) => web_manifest.to_json
13
- )
14
- end
15
-
16
- def web_manifest
17
- web_manifest_base.merge(
18
- ontola: web_manifest_ontola_section,
19
- serviceworker: web_manifest_sw_section
20
- )
21
- end
22
-
23
- private
24
-
25
- def allowed_external_sources
26
- []
27
- end
28
-
29
8
  def app_name
30
9
  Rails.application.railtie_name.chomp('_application').humanize
31
10
  end
@@ -38,27 +17,8 @@ module LinkedRails
38
17
  '#eef0f2'
39
18
  end
40
19
 
41
- def blob_preview_iri
42
- return unless ActiveStorage::Blob.service.present?
43
-
44
- "#{LinkedRails.iri(path: 'rails/active_storage/blobs/redirect')}/{signed_id}/preview"
45
- end
46
-
47
- def blob_upload_iri
48
- return unless ActiveStorage::Blob.service.present?
49
-
50
- LinkedRails.iri(path: 'rails/active_storage/direct_uploads')
51
- end
52
-
53
20
  def css_class; end
54
21
 
55
- def csp_entries
56
- {
57
- connectSrc: [ActiveStorage::Blob.service.try(:bucket)&.url].compact,
58
- scriptSrc: [ActiveStorage::Blob.service.try(:bucket)&.url].compact
59
- }
60
- end
61
-
62
22
  def header_background
63
23
  :primary
64
24
  end
@@ -67,16 +27,17 @@ module LinkedRails
67
27
  :white
68
28
  end
69
29
 
70
- def icons
71
- []
72
- end
73
-
74
- def lang
75
- :nl
30
+ def preload_iris
31
+ [
32
+ scope,
33
+ LinkedRails.iri(path: 'ns/core').to_s,
34
+ LinkedRails.iri(path: 'c_a').to_s,
35
+ LinkedRails.iri(path: 'menus').to_s
36
+ ]
76
37
  end
77
38
 
78
39
  def scope
79
- LinkedRails.iri.to_s
40
+ @scope ||= LinkedRails.iri.to_s
80
41
  end
81
42
 
82
43
  def site_theme_color
@@ -91,46 +52,43 @@ module LinkedRails
91
52
  app_name
92
53
  end
93
54
 
94
- def start_url
95
- scope == '/' ? scope : "#{scope}/"
96
- end
97
-
98
55
  def theme; end
99
56
 
100
57
  def theme_options
101
58
  {}
102
59
  end
103
60
 
61
+ def web_manifest
62
+ web_manifest_base.merge(
63
+ ontola: web_manifest_ontola_section,
64
+ serviceworker: web_manifest_sw_section
65
+ )
66
+ end
67
+
104
68
  def web_manifest_base # rubocop:disable Metrics/MethodLength
105
69
  {
106
70
  background_color: background_color,
107
71
  dir: :rtl,
108
72
  display: :standalone,
109
- icons: icons,
110
- lang: lang,
73
+ lang: :nl,
111
74
  name: app_name,
112
75
  scope: scope,
113
76
  short_name: app_name,
114
- start_url: start_url,
77
+ start_url: scope,
115
78
  theme_color: site_theme_color
116
79
  }
117
80
  end
118
81
 
119
82
  def web_manifest_ontola_section # rubocop:disable Metrics/MethodLength
120
83
  {
121
- allowed_external_sources: allowed_external_sources,
122
- blob_preview_iri: blob_preview_iri,
123
- blob_upload_iri: blob_upload_iri,
124
- csp: csp_entries,
84
+ css_class: css_class,
125
85
  header_background: header_background,
126
86
  header_text: header_text,
127
- preconnect: preconnect,
87
+ preload: preload_iris,
128
88
  primary_color: site_theme_color,
129
89
  secondary_color: site_secondary_color,
130
- styled_headers: styled_headers,
131
90
  theme: theme,
132
91
  theme_options: theme_options.to_query,
133
- tracking: tracking,
134
92
  website_iri: LinkedRails.iri.to_s,
135
93
  websocket_path: websocket_path
136
94
  }
@@ -138,7 +96,7 @@ module LinkedRails
138
96
 
139
97
  def web_manifest_sw_section
140
98
  {
141
- src: "#{scope.chomp('/')}/sw.js",
99
+ src: "#{scope}/sw.js?manifestLocation=#{Rack::Utils.escape("#{scope}/manifest.json")}",
142
100
  scope: scope
143
101
  }
144
102
  end
@@ -146,37 +104,5 @@ module LinkedRails
146
104
  def websocket_path
147
105
  Rails.application.config.try(:action_cable).try(:mount_path).try(:[], 1..-1)
148
106
  end
149
-
150
- def preconnect
151
- []
152
- end
153
-
154
- def styled_headers
155
- false
156
- end
157
-
158
- def tracking
159
- []
160
- end
161
-
162
- class << self
163
- def destroy(iri)
164
- Storage.hdel(:persistent, :manifest, URL.as_href(iri))
165
- end
166
-
167
- def move(from, to)
168
- Storage.hset(
169
- :persistent,
170
- :redirect_prefix,
171
- URL.as_href(from) => URL.as_href(to)
172
- )
173
-
174
- data = Storage.hget(:persistent, :manifest, URL.as_href(from))
175
-
176
- Storage.hset(:persistent, :manifest, URL.as_href(to), data) if data
177
-
178
- destroy(from)
179
- end
180
- end
181
107
  end
182
108
  end
@@ -81,7 +81,7 @@ module LinkedRails
81
81
  parent = parent_from_params(params, user_context)
82
82
  return if parent.blank?
83
83
 
84
- parent.try(:menu_sequence)
84
+ parent.menu_sequence
85
85
  end
86
86
  end
87
87
  end
@@ -26,7 +26,7 @@ module LinkedRails
26
26
  end
27
27
 
28
28
  def menus
29
- @menus ||= available_menus.map(&method(:memoized_menu_item))
29
+ @menus ||= available_menus.map(&method(:memoised_menu_item))
30
30
  end
31
31
 
32
32
  def menu(tag)
@@ -4,7 +4,6 @@ module LinkedRails
4
4
  class Ontology
5
5
  include ActiveModel::Model
6
6
  include LinkedRails::Model
7
- include LinkedRails::Model::Cacheable
8
7
 
9
8
  def classes
10
9
  @classes ||= LinkedRails.linked_models.map do |klass|
@@ -17,7 +17,6 @@ module LinkedRails
17
17
  has_one :collection, predicate: Vocab.as.partOf
18
18
  has_one :unfiltered_collection, predicate: Vocab.ontola[:baseCollection]
19
19
  has_one :member_sequence, predicate: Vocab.as.items
20
- has_many :members
21
20
  end
22
21
  end
23
22
  end
@@ -11,8 +11,6 @@ en:
11
11
  update:
12
12
  label: "Edit"
13
13
  success: 'Updated successfully'
14
- errors:
15
- access_denied: "You're not authorized for this action. (%{action})"
16
14
  linked_rails:
17
15
  status:
18
16
  400: "Error in request"
@@ -5,8 +5,20 @@ module LinkedRails
5
5
  module Delta
6
6
  include LinkedRails::Helpers::DeltaHelper
7
7
 
8
- def changes_triples(resource)
8
+ def changes_triples(resource) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
9
9
  resource_serializer(resource)&.send(:repository).statements
10
+
11
+ # resource.previous_changes_by_predicate.map do |predicate, (_old_value, _new_value)|
12
+ # serializer_attributes = resource.class.predicate_mapping[predicate]
13
+ # next if serializer_attributes.is_a?(FastJsonapi::Relationship)
14
+ #
15
+ # attr_name = serializer_attributes.key
16
+ # serialized_value =
17
+ # serializer.class.attributes_to_serialize[attr_name]&.serialize(resource, serializer_params, {})
18
+ # (serialized_value.is_a?(Array) ? serialized_value : [serialized_value]).map do |value|
19
+ # change_triple(resource, predicate, value)
20
+ # end
21
+ # end.compact.flatten
10
22
  end
11
23
 
12
24
  def changed_relations_triples(resource, inverted = nil) # rubocop:disable Metrics/AbcSize
@@ -23,6 +35,14 @@ module LinkedRails
23
35
 
24
36
  private
25
37
 
38
+ def change_triple(resource, predicate, value)
39
+ if value.nil?
40
+ RDF::Statement.new(resource.iri, predicate, Vocab.sp[:Variable], graph_name: delta_iri(:remove))
41
+ else
42
+ RDF::Statement.new(resource.iri, predicate, value, graph_name: delta_iri(:replace))
43
+ end
44
+ end
45
+
26
46
  def changed_relation_triples(predicate, destructed, resources, inverted)
27
47
  related_resource_invalidations =
28
48
  resources.flat_map do |resource|
@@ -6,10 +6,6 @@ module LinkedRails
6
6
  extend ActiveSupport::Concern
7
7
  include ActiveSupport::Rescuable
8
8
 
9
- included do
10
- rescue_from LinkedRails::Errors::Forbidden, with: :handle_error
11
- end
12
-
13
9
  private
14
10
 
15
11
  def add_error_snackbar(error)
@@ -73,7 +69,6 @@ module LinkedRails
73
69
  'Doorkeeper::Errors::InvalidGrantReuse' => 422,
74
70
  'LinkedRails::Auth::Errors::Expired' => 410,
75
71
  'LinkedRails::Auth::Errors::Unauthorized' => 401,
76
- 'LinkedRails::Errors::Forbidden' => 403,
77
72
  'Pundit::NotAuthorizedError' => 403
78
73
  }
79
74
  end
@@ -46,22 +46,12 @@ module LinkedRails
46
46
 
47
47
  private
48
48
 
49
- def request_path_to_url(path)
50
- return path unless path.present? && URI(path).relative?
51
-
52
- port = [80, 443].include?(request.port) ? nil : request.port
53
- URI::Generic.new(request.scheme, nil, request.host, port, nil, path, nil, nil, nil).to_s
54
- end
55
-
56
49
  def build_new_resource
57
50
  controller_class.build_new(user_context: user_context)
58
51
  end
59
52
 
60
53
  def new_resource_from_parent
61
- if requested_resource.is_a?(LinkedRails.collection_class) ||
62
- requested_resource.is_a?(LinkedRails.collection_view_class)
63
- return requested_resource.child_resource
64
- end
54
+ return requested_resource.child_resource if requested_resource.is_a?(Collection)
65
55
 
66
56
  parent_resource.build_child(
67
57
  controller_class,
@@ -38,7 +38,7 @@ module LinkedRails
38
38
  params = Rails.application.routes.recognize_path(iri.to_s, method: method)
39
39
 
40
40
  route_params_to_opts(params.merge(query), iri.to_s)
41
- rescue ActionController::RoutingError, SystemStackError
41
+ rescue ActionController::RoutingError
42
42
  EMPTY_IRI_OPTS.dup
43
43
  end
44
44
 
@@ -6,7 +6,7 @@ module LinkedRails
6
6
  module Middleware
7
7
  class LinkedDataParams
8
8
  include ::Empathy::EmpJson::Helpers::Slices
9
- include ::Empathy::EmpJson::Helpers::Parsing
9
+ include ::Empathy::EmpJson::Helpers::Primitives
10
10
 
11
11
  def initialize(app)
12
12
  @app = app
@@ -22,6 +22,17 @@ module LinkedRails
22
22
  end
23
23
  end
24
24
 
25
+ def previous_changes_by_predicate
26
+ serializer_class = RDF::Serializers.serializer_for(self)
27
+ return {} unless respond_to?(:previous_changes) && serializer_class
28
+
29
+ Hash[
30
+ previous_changes
31
+ .map { |k, v| [self.class.predicate_for_key(k.to_sym), v] }
32
+ .select { |k, _v| k.present? }
33
+ ]
34
+ end
35
+
25
36
  def previously_changed_relations(inverted = nil)
26
37
  serializer_class = RDF::Serializers.serializer_for(self)
27
38
  return {} unless serializer_class.try(:relationships_to_serialize)
@@ -62,7 +62,6 @@ module LinkedRails
62
62
  iri = root_relative_iri.dup
63
63
  iri.scheme = LinkedRails.scheme
64
64
  iri.host = LinkedRails.host
65
- iri.path = iri.path.presence || '/'
66
65
  iri
67
66
  end
68
67
 
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'model/actionable'
4
- require_relative 'model/cacheable'
5
4
  require_relative 'model/collections'
6
5
  require_relative 'model/dirty'
7
6
  require_relative 'model/enhancements'
@@ -3,7 +3,8 @@
3
3
  module LinkedRails
4
4
  class ParamsParser # rubocop:disable Metrics/ClassLength
5
5
  include ::Empathy::EmpJson::Helpers::Slices
6
- include ::Empathy::EmpJson::Helpers::Parsing
6
+ include ::Empathy::EmpJson::Helpers::Primitives
7
+ include ::Empathy::EmpJson::Helpers::Values
7
8
 
8
9
  attr_accessor :params, :slice, :user_context
9
10
  delegate :filter_params, to: :collection_params_parser
@@ -62,11 +63,11 @@ module LinkedRails
62
63
  def associated_class_from_params(reflection, object)
63
64
  return reflection.klass unless reflection.polymorphic?
64
65
 
65
- type = values_from_slice(slice, object, Vocab.rdfv[:type])
66
+ query = slice.query(subject: object, predicate: Vocab.rdfv[:type])
66
67
 
67
- raise("No type given for '#{object}' referenced by polymorphic association '#{reflection.name}'") if type.blank?
68
+ raise("No type given for '#{object}' referenced by polymorphic association '#{reflection.name}'") if query.empty?
68
69
 
69
- iri_to_class(type)
70
+ iri_to_class(query.first.object)
70
71
  end
71
72
 
72
73
  def collection_params_parser
@@ -77,11 +78,11 @@ module LinkedRails
77
78
  options = serializer_field(klass, predicate)
78
79
  return unless value.count == 1 && options.present?
79
80
 
80
- parsed_value = value.first.start_with?('http') ? RDF::URI(value.first) : value.first
81
+ parsed_value = value.first.start_with?('http') ? RDF::URI(value.first) : RDF::Literal(value.first)
81
82
  parse_param(
82
83
  klass,
83
84
  options.predicate,
84
- object_to_value(parsed_value)
85
+ parsed_value
85
86
  )
86
87
  end
87
88
 
@@ -46,10 +46,6 @@ module LinkedRails
46
46
  self.class.policy_class
47
47
  end
48
48
 
49
- def public_resource?
50
- false
51
- end
52
-
53
49
  def show?
54
50
  false
55
51
  end
data/lib/linked_rails.rb CHANGED
@@ -22,10 +22,6 @@ module LinkedRails
22
22
 
23
23
  mattr_accessor :whitelisted_spi_ips
24
24
  mattr_writer :host, :scheme
25
- mattr_accessor :persistent_redis_database, default: ENV['PERSISTENT_REDIS_DATABASE'].presence || 6
26
- mattr_accessor :stream_redis_database, default: ENV['STREAM_REDIS_DATABASE'].presence || 7
27
- mattr_accessor :cache_redis_database, default: ENV['CACHE_REDIS_DATABASE'].presence || 8
28
- mattr_accessor :cache_stream, default: ENV['CACHE_STREAM'].presence || 'transactions'
29
25
 
30
26
  def self.configurable_class(parent, klass, default: nil, reader: nil) # rubocop:disable Metrics/AbcSize
31
27
  method = :"#{[parent, klass.to_s.downcase].compact.join('_')}_class"
@@ -54,10 +50,8 @@ module LinkedRails
54
50
  @@scheme ||= Rails.application.routes.default_url_options[:protocol] || :http # rubocop:disable Style/ClassVars
55
51
  end
56
52
 
57
- def iri(**args)
58
- opts = {scheme: LinkedRails.scheme, host: LinkedRails.host}.merge(args)
59
- opts[:path] = opts[:path].presence || '/'
60
- RDF::URI.new(**opts)
53
+ def iri(**opts)
54
+ RDF::URI.new(**{scheme: LinkedRails.scheme, host: LinkedRails.host}.merge(opts))
61
55
  end
62
56
  end
63
57
 
@@ -90,7 +84,6 @@ ActiveSupport::Inflector.inflections do |inflect|
90
84
  inflect.acronym 'SHACL'
91
85
  end
92
86
 
93
- require 'linked_rails/errors'
94
87
  require 'linked_rails/uri_template'
95
88
  require 'linked_rails/vocab'
96
89
  require 'linked_rails/cache'
@@ -108,5 +101,3 @@ require 'linked_rails/routes'
108
101
  require 'linked_rails/serializer'
109
102
  require 'linked_rails/translate'
110
103
  require 'linked_rails/railtie'
111
- require 'linked_rails/url'
112
- require 'linked_rails/storage'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: linked_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4.pre.g8d7195543
4
+ version: 0.0.4.pre.g9b7bc9073
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arthur Dingemans
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-08-24 00:00:00.000000000 Z
11
+ date: 2022-08-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: active_response
@@ -26,20 +26,6 @@ dependencies:
26
26
  version: 0.0.2
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: emp_json
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: 1.3.0
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: 1.3.0
41
- - !ruby/object:Gem::Dependency
42
- name: kaminari-activerecord
43
29
  requirement: !ruby/object:Gem::Requirement
44
30
  requirements:
45
31
  - - ">="
@@ -53,7 +39,7 @@ dependencies:
53
39
  - !ruby/object:Gem::Version
54
40
  version: '0'
55
41
  - !ruby/object:Gem::Dependency
56
- name: pundit
42
+ name: kaminari-activerecord
57
43
  requirement: !ruby/object:Gem::Requirement
58
44
  requirements:
59
45
  - - ">="
@@ -67,7 +53,7 @@ dependencies:
67
53
  - !ruby/object:Gem::Version
68
54
  version: '0'
69
55
  - !ruby/object:Gem::Dependency
70
- name: redis
56
+ name: pundit
71
57
  requirement: !ruby/object:Gem::Requirement
72
58
  requirements:
73
59
  - - ">="
@@ -299,10 +285,8 @@ files:
299
285
  - app/policies/linked_rails/collection/view_policy.rb
300
286
  - app/policies/linked_rails/collection_policy.rb
301
287
  - app/policies/linked_rails/enum_value_policy.rb
302
- - app/policies/linked_rails/form_policy.rb
303
288
  - app/policies/linked_rails/menus/item_policy.rb
304
289
  - app/policies/linked_rails/menus/list_policy.rb
305
- - app/policies/linked_rails/ontology_policy.rb
306
290
  - app/policies/linked_rails/sequence_policy.rb
307
291
  - app/serializers/linked_rails/actions/item_serializer.rb
308
292
  - app/serializers/linked_rails/actions/object_serializer.rb
@@ -340,7 +324,6 @@ files:
340
324
  - app/serializers/linked_rails/web_page_serializer.rb
341
325
  - app/serializers/linked_rails/web_site_serializer.rb
342
326
  - app/serializers/linked_rails/widget_serializer.rb
343
- - app/workers/linked_rails/invalidation_stream_worker.rb
344
327
  - config/initializers/inflections.rb
345
328
  - lib/generators/linked_rails/install/install_generator.rb
346
329
  - lib/generators/linked_rails/install/templates/README
@@ -390,8 +373,6 @@ files:
390
373
  - lib/linked_rails/enhancements/destroyable/controller.rb
391
374
  - lib/linked_rails/enhancements/updatable/controller.rb
392
375
  - lib/linked_rails/enhancements/updatable/serializer.rb
393
- - lib/linked_rails/errors.rb
394
- - lib/linked_rails/errors/forbidden.rb
395
376
  - lib/linked_rails/helpers/delta_helper.rb
396
377
  - lib/linked_rails/helpers/ontola_actions_helper.rb
397
378
  - lib/linked_rails/helpers/resource_helper.rb
@@ -400,7 +381,6 @@ files:
400
381
  - lib/linked_rails/middleware/linked_data_params.rb
401
382
  - lib/linked_rails/model.rb
402
383
  - lib/linked_rails/model/actionable.rb
403
- - lib/linked_rails/model/cacheable.rb
404
384
  - lib/linked_rails/model/collections.rb
405
385
  - lib/linked_rails/model/dirty.rb
406
386
  - lib/linked_rails/model/enhancements.rb
@@ -424,12 +404,10 @@ files:
424
404
  - lib/linked_rails/serializer/actionable.rb
425
405
  - lib/linked_rails/serializer/menuable.rb
426
406
  - lib/linked_rails/serializer/singularable.rb
427
- - lib/linked_rails/storage.rb
428
407
  - lib/linked_rails/test_methods.rb
429
408
  - lib/linked_rails/translate.rb
430
409
  - lib/linked_rails/types/iri_type.rb
431
410
  - lib/linked_rails/uri_template.rb
432
- - lib/linked_rails/url.rb
433
411
  - lib/linked_rails/version.rb
434
412
  - lib/linked_rails/vocab.rb
435
413
  - lib/nill_class_renderer.rb
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module LinkedRails
4
- class FormPolicy < LinkedRails.policy_parent_class
5
- def show?
6
- true
7
- end
8
-
9
- def public_resource?
10
- true
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module LinkedRails
4
- class OntologyPolicy < LinkedRails.policy_parent_class
5
- def show?
6
- true
7
- end
8
-
9
- def public_resource?
10
- true
11
- end
12
- end
13
- end
@@ -1,16 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module LinkedRails
4
- class InvalidationStreamWorker < ActiveJob::Base
5
- def perform(type, iri, resource_type)
6
- entry = {
7
- type: type,
8
- resource: iri,
9
- resourceType: resource_type
10
- }
11
- id = Storage.xadd(:stream, LinkedRails.cache_stream, entry)
12
-
13
- raise('No message id returned, implies failure') if id.blank?
14
- end
15
- end
16
- end
@@ -1,37 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module LinkedRails
4
- module Errors
5
- class Forbidden < StandardError
6
- attr_reader :query, :record, :policy, :action
7
-
8
- # @param [Hash] options
9
- # @option options [String] query The action of the request
10
- # @option options [ActiveRecord::Base] record The record that was requested
11
- # @option options [Policy] policy The policy that raised the exception
12
- # @option options [String] message Override the default error message
13
- # @return [String] the message
14
- def initialize(**options)
15
- @query = options.fetch(:query).to_s
16
- @record = options[:record]
17
- @policy = options[:policy]
18
- @action = @query[-1] == '?' ? @query[0..-2] : @query
19
- @message = options[:message]
20
-
21
- raise StandardError if @query.blank? && @message.blank?
22
-
23
- super(@message || default_message)
24
- end
25
-
26
- private
27
-
28
- def default_message
29
- I18n.t(
30
- "pundit.#{@policy.class.to_s.underscore}.#{@query}",
31
- action: @action,
32
- default: I18n.t('errors.access_denied')
33
- )
34
- end
35
- end
36
- end
37
- end
@@ -1,3 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'errors/forbidden'
@@ -1,45 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module LinkedRails
4
- module Model
5
- module Cacheable
6
- extend ActiveSupport::Concern
7
-
8
- included do
9
- if respond_to?(:after_commit)
10
- after_commit :publish_create, on: :create, if: :should_publish_changes
11
- after_commit :publish_update, on: :update, if: :should_publish_changes
12
- after_commit :publish_delete, on: :destroy, if: :should_publish_changes
13
- end
14
- end
15
-
16
- def cacheable?
17
- true
18
- end
19
-
20
- def publish_create
21
- publish_message('io.ontola.transactions.Created')
22
- end
23
-
24
- def publish_update
25
- publish_message('io.ontola.transactions.Updated')
26
- end
27
-
28
- def publish_delete
29
- publish_message('io.ontola.transactions.Deleted')
30
- end
31
-
32
- private
33
-
34
- def publish_message(type)
35
- LinkedRails::InvalidationStreamWorker.perform_now(type, iri.to_s, self.class.iri.to_s)
36
- rescue StandardError
37
- LinkedRails::InvalidationStreamWorker.perform_later(type, iri.to_s, self.class.iri.to_s)
38
- end
39
-
40
- def should_publish_changes
41
- cacheable? && !Rails.env.test?
42
- end
43
- end
44
- end
45
- end
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'redis'
4
-
5
- module LinkedRails
6
- class Storage
7
- REDIS_DB = {
8
- cache: LinkedRails.cache_redis_database,
9
- persistent: LinkedRails.persistent_redis_database,
10
- stream: LinkedRails.stream_redis_database
11
- }.freeze
12
- KEYS = {
13
- manifest: 'cache:Manifest',
14
- redirect_exact: 'cache:Redirect:Exact',
15
- redirect_prefix: 'cache:Redirect:Prefix'
16
- }.freeze
17
-
18
- class << self
19
- %i[xadd].each do |method|
20
- define_method(method) do |db, *args|
21
- Redis.new(db: REDIS_DB.fetch(db)).send(method, *args)
22
- end
23
- end
24
-
25
- %i[hset hdel hget].each do |method|
26
- define_method(method) do |db, key, *args|
27
- Redis.new(db: REDIS_DB.fetch(db)).send(method, KEYS.fetch(key), *args)
28
- end
29
- end
30
- end
31
- end
32
- end
@@ -1,11 +0,0 @@
1
- module LinkedRails
2
- class URL
3
- class << self
4
- def as_href(url)
5
- uri = URI(url)
6
- uri.path = uri.path.presence || '/'
7
- uri.to_s
8
- end
9
- end
10
- end
11
- end