Current section
Files
Jump to
Current section
Files
lib/ckan_client.ex
defmodule CKAN.Client do
alias Poison, as: JSON
defstruct [
server: "", key: ""
]
functions = [
{:get, :package_show, []},
{:get, :package_list, []},
{:get, :organization_show, []},
{:get, :organization_list, []},
{:get, :group_show, []},
{:get, :group_list, []},
{:get, :resource_show, []},
{:get, :resource_view_show, []},
{:get, :resource_view_list, []},
{:get, :resource_status_show, []},
{:get, :revision_show, []},
{:get, :group_package_show, []},
{:get, :tag_show, []},
{:get, :tag_list, []},
{:get, :user_show, []},
{:get, :user_list, []},
{:get, :package_search, []},
# Requires an authed user
{:get, :organization_list_for_user, []},
{:post, :package_create, %{}}
]
def new(server, api_key \\ nil) do
%__MODULE__{:server=>server <> "/api/3/action/", :key=>api_key}
end
def close(pid) do
end
######################################################################
# Generate functions to call
######################################################################
for {method, name, args} <- functions do
def unquote(name)(client, args) do
process(client, {unquote(method), unquote(to_string(name)), args})
end
end
defp keywords_to_querystring(keywords) do
qs = keywords
|> Enum.map(fn {k,v}->
"#{to_string(k)}=#{v}"
end)
|> Enum.join("&")
case String.length(qs) do
0 -> ""
_ -> "?" <> qs
end
end
def process(client, {:get, function, args}) do
qs = keywords_to_querystring(args)
response = HTTPotion.get client.server <> to_string(function) <> qs, [timeout: 10_000,
headers: get_headers_from_state(client)]
{:ok, result} = JSON.decode(response.body, keys: :atoms)
result
end
def process(client, {:post, function, args}) do
headers = get_headers_from_state(client)
host = client.server <> function
response = HTTPotion.post host, [body: JSON.encode!(args), headers: headers, timeout: 10_000]
{:ok, result} = JSON.decode(response.body, keys: :atoms)
result
end
defp get_headers_from_state(client) do
headers = case client.key do
nil -> []
k -> ["Authorization": k]
end
end
end