class Might::SortParametersExtractor

User provided sorting syntax:

* `name` - sort by name
* `-name` - sort by name in reversed order
* `-name,created_at` - sort by name in reversed order, and then sort by created_at

This middleware parses sorting string and builds Parameter array @see Might::Sort::Parameter

If user passes not defined sort order, it yields to `UndefinedParameter`, so you may validate it.

Attributes

app[R]
parameters_definition[R]

Public Class Methods

new(app, parameters_definition) click to toggle source

@param app [#call] @param parameters_definition [Set<Might::SortParameterDefinition>]

# File lib/might/sort_parameters_extractor.rb, line 17
def initialize(app, parameters_definition)
  @app = app
  @parameters_definition = parameters_definition
end

Public Instance Methods

call(env) click to toggle source

@param env [<String, []>]

* first element is a scope to be sorted
* second is a String with user provided sortings

@return [<<Might::RansackableSort::SortParameter, []>]

# File lib/might/sort_parameters_extractor.rb, line 27
def call(env)
  params, errors = env

  sort_params = sort_order(params[:sort]).map do |(attribute, direction)|
    extract_parameter(attribute, direction)
  end

  app.call([params.merge(sort: sort_params), errors])
end

Private Instance Methods

extract_parameter(name, direction) click to toggle source
# File lib/might/sort_parameters_extractor.rb, line 41
def extract_parameter(name, direction)
  definition = parameters_definition.detect { |d| d.as == name } || SortUndefinedParameter.new(name)
  SortParameter.new(direction, definition)
end
sort_order(params) click to toggle source
# File lib/might/sort_parameters_extractor.rb, line 46
def sort_order(params)
  String(params).split(',').map do |attribute|
    sorting_for(attribute)
  end
end
sorting_for(field) click to toggle source
# File lib/might/sort_parameters_extractor.rb, line 52
def sorting_for(field)
  if field.start_with?('-')
    [field.delete('-'), 'desc']
  else
    [field, 'asc']
  end
end