Current section
Files
Jump to
Current section
Files
lib/backends/http/server.ex
defmodule Exkad.Backends.HTTP.Server do
defmodule Server do
alias Exkad.Backends.Simple
use Plug.Router
import Plug.Conn
alias Exkad.Node.Descriptor, as: ND
require Logger
plug :match
plug :dispatch
def json({:ok, res}) do
json(%{"ok" => res})
end
def json({:value, {:ok, key}}) do
json(%{"value" => %{"ok" => key}})
end
def json(res) do
Poison.encode!(res)
end
def finish(res, conn, status \\ 200) do
conn
|> put_resp_content_type("application/json")
|> send_resp(status, res)
end
def to_desc(conn) do
d = Enum.into(conn.req_headers, %{})
%ND{id: d["fromid"], loc: d["fromloc"]}
end
get "/ping" do
%{node: node} = conn.plug_options
Logger.debug "PING #{node}"
Simple.ping(node, to_desc(conn))
|> json
|> finish(conn)
end
get "/find/:node_id" do
%{node: node} = conn.plug_options
[_, to_find_id] = conn.path_info
from_desc = to_desc(conn)
Logger.debug "FIND id #{to_find_id} from #{node}"
Simple.find(node, to_find_id, from_desc)
|> json
|> finish(conn)
end
put "/item" do
%{node: node} = conn.plug_options
{:ok, body, conn} = read_body(conn)
Logger.debug "PUT item to #{node}"
Simple.put(node, body)
|> json
|> finish(conn)
end
get "/item/:key" do
%{node: node} = conn.plug_options
[_, key] = conn.path_info
Logger.debug "GET #{key} from #{node}"
Simple.get(node, key)
|> json
|> finish(conn)
end
put "/item/:ptr/meta" do
%{node: node} = conn.plug_options
[_, ptr, _] = conn.path_info
{:ok, term, conn} = read_body(conn)
Logger.debug "PUT_META #{term} --> #{ptr} in #{node}"
Simple.put_meta(node, term, ptr)
|> json
|> finish(conn)
end
get "/search/:key" do
%{node: node} = conn.plug_options
[_, key] = conn.path_info
Logger.debug "SEARCH for #{key} on #{node}"
Simple.search(node, key)
|> json
|> finish(conn)
end
match _ do
path = Enum.join(conn.path_info, "/")
Logger.debug "Unknown endpoint #{path}"
%{"exkad" => "unknown endpoint"}
|> json
|> finish(conn)
end
end
import Plug.Conn
def init(options) do
Enum.into(options, %{})
end
def call(conn, options) do
Map.put(conn, :plug_options, options) |> Server.call(options)
end
end