Skip to content

Commit

Permalink
Merge pull request #7 from gadabout/feature/filtering
Browse files Browse the repository at this point in the history
Added filtering.
  • Loading branch information
Chris Dosé committed Oct 11, 2016
2 parents 3b4c3e4 + 6655156 commit a974aef
Show file tree
Hide file tree
Showing 5 changed files with 92 additions and 17 deletions.
2 changes: 2 additions & 0 deletions lib/lurch.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
require "lurch/relationship"
require "lurch/resource"

require "lurch/param_builder"
require "lurch/query"
require "lurch/changeset"
require "lurch/client"
require "lurch/store"
Expand Down
27 changes: 27 additions & 0 deletions lib/lurch/param_builder.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
module Lurch
class ParamBuilder
def initialize(params)
@params = Hash(params)
end

def encode
encode_value(@params)
end

private

def encode_value(value, key = nil)
case value
when Hash then value.map { |k, v| encode_value(v, append_key(key, k)) }.reject(&:empty?).join("&")
when Array then value.map { |v| encode_value(v, "#{key}[]") }.reject(&:empty?).join("&")
when nil then ""
else
"#{key}=#{CGI.escape(value.to_s)}"
end
end

def append_key(root_key, key)
root_key.nil? ? key : "#{root_key}[#{key}]"
end
end
end
56 changes: 56 additions & 0 deletions lib/lurch/query.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
module Lurch
class Query
def initialize(store)
@store = store
@filter = {}
@sort = {}
@page = {}
@include = {}
@fields = {}
end

def filter(params)
@filter = @filter.merge(params)
self
end

def from(type)
@type = Lurch.normalize_type(type)
self
end

def all
@store.load_from_url(resources_url)
end

def find(id)
@store.peek(@type, id) || @store.load_from_url(resource_url(id))
end

def to_params
ParamBuilder.new(
filter: @filter,
sort: @sort,
page: @page,
include: @include,
fields: @fields
).encode
end

private

def resources_url
uri = URI.parse("/#{Inflecto.dasherize(@type.to_s)}")
params = to_params
uri.query = params unless params.empty?
uri.to_s
end

def resource_url(id)
uri = URI.parse("#{resources_url}/#{id}")
params = to_params
uri.query = params unless params.empty?
uri.to_s
end
end
end
22 changes: 6 additions & 16 deletions lib/lurch/store.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,8 @@ def initialize(url:, authorization: "", request_id: nil)
@store = Hash.new { |hash, key| hash[key] = {} }
end

def find_all(type)
normalized_type = Lurch.normalize_type(type)
load_from_url(resources_url(normalized_type))
end

def find(type, id)
normalized_type = Lurch.normalize_type(type)
peek(normalized_type, id) || load_from_url(resource_url(normalized_type, id))
def from(type)
query.from(type)
end

def peek(type, id)
Expand Down Expand Up @@ -73,6 +67,10 @@ def resource_from_store(type, id)

attr_reader :client, :store

def query
Query.new(self)
end

def process_document(document)
stored_resources = store_resources(document)
resources = stored_resources.map do |stored_resource|
Expand Down Expand Up @@ -103,13 +101,5 @@ def store_resources(document)

primary_stored_resources
end

def resources_url(type)
"/#{Inflecto.dasherize(type.to_s)}"
end

def resource_url(type, id)
"#{resources_url(type)}/#{id}"
end
end
end
2 changes: 1 addition & 1 deletion lib/lurch/version.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
module Lurch
VERSION = "0.0.6".freeze
VERSION = "0.0.7".freeze
end

0 comments on commit a974aef

Please sign in to comment.