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