Class: LinkedRails::Collection

Inherits:
Object
  • Object
show all
Includes:
ActiveModel::Model, Configuration, Filterable, Iri, IriMapping, Sortable, Model::Actionable, Model::Iri
Defined in:
app/models/linked_rails/collection.rb,
app/models/linked_rails/collection/iri.rb,
app/models/linked_rails/collection/view.rb,
app/models/linked_rails/collection/filter.rb,
app/models/linked_rails/collection/sorting.rb,
app/models/linked_rails/collection/infinite.rb,
app/models/linked_rails/collection/sortable.rb,
app/models/linked_rails/collection/paginated.rb,
app/models/linked_rails/collection/filterable.rb,
app/models/linked_rails/collection/iri_mapping.rb,
app/models/linked_rails/collection/filter_field.rb,
app/models/linked_rails/collection/configuration.rb,
app/models/linked_rails/collection/filter_option.rb,
app/models/linked_rails/collection/infinite_view.rb,
app/policies/linked_rails/collection/view_policy.rb,
app/models/linked_rails/collection/paginated_view.rb,
app/serializers/linked_rails/collection/view_serializer.rb,
app/serializers/linked_rails/collection/filter_serializer.rb,
app/serializers/linked_rails/collection/sorting_serializer.rb,
app/serializers/linked_rails/collection/filter_field_serializer.rb,
app/serializers/linked_rails/collection/filter_option_serializer.rb

Overview

rubocop:disable Metrics/ClassLength

Defined Under Namespace

Modules: Configuration, Filterable, Infinite, Iri, IriMapping, Paginated, Sortable Classes: Filter, FilterField, FilterFieldSerializer, FilterOption, FilterOptionSerializer, FilterSerializer, InfiniteView, PaginatedView, Sorting, SortingSerializer, View, ViewPolicy, ViewSerializer

Constant Summary

Constants included from Iri

Iri::DEFAULT_IRI_TEMPLATE_KEYS

Instance Attribute Summary collapse

Attributes included from Sortable

#sort, #sort_options

Attributes included from Filterable

#filter, #unfiltered_collection

Instance Method Summary collapse

Methods included from Sortable

#default_before_value, #parsed_sort_values, #primary_key_sorting, #sorted?, #sorted_association, #sortings

Methods included from Iri

#iri_opts

Methods included from Filterable

#filter_fields, #filtered?, #filters, #unfiltered

Methods included from Model::Iri

#anonymous_iri, #anonymous_iri?, #iri, #iri_elements, #iri_opts, #rdf_type, #reload, #root_relative_iri, #route_fragment

Methods included from Model::Actionable

#action, #action_triples, #collection_actions, #favorite_actions

Constructor Details

#initialize(**opts) ⇒ Collection

Returns a new instance of Collection.



34
35
36
37
38
39
40
41
42
43
# File 'app/models/linked_rails/collection.rb', line 34

def initialize(**opts)
  opts = opts.with_indifferent_access

  %i[association_class iri_template].each do |key|
    raise("No #{key} given") if opts[key].blank?
  end
  opts[:route_key] ||= opts[:association_class].collection_route_key

  super
end

Instance Attribute Details

#association_base=(value) ⇒ Object (writeonly)

Sets the attribute association_base

Parameters:

  • value

    the value to set the attribute association_base to.



30
31
32
# File 'app/models/linked_rails/collection.rb', line 30

def association_base=(value)
  @association_base = value
end

#nameObject

Returns the value of attribute name.



29
30
31
# File 'app/models/linked_rails/collection.rb', line 29

def name
  @name
end

#policyObject

Returns the value of attribute policy.



29
30
31
# File 'app/models/linked_rails/collection.rb', line 29

def policy
  @policy
end

#user_contextObject

Returns the value of attribute user_context.



29
30
31
# File 'app/models/linked_rails/collection.rb', line 29

def user_context
  @user_context
end

#viewObject

Returns the value of attribute view.



29
30
31
# File 'app/models/linked_rails/collection.rb', line 29

def view
  @view
end

#viewsObject



136
137
138
# File 'app/models/linked_rails/collection.rb', line 136

def views
  @views || [default_view]
end

Instance Method Details

#action_list(user_context) ⇒ Object



45
46
47
48
49
50
51
# File 'app/models/linked_rails/collection.rb', line 45

def action_list(user_context)
  @action_list ||= {}
  @action_list[user_context] ||= association_class.try(:action_list)&.new(
    resource: self,
    user_context: user_context
  )
end

#actions(user_context = nil) ⇒ Object



53
54
55
56
57
# File 'app/models/linked_rails/collection.rb', line 53

def actions(user_context = nil)
  return [] if action_list(user_context).nil?

  super
end

#apply_scope(association) ⇒ Object



59
60
61
62
63
# File 'app/models/linked_rails/collection.rb', line 59

def apply_scope(association)
  return association if policy_scope == false

  policy_scope.new(user_context, association).resolve
end

#as_json(options = {}) ⇒ Object

prevents a ‘stack level too deep`



66
67
68
# File 'app/models/linked_rails/collection.rb', line 66

def as_json(options = {})
  super(options.merge(except: %w[association_class unfiltered_collection collection]))
end

#build_childObject

rubocop:disable Metrics/AbcSize



70
71
72
73
74
75
76
77
78
79
80
81
# File 'app/models/linked_rails/collection.rb', line 70

def build_child # rubocop:disable Metrics/AbcSize
  child =
    parent&.build_child(association_class, user_context: user_context) ||
    association_class.build_new(parent: parent, user_context: user_context)

  parser = LinkedRails::ParamsParser.new(user_context: user_context, params: {filter: @filter})
  permitted_child_keys = Pundit.policy(user_context, child)&.permitted_attributes || []
  permitted_attributes_from_filters = parser.attributes_from_filters(association_class).permit(permitted_child_keys)

  child.assign_attributes(permitted_attributes_from_filters)
  child
end

#columnsObject



83
84
85
86
87
# File 'app/models/linked_rails/collection.rb', line 83

def columns
  columns_list = association_class.try(:defined_columns).try(:[], table_type)

  RDF::List[*columns_list] if columns_list.present?
end

#default_viewObject



89
90
91
# File 'app/models/linked_rails/collection.rb', line 89

def default_view
  @default_view ||= view_with_opts(default_view_opts)
end

#firstObject



93
94
95
96
97
98
99
100
# File 'app/models/linked_rails/collection.rb', line 93

def first
  case type
  when :paginated
    iri_with_root(root_relative_iri(page: 1))
  when :infinite
    iri_with_root(root_relative_iri(before: default_before_value))
  end
end

#inspectObject



102
103
104
# File 'app/models/linked_rails/collection.rb', line 102

def inspect
  "#<#{association_class}Collection iri:#{iri}>"
end

#lastObject



106
107
108
# File 'app/models/linked_rails/collection.rb', line 106

def last
  iri_with_root(root_relative_iri(page: [total_page_count, 1].max)) if type == :paginated && total_page_count
end

#new_child(options) ⇒ Object



110
111
112
113
# File 'app/models/linked_rails/collection.rb', line 110

def new_child(options)
  attrs = options.merge(new_child_values)
  self.class.new(**attrs)
end

#preview_includesObject



115
116
117
118
119
120
121
122
# File 'app/models/linked_rails/collection.rb', line 115

def preview_includes
  {
    default_view: default_view.preview_includes,
    filter_fields: :options,
    filters: [],
    sortings: []
  }
end

#total_countObject



124
125
126
# File 'app/models/linked_rails/collection.rb', line 124

def total_count
  @total_count ||= association_base.try(:total_count) || unscoped_association.count
end

#total_page_countObject



128
129
130
# File 'app/models/linked_rails/collection.rb', line 128

def total_page_count
  (total_count / page_size.to_f).ceil if total_count
end

#unscoped_associationObject



132
133
134
# File 'app/models/linked_rails/collection.rb', line 132

def unscoped_association
  association_base.respond_to?(:unscope) ? association_base.unscope(:select) : association_base
end

#view_with_opts(opts) ⇒ Object



140
141
142
143
144
145
# File 'app/models/linked_rails/collection.rb', line 140

def view_with_opts(opts)
  @views ||= []
  view = collection_view_class.new(**{collection: self, type: type}.merge(opts))
  @views << view
  view
end