Sha256: 59c5f14f1c85b7419343b499cfd5b77c74a839ba37e07981190cc328cf3a4485

Contents?: true

Size: 1.92 KB

Versions: 5

Compression:

Stored size: 1.92 KB

Contents

class RESTFramework::BaseFilter
  def initialize(controller:)
    @controller = controller
  end

  def get_filtered_data(data)
    raise NotImplementedError
  end
end


# A simple filtering backend that supports filtering a recordset based on fields defined on the
# controller class.
class RESTFramework::ModelFilter < RESTFramework::BaseFilter
  # Filter params for keys allowed by the current action's filterset_fields/fields config.
  def _get_filter_params
    fields = @controller.class.filterset_fields&.map(&:to_s) || @controller.send(:get_fields)
    return @controller.request.query_parameters.select { |p|
      fields.include?(p)
    }.to_h.symbolize_keys  # convert from HashWithIndifferentAccess to Hash w/keys
  end

  # Filter data according to the request query parameters.
  def get_filtered_data(data)
    filter_params = self._get_filter_params
    unless filter_params.blank?
      return data.where(**filter_params)
    end

    return data
  end
end


# A filter backend which handles ordering of the recordset.
class RESTFramework::ModelOrderingFilter < RESTFramework::BaseFilter
  # Convert ordering string to an ordering configuration.
  def _get_ordering
    return nil unless @controller.class.ordering_query_param

    order_string = @controller.params[@controller.class.ordering_query_param]
    unless order_string.blank?
      return order_string.split(',').map { |field|
        if field[0] == '-'
          [field[1..-1].to_sym, :desc]
        else
          [field.to_sym, :asc]
        end
      }.to_h
    end

    return nil
  end

  # Order data according to the request query parameters.
  def get_filtered_data(data)
    ordering = self._get_ordering
    if ordering && !ordering.empty?
      return data.order(_get_ordering)
    end
    return data
  end
end


# TODO: implement searching within fields rather than exact match filtering (ModelFilter)
# class RESTFramework::ModelSearchFilter < RESTFramework::BaseFilter
# end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
rest_framework-0.2.4 lib/rest_framework/filters.rb
rest_framework-0.2.3 lib/rest_framework/filters.rb
rest_framework-0.2.2 lib/rest_framework/filters.rb
rest_framework-0.2.1 lib/rest_framework/filters.rb
rest_framework-0.2.0 lib/rest_framework/filters.rb