linked_rails 0.0.4.pre.gfe77aae19 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (117) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +674 -21
  3. data/app/controllers/linked_rails/bulk_controller.rb +16 -81
  4. data/app/models/linked_rails/actions/item.rb +30 -23
  5. data/app/models/linked_rails/actions/list.rb +6 -0
  6. data/app/models/linked_rails/collection/filter_field.rb +3 -16
  7. data/app/models/linked_rails/collection/filterable.rb +4 -6
  8. data/app/models/linked_rails/collection/infinite.rb +6 -17
  9. data/app/models/linked_rails/collection/iri.rb +2 -25
  10. data/app/models/linked_rails/collection/iri_mapping.rb +1 -1
  11. data/app/models/linked_rails/collection/paginated.rb +3 -4
  12. data/app/models/linked_rails/collection/view.rb +10 -38
  13. data/app/models/linked_rails/collection.rb +25 -27
  14. data/app/models/linked_rails/enum_value.rb +1 -1
  15. data/app/models/linked_rails/form/field/association_input.rb +1 -7
  16. data/app/models/linked_rails/form/field/file_input.rb +0 -1
  17. data/app/models/linked_rails/form/field.rb +5 -31
  18. data/app/models/linked_rails/form/field_factory.rb +16 -29
  19. data/app/models/linked_rails/form/group.rb +4 -2
  20. data/app/models/linked_rails/form/page.rb +0 -4
  21. data/app/models/linked_rails/form.rb +6 -4
  22. data/app/models/linked_rails/manifest.rb +20 -94
  23. data/app/models/linked_rails/menus/item.rb +13 -10
  24. data/app/models/linked_rails/menus/list.rb +5 -13
  25. data/app/models/linked_rails/ontology/base.rb +0 -2
  26. data/app/models/linked_rails/ontology.rb +0 -1
  27. data/app/models/linked_rails/property_query.rb +0 -2
  28. data/app/models/linked_rails/sequence.rb +11 -2
  29. data/app/models/linked_rails/web_page.rb +4 -0
  30. data/app/models/linked_rails/web_site.rb +4 -0
  31. data/app/models/linked_rails/widget.rb +10 -3
  32. data/app/policies/linked_rails/collection_policy.rb +2 -2
  33. data/app/serializers/linked_rails/actions/item_serializer.rb +4 -3
  34. data/app/serializers/linked_rails/collection/filter_field_serializer.rb +2 -3
  35. data/app/serializers/linked_rails/collection/filter_option_serializer.rb +1 -1
  36. data/app/serializers/linked_rails/collection/filter_serializer.rb +1 -1
  37. data/app/serializers/linked_rails/collection/sorting_serializer.rb +1 -1
  38. data/app/serializers/linked_rails/collection/view_serializer.rb +3 -3
  39. data/app/serializers/linked_rails/collection_serializer.rb +13 -9
  40. data/app/serializers/linked_rails/condition_serializer.rb +3 -3
  41. data/app/serializers/linked_rails/entry_point_serializer.rb +2 -2
  42. data/app/serializers/linked_rails/enum_value_serializer.rb +0 -1
  43. data/app/serializers/linked_rails/form/field/association_input_serializer.rb +0 -1
  44. data/app/serializers/linked_rails/form/field_serializer.rb +1 -3
  45. data/app/serializers/linked_rails/form/group_serializer.rb +1 -1
  46. data/app/serializers/linked_rails/form/page_serializer.rb +1 -1
  47. data/app/serializers/linked_rails/menus/item_serializer.rb +3 -3
  48. data/app/serializers/linked_rails/menus/list_serializer.rb +1 -1
  49. data/app/serializers/linked_rails/sequence_serializer.rb +5 -2
  50. data/app/serializers/linked_rails/shacl/node_shape_serializer.rb +1 -1
  51. data/app/serializers/linked_rails/shacl/property_shape_serializer.rb +1 -1
  52. data/app/serializers/linked_rails/shacl/shape_serializer.rb +5 -5
  53. data/app/serializers/linked_rails/web_page_serializer.rb +3 -3
  54. data/app/serializers/linked_rails/web_site_serializer.rb +1 -1
  55. data/app/serializers/linked_rails/widget_serializer.rb +3 -3
  56. data/lib/generators/linked_rails/install/templates/locales.yml +0 -4
  57. data/lib/generators/linked_rails/install/templates/rdf_serializers_initializer.rb +1 -1
  58. data/lib/generators/linked_rails/model/templates/form.rb.tt +1 -1
  59. data/lib/generators/linked_rails/model/templates/policy.rb.tt +1 -1
  60. data/lib/generators/linked_rails/model/templates/serializer.rb.tt +1 -5
  61. data/lib/linked_rails/active_response/controller/collections.rb +1 -1
  62. data/lib/linked_rails/active_response/controller/crud_defaults.rb +1 -1
  63. data/lib/linked_rails/active_response/controller/params.rb +6 -6
  64. data/lib/linked_rails/active_response/controller.rb +22 -1
  65. data/lib/linked_rails/collection_params_parser.rb +1 -1
  66. data/lib/linked_rails/controller/actionable.rb +2 -5
  67. data/lib/linked_rails/controller/default_actions/create.rb +2 -2
  68. data/lib/linked_rails/controller/error_handling.rb +7 -12
  69. data/lib/linked_rails/controller.rb +1 -4
  70. data/lib/linked_rails/helpers/delta_helper.rb +58 -4
  71. data/lib/linked_rails/helpers/resource_helper.rb +1 -13
  72. data/lib/linked_rails/iri_mapper.rb +1 -1
  73. data/lib/linked_rails/middleware/linked_data_params.rb +27 -26
  74. data/lib/linked_rails/model/actionable.rb +8 -7
  75. data/lib/linked_rails/model/collections.rb +4 -10
  76. data/lib/linked_rails/model/dirty.rb +18 -6
  77. data/lib/linked_rails/model/filtering.rb +2 -2
  78. data/lib/linked_rails/model/indexable.rb +1 -1
  79. data/lib/linked_rails/model/iri.rb +2 -14
  80. data/lib/linked_rails/model/iri_mapping.rb +3 -3
  81. data/lib/linked_rails/model/menuable.rb +7 -1
  82. data/lib/linked_rails/model/serialization.rb +6 -2
  83. data/lib/linked_rails/model/singularable.rb +5 -7
  84. data/lib/linked_rails/model/tables.rb +1 -1
  85. data/lib/linked_rails/model.rb +2 -5
  86. data/lib/linked_rails/params_parser.rb +47 -48
  87. data/lib/linked_rails/policy.rb +30 -21
  88. data/lib/linked_rails/renderers.rb +0 -1
  89. data/lib/linked_rails/routes.rb +0 -1
  90. data/lib/linked_rails/serializer/singularable.rb +1 -1
  91. data/lib/linked_rails/serializer.rb +2 -6
  92. data/lib/linked_rails/translate.rb +0 -12
  93. data/lib/linked_rails/vocab.rb +0 -1
  94. data/lib/linked_rails.rb +3 -16
  95. data/lib/rdf/query_fix.rb +1 -1
  96. metadata +10 -59
  97. data/app/controllers/linked_rails/actions/objects_controller.rb +0 -9
  98. data/app/models/linked_rails/actions/object.rb +0 -38
  99. data/app/models/linked_rails/form/field/url_input.rb +0 -10
  100. data/app/policies/linked_rails/actions/object_policy.rb +0 -11
  101. data/app/policies/linked_rails/form_policy.rb +0 -13
  102. data/app/policies/linked_rails/ontology_policy.rb +0 -13
  103. data/app/serializers/linked_rails/actions/object_serializer.rb +0 -9
  104. data/app/serializers/linked_rails/form/field/file_input_serializer.rb +0 -11
  105. data/app/serializers/linked_rails/property_query_serializer.rb +0 -7
  106. data/app/workers/linked_rails/invalidation_stream_worker.rb +0 -16
  107. data/lib/linked_rails/controller/delta.rb +0 -58
  108. data/lib/linked_rails/controller/rendering.rb +0 -48
  109. data/lib/linked_rails/errors/forbidden.rb +0 -37
  110. data/lib/linked_rails/errors.rb +0 -3
  111. data/lib/linked_rails/middleware/error_handling.rb +0 -51
  112. data/lib/linked_rails/model/cacheable.rb +0 -45
  113. data/lib/linked_rails/railtie.rb +0 -11
  114. data/lib/linked_rails/storage.rb +0 -32
  115. data/lib/linked_rails/types/iri_type.rb +0 -37
  116. data/lib/linked_rails/url.rb +0 -11
  117. data/lib/rdf/list.rb +0 -9
@@ -11,8 +11,7 @@ module LinkedRails
11
11
  def show
12
12
  render json: authorized_resources
13
13
 
14
- print_timings unless Rails.env.production?
15
- send_timings if client
14
+ print_timings
16
15
  end
17
16
 
18
17
  private
@@ -21,11 +20,8 @@ module LinkedRails
21
20
  return response_for_wrong_host(opts) if wrong_host?(opts[:iri])
22
21
 
23
22
  include = opts[:include].to_s == 'true'
24
- resource = LinkedRails.iri_mapper.resource_from_iri(request_path_to_url(opts[:iri]), user_context)
25
23
 
26
- return response_from_request(include, RDF::URI(opts[:iri])) if resource.blank?
27
-
28
- response_from_resource(include, opts[:iri], resource)
24
+ response_from_request(include, RDF::URI(opts[:iri]))
29
25
  rescue StandardError => e
30
26
  handle_resource_error(opts, e)
31
27
  end
@@ -38,10 +34,6 @@ module LinkedRails
38
34
  .map(&method(:timed_authorized_resource))
39
35
  end
40
36
 
41
- def client
42
- nil
43
- end
44
-
45
37
  def handle_resource_error(opts, error)
46
38
  log_resource_error(error, opts[:iri])
47
39
  status = error_status(error)
@@ -72,34 +64,29 @@ module LinkedRails
72
64
  def print_timings
73
65
  Rails.logger.debug(
74
66
  "\n CPU system user+system real inc status cache iri\n" \
75
- "#{timing_lines.join("\n")}\n" \
67
+ "#{timings.join("\n")}\n" \
76
68
  " User: #{current_user.class}(#{current_user.id})"
77
69
  )
78
70
  end
79
71
 
80
- def send_timings
81
- timings.each do |timing|
82
- client.send_json(timing_json(timing))
83
- end
84
- end
85
-
86
72
  def require_doorkeeper_token?
87
73
  false
88
74
  end
89
75
 
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?)
76
+ def resource_body(resource)
77
+ return if resource.nil?
93
78
 
94
- :public
79
+ serializer_options = RDF::Serializers::Renderers.transform_opts(
80
+ {include: resource&.try(:preview_includes)},
81
+ serializer_params
82
+ )
83
+ RDF::Serializers.serializer_for(resource).new(resource, serializer_options).send(:render_hndjson)
95
84
  end
96
85
 
97
86
  def resource_params(param)
98
87
  params = param.permit(:include, :iri)
99
88
  params[:iri] = URI(params[:iri])
100
89
  params
101
- rescue URI::InvalidURIError
102
- params.except(:iri)
103
90
  end
104
91
 
105
92
  def resource_response_body(iri, rack_body, status)
@@ -128,7 +115,7 @@ module LinkedRails
128
115
  fullpath = iri.query.blank? ? iri.path : "#{iri.path}?#{iri.query}"
129
116
 
130
117
  request.env.slice(*REQUEST_HEADERS).merge(
131
- 'HTTP_ACCEPT' => 'application/empathy+json',
118
+ 'HTTP_ACCEPT' => 'application/hex+x-ndjson',
132
119
  'HTTP_OPERATOR_ARG_GRAPH' => 'true',
133
120
  'ORIGINAL_FULLPATH' => fullpath
134
121
  )
@@ -143,12 +130,6 @@ module LinkedRails
143
130
  }.merge(opts)
144
131
  end
145
132
 
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
133
  def response_for_wrong_host(opts)
153
134
  iri = opts[:iri]
154
135
  term = term_from_vocab(iri)
@@ -157,23 +138,6 @@ module LinkedRails
157
138
  ontology_term_response(iri, term, opts[:include])
158
139
  end
159
140
 
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
141
  def term_from_vocab(iri)
178
142
  vocab = Vocab.for(iri)
179
143
  tag = iri.to_s.split(vocab.to_s).last
@@ -182,30 +146,6 @@ module LinkedRails
182
146
  nil
183
147
  end
184
148
 
185
- def timing_json(timing) # rubocop:disable Metrics/MethodLength
186
- route = Rails.application.routes.recognize_path(timing[:resource].to_s)
187
-
188
- {
189
- type: 'web',
190
- timings: {
191
- total_duration: timing[:time].total
192
- },
193
- default_labels: {
194
- action: route[:action] || 'show',
195
- controller: route[:controller] || 'subresource',
196
- status: timing[:status],
197
- include: timing[:include]
198
- }
199
- }
200
- end
201
-
202
- def timing_lines
203
- timings.map do |timing|
204
- include = timing[:include].to_s.ljust(5)
205
- "#{timing[:time].to_s[0..-2]} - #{include} #{timing[:status]} #{timing[:cache]} #{timing[:resource]}"
206
- end
207
- end
208
-
209
149
  def ontology_class(iri)
210
150
  klass = LinkedRails.linked_models.detect do |model|
211
151
  (model.iri.is_a?(Array) ? model.iri : [model.iri]).include?(iri)
@@ -241,8 +181,6 @@ module LinkedRails
241
181
  language: response_language(headers),
242
182
  status: status
243
183
  )
244
- rescue URI::InvalidURIError, ActionController::BadRequest
245
- resource_response(iri)
246
184
  end
247
185
 
248
186
  def response_language(headers)
@@ -251,7 +189,7 @@ module LinkedRails
251
189
 
252
190
  def sanitized_relative_path(iri) # rubocop:disable Metrics/AbcSize
253
191
  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)
192
+ uri = URI(LinkedRails.iri.path.present? ? iri.to_s.split("#{LinkedRails.iri.path}/").last : iri)
255
193
 
256
194
  [uri.path, uri.query].compact.join('?')
257
195
  end
@@ -263,13 +201,10 @@ module LinkedRails
263
201
  def timed_authorized_resource(resource)
264
202
  res = nil
265
203
  time = Benchmark.measure { res = authorized_resource(resource) }
266
- timings << {
267
- time: time,
268
- include: resource[:include],
269
- status: res[:status],
270
- cache: res[:cache],
271
- resource: resource[:iri]
272
- }
204
+ unless Rails.env.production?
205
+ include = resource[:include].to_s.ljust(5)
206
+ timings << "#{time.to_s[0..-2]} - #{include} #{res[:status]} #{res[:cache]} #{resource[:iri]}"
207
+ end
273
208
  res
274
209
  end
275
210
 
@@ -8,13 +8,13 @@ module LinkedRails
8
8
  include ActiveModel::Model
9
9
  include LinkedRails::Model
10
10
 
11
- attr_accessor :inherit, :list, :one_click, :policy_arguments, :submit_label, :target_path, :target_query
11
+ attr_accessor :inherit, :list, :one_click, :policy_arguments, :submit_label, :target_path
12
12
  attr_writer :parent, :resource, :root_relative_iri, :user_context, :object,
13
13
  :target
14
14
  delegate :user_context, to: :list, allow_nil: true
15
15
  collection_options(
16
16
  association_base: lambda {
17
- action_list = association_class.get_action_list(parent, user_context)
17
+ action_list = parent ? parent.action_list(user_context) : association_class.app_action_list(user_context)
18
18
 
19
19
  action_list.actions
20
20
  },
@@ -55,21 +55,37 @@ module LinkedRails
55
55
  @condition.nil? || condition
56
56
  end
57
57
 
58
+ def built_associations
59
+ included_object
60
+ .class
61
+ .try(:reflect_on_all_associations)
62
+ &.select { |association| included_object.association(association.name).loaded? }
63
+ &.map(&:name)
64
+ end
65
+
58
66
  def error
59
67
  policy_message ||
60
68
  I18n.t("actions.status.#{action_status.to_s.split('#').last}", default: nil)
61
69
  end
62
70
 
71
+ def form_resource_includes
72
+ return {} if included_object.nil?
73
+
74
+ includes = included_object.class.try(:preview_includes)&.presence || []
75
+
76
+ (includes.is_a?(Hash) ? [includes] : includes) + (built_associations || [])
77
+ end
78
+
79
+ def included_object
80
+ object if object&.iri&.anonymous?
81
+ end
82
+
63
83
  def object
64
84
  @object = list.instance_exec(&@object) if @object.respond_to?(:call)
65
85
 
66
86
  @object || resource
67
87
  end
68
88
 
69
- def object_iri
70
- object&.iri&.anonymous? ? anonymous_object_iri : object&.iri
71
- end
72
-
73
89
  def parent
74
90
  return @parent if instance_variable_defined?(:@parent)
75
91
 
@@ -98,6 +114,10 @@ module LinkedRails
98
114
  RDF::URI(value)
99
115
  end
100
116
 
117
+ def preview_includes
118
+ [:target, included_object: form_resource_includes]
119
+ end
120
+
101
121
  def singular_resource?
102
122
  resource.try(:singular_resource?)
103
123
  end
@@ -138,12 +158,6 @@ module LinkedRails
138
158
 
139
159
  private
140
160
 
141
- def anonymous_object_iri
142
- object_iri = iri.dup
143
- object_iri.path += '/action_object'
144
- object_iri
145
- end
146
-
147
161
  def description_fallback
148
162
  LinkedRails.translate(:action, :description, self, false)
149
163
  end
@@ -157,7 +171,7 @@ module LinkedRails
157
171
  end
158
172
 
159
173
  def policy_resource_fallback
160
- object
174
+ resource
161
175
  end
162
176
 
163
177
  def policy_valid?
@@ -185,10 +199,9 @@ module LinkedRails
185
199
  @root_relative_iri
186
200
  end
187
201
 
188
- def target_url_fallback # rubocop:disable Metrics/AbcSize
202
+ def target_url_fallback
189
203
  base = (resource.try(:singular_resource?) ? resource.singular_iri : resource.iri).dup
190
- base.path = "#{base.path.chomp('/')}/#{target_path}" if target_path.present?
191
- base.query = Rack::Utils.parse_nested_query(base.query).merge(target_query).to_param if target_query.present?
204
+ base.path += "/#{target_path}" if target_path.present?
192
205
  base
193
206
  end
194
207
 
@@ -210,12 +223,6 @@ module LinkedRails
210
223
  )
211
224
  end
212
225
 
213
- def get_action_list(parent, user_context)
214
- return parent.action_list(user_context) if parent.respond_to?(:action_list)
215
-
216
- app_action_list(user_context)
217
- end
218
-
219
226
  def requested_index_resource(params, user_context)
220
227
  parent = parent_from_params!(params, user_context) if params.key?(:parent_iri)
221
228
 
@@ -229,7 +236,7 @@ module LinkedRails
229
236
  return nil if params[:id].blank?
230
237
 
231
238
  parent = parent_from_params!(params, user_context) if params.key?(:parent_iri)
232
- action_list = get_action_list(parent, user_context)
239
+ action_list = parent ? parent.action_list(user_context) : app_action_list(user_context)
233
240
 
234
241
  action_list&.action(params[:id].to_sym)
235
242
  end
@@ -50,6 +50,12 @@ module LinkedRails
50
50
  end
51
51
 
52
52
  class << self
53
+ def actionable_class
54
+ @actionable_class ||=
55
+ name.gsub('ActionList', '').safe_constantize ||
56
+ name.demodulize.gsub('ActionList', '').safe_constantize
57
+ end
58
+
53
59
  def collection_actions
54
60
  defined_actions[:collection]
55
61
  end
@@ -9,10 +9,9 @@ module LinkedRails
9
9
  include LinkedRails::CallableVariable
10
10
 
11
11
  attr_accessor :key, :klass, :collection
12
- attr_writer :options_array, :options_in, :visible
12
+ attr_writer :options_array, :options_in
13
13
  callable_variable(:options_array)
14
14
  callable_variable(:options_in)
15
- callable_variable(:visible)
16
15
 
17
16
  def iri(**_opts)
18
17
  self
@@ -27,20 +26,8 @@ module LinkedRails
27
26
  Collection::FilterOption.new(attrs.merge(collection: collection, key: key))
28
27
  end
29
28
 
30
- def visible?
31
- has_options? && condition_valid?
32
- end
33
-
34
- private
35
-
36
- def condition_valid?
37
- return true if visible.nil?
38
-
39
- visible
40
- end
41
-
42
- def has_options?
43
- !!(options_in || options_array)
29
+ def serializable?
30
+ options_in || options_array
44
31
  end
45
32
  end
46
33
  end
@@ -14,7 +14,7 @@ module LinkedRails
14
14
  delegate :filter_options, to: :association_class
15
15
 
16
16
  def filter_fields
17
- @filter_fields ||= filter_options&.map { |key, options| filter_field(key, options) }
17
+ @filter_fields ||= filter_options&.map { |key, options| filter_field(key, options) }&.select(&:serializable?)
18
18
  end
19
19
 
20
20
  def filtered?
@@ -51,10 +51,9 @@ module LinkedRails
51
51
  end
52
52
 
53
53
  def apply_filter(scope, key, values)
54
- filter = filter_options[key].try(:[], :filter)
54
+ filter = filter_options.fetch(key).try(:[], :filter)
55
55
 
56
56
  return filter.call(scope, values) if filter
57
- return scope unless association_class.predicate_mapping.key?(key)
58
57
 
59
58
  scope.where(association_class.predicate_mapping[key].key => values)
60
59
  end
@@ -73,14 +72,13 @@ module LinkedRails
73
72
  klass: association_class,
74
73
  key: key,
75
74
  options_in: options[:values_in],
76
- options_array: options[:values],
77
- visible: options[:visible]
75
+ options_array: options[:values]
78
76
  )
79
77
  end
80
78
 
81
79
  def sanitized_filter_value(key, value)
82
80
  mapping = association_class.predicate_mapping[key]
83
- datatype = mapping.is_a?(FastJsonapi::Relationship) ? Vocab.xsd.anyURI : mapping&.datatype
81
+ datatype = mapping.is_a?(FastJsonapi::Relationship) ? Vocab.xsd.anyURI : mapping.datatype
84
82
  val = xsd_to_rdf(datatype, value)
85
83
  val.literal? ? val.object : val
86
84
  end
@@ -9,12 +9,6 @@ module LinkedRails
9
9
  attr_accessor :before
10
10
  end
11
11
 
12
- def any?
13
- return members_query.any? if members_query.is_a?(ActiveRecord::Relation)
14
-
15
- count.positive?
16
- end
17
-
18
12
  def initialize(orignial = {})
19
13
  attrs = orignial.with_indifferent_access
20
14
  attrs[:before] = attrs[:before]&.map { |val| val.with_indifferent_access }
@@ -30,7 +24,7 @@ module LinkedRails
30
24
  }
31
25
  next_view = collection.view_with_opts(current_opts.merge(before: next_before_values))
32
26
 
33
- next_view.iri if next_view.any?
27
+ next_view.iri if next_view.count.positive?
34
28
  end
35
29
 
36
30
  def prev; end
@@ -59,15 +53,13 @@ module LinkedRails
59
53
  def before_values
60
54
  @before_values ||= before&.map do |value|
61
55
  sorting = collection.sortings.detect { |s| s.key == value[:key] }
62
- next if sorting.nil?
63
-
64
56
  {
65
57
  attribute: sorting.attribute_name,
66
58
  direction: sorting.sort_direction,
67
59
  key: value[:key],
68
60
  value: value[:value]
69
61
  }
70
- end.compact
62
+ end
71
63
  end
72
64
 
73
65
  def iri_opts
@@ -76,17 +68,14 @@ module LinkedRails
76
68
  }.merge(collection.iri_opts)
77
69
  end
78
70
 
79
- def iris_from_scope; end
80
-
81
71
  def members_query
82
- @members_query ||=
83
- prepare_members(association_base)
84
- .where(before_query)
85
- .limit(page_size)
72
+ prepare_members(association_base)
73
+ .where(before_query)
74
+ .limit(page_size)
86
75
  end
87
76
 
88
77
  def next_before_values
89
- last_record = members_query.last
78
+ last_record = members.last
90
79
  before_values.map do |val|
91
80
  value = last_record.send(val[:attribute])
92
81
  value = value.utc.iso8601(6) if value.is_a?(Time)
@@ -2,8 +2,8 @@
2
2
 
3
3
  module LinkedRails
4
4
  class Collection
5
- module IRI
6
- DEFAULT_IRI_TEMPLATE_KEYS = %i[before%5B%5D display filter%5B%5D page page_size sort%5B%5D table_type title type].freeze
5
+ module Iri
6
+ DEFAULT_IRI_TEMPLATE_KEYS = %i[before%5B%5D display filter%5B%5D page page_size sort%5B%5D title type].freeze
7
7
 
8
8
  extend ActiveSupport::Concern
9
9
 
@@ -11,7 +11,6 @@ module LinkedRails
11
11
  {
12
12
  parent_iri: parent_iri,
13
13
  display: @display,
14
- table_type: @table_type,
15
14
  title: @title,
16
15
  type: @type,
17
16
  page_size: @page_size,
@@ -21,28 +20,6 @@ module LinkedRails
21
20
  }.compact
22
21
  end
23
22
 
24
- def iri_template_opts
25
- opts = iri_opts.with_indifferent_access.slice(*(DEFAULT_IRI_TEMPLATE_KEYS + iri_template_keys))
26
- Hash[opts.keys.map { |key| [CGI.unescape(key).sub('[]', ''), opts[key]] }].to_param
27
- end
28
-
29
- def serialized_iri_template
30
- iri_template
31
- .to_s
32
- .gsub('{route_key}', iri_template_route_key)
33
- .gsub('{/parent_iri*}', iri_template_parent_iri)
34
- end
35
-
36
- private
37
-
38
- def iri_template_parent_iri
39
- parent&.iri&.to_s&.split('?')&.first || LinkedRails.iri
40
- end
41
-
42
- def iri_template_route_key
43
- route_key.to_s
44
- end
45
-
46
23
  class_methods do
47
24
  def iri
48
25
  [super, Vocab.as.Collection]
@@ -2,7 +2,7 @@
2
2
 
3
3
  module LinkedRails
4
4
  class Collection
5
- module IRIMapping
5
+ module IriMapping
6
6
  extend ActiveSupport::Concern
7
7
 
8
8
  class_methods do
@@ -30,10 +30,9 @@ module LinkedRails
30
30
  end
31
31
 
32
32
  def members_query
33
- @members_query ||=
34
- prepare_members(association_base)
35
- .page(page)
36
- .per(page_size)
33
+ prepare_members(association_base)
34
+ .page(page)
35
+ .per(page_size)
37
36
  end
38
37
 
39
38
  def prepare_members(scope)
@@ -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,
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
@@ -29,7 +28,7 @@ module LinkedRails
29
28
  end
30
29
 
31
30
  def members
32
- @members ||= include_members ? members_array : iris_from_members
31
+ @members ||= raw_members
33
32
  end
34
33
 
35
34
  def members_iri
@@ -43,7 +42,9 @@ module LinkedRails
43
42
  end
44
43
 
45
44
  def preview_includes
46
- include_members ? {member_sequence: :members} : %i[member_sequence]
45
+ return {member_sequence: {}} unless association_class.include_in_collection?
46
+
47
+ {member_sequence: {members: association_class.preview_includes}}
47
48
  end
48
49
 
49
50
  def title
@@ -61,39 +62,6 @@ module LinkedRails
61
62
  @arel_table ||= association_class.arel_table
62
63
  end
63
64
 
64
- def iris_from_members
65
- iris_from_scope || iris_from_records
66
- end
67
-
68
- def iris_from_records
69
- members_query.map(&:iri)
70
- end
71
-
72
- def iris_from_scope
73
- return unless iris_from_scope?
74
-
75
- association_class.try(:iris_from_scope, members_query)
76
- end
77
-
78
- def iris_from_scope?
79
- members_query.is_a?(ActiveRecord::Relation) && !polymorphic_collection?
80
- end
81
-
82
- def members_array
83
- members_query.to_a
84
- end
85
-
86
- def polymorphic_collection?
87
- column = association_class.inheritance_column
88
- polymorphic = association_class.columns_hash.include?(column)
89
- return false unless polymorphic
90
-
91
- return true if association_class.descends_from_active_record?
92
-
93
- members_query.where_values_hash.include?(column) &&
94
- members_query.where_values_hash[column] != association_class.to_s
95
- end
96
-
97
65
  def prepare_members(scope)
98
66
  if scope.respond_to?(:preload) && association_class.try(:includes_for_serializer)
99
67
  scope = scope.preload(association_class.includes_for_serializer)
@@ -101,6 +69,10 @@ module LinkedRails
101
69
  scope
102
70
  end
103
71
 
72
+ def raw_members
73
+ @raw_members ||= members_query.to_a
74
+ end
75
+
104
76
  class << self
105
77
  def iri
106
78
  [super, Vocab.as.CollectionPage]