Module: JsonapiCompliable::Base
- Extended by:
- ActiveSupport::Concern
- Includes:
- Deserializable
- Defined in:
- lib/jsonapi_compliable/base.rb
Defined Under Namespace
Modules: ClassMethods
Constant Summary collapse
- MAX_PAGE_SIZE =
1_000
Instance Method Summary collapse
-
#default_jsonapi_render_options ⇒ Object
render_jsonapi(foo) equivalent to render jsonapi: foo, default_jsonapi_render_options.
- #default_page_number ⇒ Object
- #default_page_size ⇒ Object
- #default_sort ⇒ Object
- #force_includes? ⇒ Boolean
-
#forced_includes(data = nil) ⇒ Object
TODO: This nastiness likely goes away once jsonapi standardizes a spec for nested relationships.
- #jsonapi_scope(scope, filter: true, includes: true, paginate: true, extra_fields: true, sort: true) ⇒ Object
- #parse_fieldsets! ⇒ Object
- #render_jsonapi(scope, opts = {}) ⇒ Object
- #reset_scope_flag ⇒ Object
Methods included from Deserializable
Instance Method Details
#default_jsonapi_render_options ⇒ Object
render_jsonapi(foo) equivalent to render jsonapi: foo, default_jsonapi_render_options
72 73 74 75 |
# File 'lib/jsonapi_compliable/base.rb', line 72 def {}.tap do || end end |
#default_page_number ⇒ Object
16 17 18 |
# File 'lib/jsonapi_compliable/base.rb', line 16 def default_page_number 1 end |
#default_page_size ⇒ Object
20 21 22 |
# File 'lib/jsonapi_compliable/base.rb', line 20 def default_page_size 20 end |
#default_sort ⇒ Object
24 25 26 |
# File 'lib/jsonapi_compliable/base.rb', line 24 def default_sort 'id' end |
#force_includes? ⇒ Boolean
98 99 100 101 |
# File 'lib/jsonapi_compliable/base.rb', line 98 def force_includes? %w(PUT PATCH POST).include?(request.method) and raw_params.try(:[], :data).try(:[], :relationships).present? end |
#forced_includes(data = nil) ⇒ Object
TODO: This nastiness likely goes away once jsonapi standardizes a spec for nested relationships. See: https://github.com/json-api/json-api/issues/1089
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
# File 'lib/jsonapi_compliable/base.rb', line 80 def forced_includes(data = nil) return unless force_includes? data = raw_params[:data] unless data {}.tap do |forced| (data[:relationships] || {}).each_pair do |relation_name, relation| if relation[:data].is_a?(Array) forced[relation_name] = {} relation[:data].each do |datum| forced[relation_name].deep_merge!(forced_includes(datum)) end else forced[relation_name] = forced_includes(relation[:data]) end end end end |
#jsonapi_scope(scope, filter: true, includes: true, paginate: true, extra_fields: true, sort: true) ⇒ Object
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
# File 'lib/jsonapi_compliable/base.rb', line 28 def jsonapi_scope(scope, filter: true, includes: true, paginate: true, extra_fields: true, sort: true) scope = JsonapiCompliable::Scope::DefaultFilter.new(self, scope).apply scope = JsonapiCompliable::Scope::Filter.new(self, scope).apply if filter scope = JsonapiCompliable::Scope::ExtraFields.new(self, scope).apply if extra_fields scope = JsonapiCompliable::Scope::Sideload.new(self, scope).apply if includes scope = JsonapiCompliable::Scope::Sort.new(self, scope).apply if sort # This is set before pagination so it can be re-used for stats @_jsonapi_scope = scope scope = JsonapiCompliable::Scope::Paginate.new(self, scope).apply if paginate scope end |
#parse_fieldsets! ⇒ Object
49 50 51 52 |
# File 'lib/jsonapi_compliable/base.rb', line 49 def parse_fieldsets! Util::FieldParams.parse!(params, :fields) Util::FieldParams.parse!(params, :extra_fields) end |
#render_jsonapi(scope, opts = {}) ⇒ Object
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
# File 'lib/jsonapi_compliable/base.rb', line 54 def render_jsonapi(scope, opts = {}) scoped = Util::Scoping.apply?(self, scope, opts.delete(:scope)) ? jsonapi_scope(scope) : scope = [:include] = forced_includes || Util::IncludeParams.scrub(self) [:jsonapi] = JsonapiCompliable::Util::Pagination.zero?(params) ? [] : scoped [:fields] = Util::FieldParams.fieldset(params, :fields) if params[:fields] [:meta] ||= {} .merge!(opts) [:meta][:stats] = Stats::Payload.new(self, scoped).generate if params[:stats] [:expose] ||= {} [:expose][:context] = self [:expose][:extra_fields] = Util::FieldParams.fieldset(params, :extra_fields) if params[:extra_fields] render() end |
#reset_scope_flag ⇒ Object
45 46 47 |
# File 'lib/jsonapi_compliable/base.rb', line 45 def reset_scope_flag @_jsonapi_scope = nil end |