Skip to content

Nested operation Filtering

Vladislav Trotsenko edited this page Sep 30, 2019 · 5 revisions

Synopsis

Provides JSON API filtering with all_filters as default matcher

HTTP request example: GET /users?filter[email-eq][email protected]&filter[name-cont]=son&match=any_filters

Code

Before using this nested operation you should set ctx[:available_columns] with ColumnsBuilder:

ctx[:available_columns] = Api::V1::Lib::Service::JsonApi::ColumnsBuilder.call(
  [
    { name: :attr_1, filterable: true, sortable: false }, # by default type: :string
    { name: :attr_1, type: :number, filterable: true, sortable: true }
  ]
)
module Api::V1::Lib::Operation
  class Filtering < ApplicationOperation
    step :filter_params_passed?, Output(:failure) => End(:success)
    step Macro::Contract::Schema(Api::V1::Lib::Contract::FilteringPreValidation, name: :uri_query)
    step Contract::Validate(name: :uri_query)
    step :matcher_options # if match param empty ctx[:matcher_options] = 'all_filters'
    step :set_validation_dependencies
    step Macro::Contract::Schema(
      Api::V1::Lib::Contract::FilteringValidation,
      inject: %i[available_filtering_columns column_type_dict],
      name: :uri_query
    )
    step Contract::Validate(name: :uri_query), id: :filtering_validation
    step :filter_options
  end
end

Used nested & macroses

Clone this wiki locally