Current section
Files
Jump to
Current section
Files
lib/ckan_client.ex
defmodule CKAN.Client do
use GenServer
alias Poison, as: JSON
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, []},
{:post, :package_create, %{}}
]
def new(server, api_key \\ nil) do
start_link(%{:server=>server <> "/api/3/action/",
:key=>api_key})
end
def start_link(args\\%{}) do
GenServer.start_link(__MODULE__, args)
end
######################################################################
# Generate functions to call
######################################################################
for {method, name, args} <- functions do
def unquote(name)(pid, args) do
GenServer.call(pid, {unquote(method), unquote(name), args})
end
end
defp keywords_to_querystring(keywords) do
qs = keywords
|> Enum.map(fn {k,v}->
"#{k}=#{v}"
end)
|> Enum.join("&")
case String.length(qs) do
0 -> ""
q -> "?" <> qs
end
end
######################################################################
# Genserver callbacks ..
######################################################################
def init(state) do
{:ok, state}
end
def handle_call({:get, function, args}, _from, state) do
qs = keywords_to_querystring(args)
response = HTTPotion.get state.server <> to_string(function) <> qs
{:ok, result} = JSON.decode(response.body, keys: :atoms)
{:reply, result, state}
end
def handle_call({:post, function, args}, _from, state) do
IO.inspect args
IO.inspect function
{:reply, "POST Result", state}
end
end