42 lines
1.4 KiB
Elixir
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
|