tiagopog/jsonapi-utils

Support for sorting and pagination from JR

RoM4iK opened this issue · 0 comments

Since https://github.com/cerebris/jsonapi-resources/releases/tag/v0.9.4 JR allows to filter records on nested relationship values while JU allows filtering only by where condition.

Are there any reasons why you decided to rewrite filter/sort/pagination workflow?

I've played a little with monkey patching, and looks like using filters from JR is possible.

Here is my code, it's working within my application.
Note: it breaks core functionality for usage with non-AR objects, and can break something else, be careful if you want to use it.

module JSONAPI::Utils
  module Response
    module Formatters
      def jsonapi_format(object, options = {})
        operations = @request.operations
        unless JSONAPI.configuration.resource_cache.nil?
          operations.each {|op| op.options[:cache_serializer] = resource_serializer }
        end
        if object.respond_to?(:to_ary)
          operations.each { |op| op.options[:context][:records] = object }
          results = process_operations(operations)
        else
          results = JSONAPI::OperationResults.new
          record = turn_into_resource(object, options)
          results.add_result(JSONAPI::ResourceOperationResult.new(:ok, record))
        end
        @_response_document = create_response_document(results)
        @_response_document.contents
      end
    end
  end
end


module JSONAPI
  class Resource
    class << self
      def records(options = {})
        options.dig(:context, :records) || _model_class.all
      end

      def apply_included_resources_filters(records, options = {})
        include_directives = options[:include_directives]
        return records unless include_directives
        related_directives = include_directives.include_directives.fetch(:include_related)
        related_directives.reduce(records) do |memo, (relationship_name, config)|
          relationship = _relationship(relationship_name)
          next memo unless relationship
          filtering_resource = relationship.resource_klass

          # Don't try to merge where clauses when relation isn't already being joined to query.
          next memo unless config[:include_in_join]

          filters = config[:include_filters]
          next memo unless filters

          rel_records = filtering_resource.apply_filters(filtering_resource.records({}), filters, options).references(relationship_name)
          memo.merge(rel_records)
        end
      end
    end
  end
end