Files
dexi/lib/dexi_web/controllers/dead_drop_controller.ex
T

42 lines
1.4 KiB
Elixir

defmodule DexiWeb.DeadDropController do
use DexiWeb, :controller
alias Dexi.Grids
alias Dexi.Grids.DeadDrop
alias Dexi.GridsLoginHandler
def show(conn, %{"message_id" => message_id}) do
with {:ok, message} <- GridsLoginHandler.validate_message_id(message_id),
{:ok, network_id} <- Grids.network_id(),
{:ok, dead_drop} <- Grids.create_dead_drop(%{payload: message, network_id: network_id}) do
json(conn, dead_drop_data(dead_drop))
else
_error -> send_resp(conn, :not_found, "")
end
end
def login(conn, %{"message_id" => message_id} = params) do
with {:ok, message} <- GridsLoginHandler.validate_message_id(message_id),
{:ok, dead_drop} <- Grids.create_dead_drop(Map.put(params, "payload", message)),
{:ok, %DeadDrop{} = verified_dead_drop} <-
Grids.verify_dead_drop_signature(dead_drop),
:ok <- GridsLoginHandler.write_pubkey(message_id, verified_dead_drop.public_id) do
json(conn, dead_drop_data(verified_dead_drop))
else
_error -> send_resp(conn, :unprocessable_entity, "")
end
end
defp dead_drop_data(dead_drop) do
%{
grids: dead_drop.grids,
chain: dead_drop.chain,
network_id: dead_drop.network_id,
type: dead_drop.type,
public_id: dead_drop.public_id,
payload: dead_drop.payload,
signature: dead_drop.signature
}
end
end