Skip to content

Commit

Permalink
Create API and webhook endpoints
Browse files Browse the repository at this point in the history
  • Loading branch information
tteerawat committed Apr 17, 2021
1 parent e19aa96 commit bf08ec4
Show file tree
Hide file tree
Showing 3 changed files with 95 additions and 1 deletion.
50 changes: 50 additions & 0 deletions lib/satana_web/controllers/api/transaction_controller.ex
Original file line number Diff line number Diff line change
@@ -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
35 changes: 35 additions & 0 deletions lib/satana_web/controllers/webhook/blocknative_controller.ex
Original file line number Diff line number Diff line change
@@ -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
11 changes: 10 additions & 1 deletion lib/satana_web/router.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit bf08ec4

Please sign in to comment.