sharetribe/sharetribe

View on GitHub
app/utils/discovery_utils.rb

Summary

Maintainability
B
4 hrs
Test Coverage
module DiscoveryUtils

  module_function

  def listing_query_params(original)
    location_params =
      if(original[:latitude].present? && original[:longitude].present?)
        { :'search[lat]' => original[:latitude],
          :'search[lng]' => original[:longitude],
          :'search[distance_unit]' => original[:distance_unit],
          :'search[scale]' => original[:scale],
          :'search[offset]' => original[:offset],
          :'filter[distance_max]' => original[:distance_max] }
      else
        {}
      end

    custom_fields = Maybe(original[:fields]).map { |fields|
      fields.select { |f| [:numeric_range, :selection_group].include?(f[:type]) }
      fields.map { |f|
        if f[:type]  == :numeric_range
          [:"custom[#{f[:id]}]", "double:#{f[:value].first}:#{f[:value].last}"]
        else
          [:"custom[#{f[:id]}]", "opt:#{f[:operator]}:#{f[:value].join(",")}"]
        end
      }.to_h
    }.or_else({})

    {
     :marketplace_id => original[:marketplace_id],
     :'search[keywords]' => original[:keywords],
     :'page[number]' => original[:page],
     :'page[size]' => original[:per_page],
     :'filter[price_min]' => Maybe(original[:price_cents]).map{ |p| p.min }.or_else(nil),
     :'filter[price_max]' => Maybe(original[:price_cents]).map{ |p| p.max }.or_else(nil),
     :'filter[omit_closed]' => !original[:include_closed],
     :'filter[listing_shape_ids]' => Maybe(original[:listing_shape_ids]).join(",").or_else(nil),
     :'filter[category_ids]' => Maybe(original[:categories]).join(",").or_else(nil),
     :'search[locale]' => original[:locale],
     :sort => original[:sort]
    }.merge(location_params).merge(custom_fields).compact
  end
end