Current section
Files
Jump to
Current section
Files
lib/backends/http/client.ex
defmodule Exkad.Backends.HTTP.Client do
alias Exkad.Node.Descriptor, as: ND
require Logger
defmodule Client do
use HTTPotion.Base
end
defp headers(%ND{id: id, loc: loc}) do
["fromloc": loc, "fromid": id]
end
defp transfer_headers do
["Content-Type": "application/json"]
end
defp un_json("ok"), do: :ok
defp un_json(%{"ok" => res}) do
{:ok, res}
end
defp un_json(%{"value" => %{"ok" => payload}}) do
{:value, {:ok, payload}}
end
defp un_json(js), do: js
defp from_json(%HTTPotion.Response{body: body} = response) do
Poison.decode!(body) |> un_json
end
def dump(_), do: raise :not_implemented
def describe(_), do: raise :not_implemented
def rput(_, _, _), do: raise :not_implemented
def rget(_, _), do: raise :not_implemented
def ping(%ND{loc: server}, from_desc) do
Client.start
url = server <> "/ping"
Logger.debug("SEARCH #{url}")
Client.get(url, headers(from_desc)) |> from_json
end
def find(%ND{loc: server}, id, from_desc) do
Client.start
url = server <> "/find/#{id}"
Logger.debug("FIND #{url}")
Client.get(url, headers(from_desc))
|> (fn res -> res.body end).()
|> Poison.decode!(as: %{"ok" => [ND]})
|> un_json
end
def put(%ND{loc: server}, value) do
Client.start
url = server <> "/item"
Logger.debug("PUT #{url}")
Client.put(url, value, transfer_headers) |> from_json
end
def put_meta(%ND{loc: server}, term, ptr) do
Client.start
url = server <> "/item/#{ptr}/meta"
Logger.debug("PUT_META #{url}")
Client.put(url, term, transfer_headers) |> from_json
end
def search(%ND{loc: server}, key) do
Client.start
url = server <> "/search/#{key}"
Logger.debug("SEARCH #{url}")
Client.get(url) |> from_json
end
def get(%ND{loc: server}, key) do
Client.start
url = server <> "/item/#{key}"
Logger.debug("GET #{url}")
case Client.get(url) |> from_json do
{:value, {:ok, value}} ->
{:value, {:ok, value}}
err -> err
end
end
end