From e5cf559293209581b9fb5d33e85a9bea79040f5e Mon Sep 17 00:00:00 2001 From: Denis Talakevich Date: Fri, 13 May 2016 14:39:49 +0300 Subject: [PATCH] provide fields parameter from request to operation and from operation to resource_klass.find or resource_klass.find_by_key (when fetching data) --- lib/jsonapi/operation.rb | 31 ++++++++++++++++++++----------- lib/jsonapi/request.rb | 18 ++++++++++++------ 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/lib/jsonapi/operation.rb b/lib/jsonapi/operation.rb index f51307139..c848aa13b 100644 --- a/lib/jsonapi/operation.rb +++ b/lib/jsonapi/operation.rb @@ -14,7 +14,7 @@ def apply end class FindOperation < Operation - attr_reader :filters, :include_directives, :sort_criteria, :paginator + attr_reader :filters, :include_directives, :sort_criteria, :paginator, :fields def initialize(resource_klass, options = {}) super(resource_klass, options) @@ -22,6 +22,7 @@ def initialize(resource_klass, options = {}) @include_directives = options[:include_directives] @sort_criteria = options.fetch(:sort_criteria, []) @paginator = options[:paginator] + @fields = options[:fields] @transactional = false end @@ -52,7 +53,8 @@ def apply context: @context, include_directives: @include_directives, sort_criteria: @sort_criteria, - paginator: @paginator) + paginator: @paginator, + fields: @fields) options = {} if JSONAPI.configuration.top_level_links_include_pagination @@ -77,12 +79,13 @@ def apply end class ShowOperation < Operation - attr_reader :id, :include_directives + attr_reader :id, :include_directives, :fields def initialize(resource_klass, options = {}) super(resource_klass, options) @id = options.fetch(:id) @include_directives = options[:include_directives] + @fields = options[:fields] @transactional = false end @@ -91,7 +94,8 @@ def apply resource_record = @resource_klass.find_by_key(key, context: @context, - include_directives: @include_directives) + include_directives: @include_directives, + fields: @fields) return JSONAPI::ResourceOperationResult.new(:ok, resource_record) @@ -123,18 +127,19 @@ def apply end class ShowRelatedResourceOperation < Operation - attr_reader :source_klass, :source_id, :relationship_type + attr_reader :source_klass, :source_id, :relationship_type, :fields def initialize(resource_klass, options = {}) super(resource_klass, options) @source_klass = options.fetch(:source_klass) @source_id = options.fetch(:source_id) @relationship_type = options.fetch(:relationship_type) + @fields = options[:fields] @transactional = false end def apply - source_resource = @source_klass.find_by_key(@source_id, context: @context) + source_resource = @source_klass.find_by_key(@source_id, context: @context, fields: @fields) related_resource = source_resource.public_send(@relationship_type) @@ -146,7 +151,7 @@ def apply end class ShowRelatedResourcesOperation < Operation - attr_reader :source_klass, :source_id, :relationship_type, :filters, :sort_criteria, :paginator + attr_reader :source_klass, :source_id, :relationship_type, :filters, :sort_criteria, :paginator, :fields def initialize(resource_klass, options = {}) super(resource_klass, options) @@ -156,6 +161,7 @@ def initialize(resource_klass, options = {}) @filters = options[:filters] @sort_criteria = options[:sort_criteria] @paginator = options[:paginator] + @fields = options[:fields] @transactional = false end @@ -170,7 +176,7 @@ def page_count end def source_resource - @_source_resource ||= @source_klass.find_by_key(@source_id, context: @context) + @_source_resource ||= @source_klass.find_by_key(@source_id, context: @context, fields: @fields) end def records @@ -200,7 +206,8 @@ def apply related_resource = source_resource.public_send(@relationship_type, filters: @filters, sort_criteria: @sort_criteria, - paginator: @paginator) + paginator: @paginator, + fields: @fields) return JSONAPI::RelatedResourcesOperationResult.new(:ok, source_resource, @relationship_type, related_resource, options) @@ -210,11 +217,12 @@ def apply end class CreateResourceOperation < Operation - attr_reader :data + attr_reader :data, :fields def initialize(resource_klass, options = {}) super(resource_klass, options) @data = options.fetch(:data) + @fields = options[:fields] end def apply @@ -247,12 +255,13 @@ def apply end class ReplaceFieldsOperation < Operation - attr_reader :data, :resource_id + attr_reader :data, :resource_id, :fields def initialize(resource_klass, options = {}) super(resource_klass, options) @resource_id = options.fetch(:resource_id) @data = options.fetch(:data) + @fields = options[:fields] end def apply diff --git a/lib/jsonapi/request.rb b/lib/jsonapi/request.rb index 7977cd91f..f36f49ac9 100644 --- a/lib/jsonapi/request.rb +++ b/lib/jsonapi/request.rb @@ -295,7 +295,8 @@ def add_find_operation filters: @filters, include_directives: @include_directives, sort_criteria: @sort_criteria, - paginator: @paginator + paginator: @paginator, + fields: @fields ) end @@ -304,7 +305,8 @@ def add_show_operation @resource_klass, context: @context, id: @id, - include_directives: @include_directives + include_directives: @include_directives, + fields: @fields ) end @@ -323,7 +325,8 @@ def add_show_related_resource_operation(relationship_type) context: @context, relationship_type: relationship_type, source_klass: @source_klass, - source_id: @source_id + source_id: @source_id, + fields: @fields ) end @@ -336,7 +339,8 @@ def add_show_related_resources_operation(relationship_type) source_id: @source_id, filters: @source_klass.verify_filters(@filters, @context), sort_criteria: @sort_criteria, - paginator: @paginator + paginator: @paginator, + fields: @fields ) end @@ -359,7 +363,8 @@ def parse_add_operation(data) @operations.push JSONAPI::CreateResourceOperation.new( @resource_klass, context: @context, - data: data + data: data, + fields: @fields ) end rescue JSONAPI::Exceptions::Error => e @@ -622,7 +627,8 @@ def parse_single_replace_operation(data, keys, id_key_presence_check_required: t @resource_klass, context: @context, resource_id: key, - data: parse_params(data, updatable_fields) + data: parse_params(data, updatable_fields), + fields: @fields ) end