Class: Right::FilterParametersExtractor

Inherits:
Object
  • Object
show all
Defined in:
lib/right/filter_parameters_extractor.rb

Overview

User provided filters syntax:

* `{ 'name_eq' => 'Martin' }` - name is equal to Martin
* `{ 'name_in' => 'Martin,Bob' }` - name is either Martin or Bob

This middleware parses filters hash and builds Parameter array If user passes not defined filter, it yields to UndefinedParameter, so you may validate it.

See Also:

Instance Method Summary collapse

Constructor Details

#initialize(app, parameters_definition) ⇒ FilterParametersExtractor

Returns a new instance of FilterParametersExtractor.

Parameters:



16
17
18
19
# File 'lib/right/filter_parameters_extractor.rb', line 16

def initialize(app, parameters_definition)
  @app = app
  @parameters_definition = parameters_definition
end

Instance Method Details

#call(env) ⇒ <{:filter => <Right::FilterParameter>, []}]

Returns <=> <Right::FilterParameter>, []].

Parameters:

  • env (<{:filter => Hash}, []>)
    • first element is a scope to be filtered

    • second is a hash with user provided filters

Returns:



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/right/filter_parameters_extractor.rb', line 26

def call(env)
  params, errors = env

  provided_parameters = Hash(params[:filter]).each_with_object(FilterParameters.new) do |(name, value), parameters|
    type_casted_value = type_cast_value(name, value)
    parameters << extract_parameter(name, type_casted_value)
  end

  not_provided_parameters = parameters_definition - provided_parameters.map(&:definition)

  undefined_parameters = not_provided_parameters.map do |definition|
    FilterParameter.new(nil, nil, definition)
  end

  # Keep even undefined parameters to validate required ones
  filters = provided_parameters + undefined_parameters

  app.call([params.merge(filter: filters), errors])
end