module CoreExtensions::HerWithQueryFilter

WARNING: monkey patch (github.com/remi/her/blob/master/lib/her/model/relation.rb#L34)

The `where` clause must be adapted to vindi requirements: atendimento.vindi.com.br/hc/pt-br/articles/204163150

Public Instance Methods

where(params = {}) click to toggle source

Add a query string parameter

@example

@users = User.where(contains: { name: 'Gandalf' })
# Fetched via GET "/users?query=name:Gandalf"

@example

@users = User.active.where(gt: { created_at: Time.zone.yesterday })
# Fetched via GET "/users?query=status=active created_at>2021-01-01"
# File lib/vindi/core_extensions/her_with_query_filter.rb, line 18
def where(params = {})
  return self if params.blank? && !@_fetch.nil?

  clone.tap do |r|
    r.params = r.params.merge(params)

    # Default params, as order and page number, will always be used.
    default_params = extract_default_params r.params

    # Query filters is joined into a single param called :query.
    query = [r.params.delete(:query), params_to_query(r.params)].compact.join " "

    r.params = { query: query }.merge(default_params)

    r.clear_fetch_cache!
  end
end

Private Instance Methods

extract_default_params(params) click to toggle source
# File lib/vindi/core_extensions/her_with_query_filter.rb, line 38
def extract_default_params(params)
  page        = params.delete(:page)        || 1
  per_page    = params.delete(:per_page)    || 25
  sort_by     = params.delete(:sort_by)     || :created_at
  sort_order  = params.delete(:sort_order)  || :desc

  {
    page: page,
    per_page: per_page,
    sort_by: sort_by,
    sort_order: sort_order
  }.delete_if { |_, v| v.nil? }
end
params_to_query(params) click to toggle source
# File lib/vindi/core_extensions/her_with_query_filter.rb, line 52
def params_to_query(params)
  params.map do |key, value|
    case key
    when :contains  then value.map { |k, v| "#{k}:#{v}" }.last
    when :gt        then value.map { |k, v| "#{k}>#{v}" }.last
    when :gteq      then value.map { |k, v| "#{k}>=#{v}" }.last
    when :lt        then value.map { |k, v| "#{k}<#{v}" }.last
    when :lteq      then value.map { |k, v| "#{k}<=#{v}" }.last
    when :not       then value.map { |k, v| "-#{k}:#{v}" }.last
    else
      value ? "#{key}=#{value}" : key
    end
  end.join(" ")
end