Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 26 additions & 3 deletions lib/couchdb_connector/url_helper.ex
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,32 @@ defmodule Couchdb.Connector.UrlHelper do
@doc """
Produces the URL to a specific view from a given design document.
"""
@spec view_url(Types.db_properties, String.t, String.t) :: String.t
def view_url db_props, design, view do
"#{design_url(db_props, design)}/_view/#{view}"
@spec view_url(Types.db_properties, String.t, String.t, Keyword.t) :: String.t
def view_url db_props, design, view, args \\ [] do
"#{design_url(db_props, design)}/_view/#{view}#{query(args)}"
end

defp to_bin(i) when is_integer(i), do: Integer.to_string(i)
defp to_bin(f) when is_float(f), do: Float.to_string(f)
defp to_bin(a) when is_atom(a), do: Atom.to_string(a)
defp to_bin(b) when is_binary(b), do: b

defp prepare({key, value}) do
"#{prepare_value(key)}=#{prepare_value(value)}"
end

defp prepare_value(value) do
value
|> to_bin()
|> URI.encode_www_form()
end

defp query([]), do: ""
defp query(args) do
query = args
|> Enum.map(&(prepare(&1)))
|> Enum.join("&")
"?#{query}"
end

@doc """
Expand Down
10 changes: 5 additions & 5 deletions lib/couchdb_connector/view.ex
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,12 @@ defmodule Couchdb.Connector.View do
@doc """
Returns everything found for the given view in the given design document.
"""
@spec fetch_all(Types.db_properties, String.t, String.t) :: {:ok, String.t} | {:error, String.t}
def fetch_all(db_props, design, view) do
@spec fetch_all(Types.db_properties, String.t, String.t, Keyword.t) :: {:ok, String.t} | {:error, String.t}
def fetch_all(db_props, design, view, args \\ []) do
db_props
|> UrlHelper.view_url(design, view)
|> HTTPoison.get!
|> Handler.handle_get
|> UrlHelper.view_url(design, view, args)
|> HTTPoison.get!()
|> Handler.handle_get()
end

@doc """
Expand Down
10 changes: 10 additions & 0 deletions test/couchdb_connector/url_helper_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,14 @@ defmodule Couchdb.Connector.UrlHelperTest do
assert UrlHelper.query_path(url, key, atom) ==
"http://localhost/view_name?key=\"%21%2A%27%28%29%3B%3A%40%26%3D%2B%24%2C%2F%3F%23%5B%5D\"&stale=ok"
end

test "view_url/3 with args" do
dbprops = %{protocol: "http", hostname: "localhost", port: 80, database: "myapp"}
design = "users"
view = "active_users"
args = [limit: 10, skip: 5] # simulate a 5 elements page and page 2

assert UrlHelper.view_url(dbprops, design, view, args) ==
"http://localhost:80/myapp/_design/users/_view/active_users?limit=10&skip=5"
end
end