Sha256: 25e2d92b57d332df241d780ee8d002987327ec9f0034a45e3feb93d440fbaf54

Contents?: true

Size: 1.72 KB

Versions: 9

Compression:

Stored size: 1.72 KB

Contents

require 'might/sort_undefined_parameter'
require 'might/sort_parameter'

module Might
  # 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.
  #
  class SortParametersExtractor
    # @param app [#call]
    # @param parameters_definition [Set<Might::SortParameterDefinition>]
    def initialize(app, parameters_definition)
      @app = app
      @parameters_definition = parameters_definition
    end

    # @param env [<String, []>]
    #   * first element is a scope to be sorted
    #   * second is a String with user provided sortings
    # @return [<<Might::RansackableSort::SortParameter, []>]
    #
    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

    attr_reader :parameters_definition, :app

    def extract_parameter(name, direction)
      definition = parameters_definition.detect { |d| d.as == name } || SortUndefinedParameter.new(name)
      SortParameter.new(direction, definition)
    end

    def sort_order(params)
      String(params).split(',').map do |attribute|
        sorting_for(attribute)
      end
    end

    def sorting_for(field)
      if field.start_with?('-')
        [field.delete('-'), 'desc']
      else
        [field, 'asc']
      end
    end
  end
end

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
might-0.7.1 lib/might/sort_parameters_extractor.rb
might-0.7.0 lib/might/sort_parameters_extractor.rb
might-0.6.0 lib/might/sort_parameters_extractor.rb
might-0.5.2 lib/might/sort_parameters_extractor.rb
might-0.5.1 lib/might/sort_parameters_extractor.rb
might-0.5.0 lib/might/sort_parameters_extractor.rb
might-0.4.0 lib/might/sort_parameters_extractor.rb
might-0.3.1 lib/might/sort_parameters_extractor.rb
might-0.3.0 lib/might/sort_parameters_extractor.rb