diff --git a/lib/satana_web/controllers/api/transaction_controller.ex b/lib/satana_web/controllers/api/transaction_controller.ex new file mode 100644 index 0000000..60660d3 --- /dev/null +++ b/lib/satana_web/controllers/api/transaction_controller.ex @@ -0,0 +1,50 @@ +defmodule SatanaWeb.API.TransactionController do + use SatanaWeb, :controller + + alias Satana.ETHTransactions + + @valid_statuses ~w(pending confirmed) + + def list_transactions(conn, %{"status" => status}) when status in @valid_statuses do + transactions = + status + |> ETHTransactions.list_transactions_by_status() + |> Enum.map(&Map.from_struct/1) + + conn + |> put_status(:ok) + |> json(%{transactions: transactions}) + end + + def add_transaction(conn, %{"tx_ids" => tx_ids}) when is_list(tx_ids) do + results = Enum.map(tx_ids, &add_eth_transaction/1) + + conn + |> put_status(:ok) + |> json(%{results: results}) + end + + def add_transaction(conn, _) do + conn + |> put_status(:bad_request) + |> json(%{message: "invalid params"}) + end + + defp add_eth_transaction(tx_id) do + case ETHTransactions.add_eth_transaction(tx_id) do + :ok -> + build_response(tx_id, true, nil) + + {:error, msg} -> + build_response(tx_id, false, msg) + end + end + + defp build_response(tx_id, success, error_message) do + %{ + tx_id: tx_id, + success: success, + error_message: error_message + } + end +end diff --git a/lib/satana_web/controllers/webhook/blocknative_controller.ex b/lib/satana_web/controllers/webhook/blocknative_controller.ex new file mode 100644 index 0000000..8884eb0 --- /dev/null +++ b/lib/satana_web/controllers/webhook/blocknative_controller.ex @@ -0,0 +1,35 @@ +defmodule SatanaWeb.Webhook.BlocknativeController do + use SatanaWeb, :controller + + alias Satana.ETHTransactions + + require Logger + + plug :basic_auth + + def handle_webhook(conn, %{"hash" => tx_id, "status" => "confirmed"}) do + :ok = ETHTransactions.confirm_transaction!(tx_id) + + conn + |> put_status(:ok) + |> json(%{}) + end + + def handle_webhook(conn, params) do + Logger.info(fn -> inspect(params) end) + + conn + |> put_status(:ok) + |> json(%{}) + end + + defp basic_auth(conn, _opts) do + config = Satana.Blocknative.Config.new() + + Plug.BasicAuth.basic_auth( + conn, + username: config.basic_auth.username, + password: config.basic_auth.password + ) + end +end diff --git a/lib/satana_web/router.ex b/lib/satana_web/router.ex index 6de27e7..b189604 100644 --- a/lib/satana_web/router.ex +++ b/lib/satana_web/router.ex @@ -5,7 +5,16 @@ defmodule SatanaWeb.Router do plug :accepts, ["json"] end - scope "/api", SatanaWeb do + scope "/api", SatanaWeb.API do pipe_through :api + + get "/transactions/:status", TransactionController, :list_transactions + post "/transactions", TransactionController, :add_transaction + end + + scope "/webhook", SatanaWeb.Webhook do + pipe_through :api + + post "/blocknative", BlocknativeController, :handle_webhook end end