defmodule Circlex.Emulator.Router do
use Plug.Router
require Logger
def call(conn, opts) do
conn
|> put_private(:state_pid, Keyword.get(opts, :state_pid))
|> put_private(:signer_proc, Keyword.get(opts, :signer_proc))
|> super(opts)
end
# if Mix.env() == :dev do
# use Plug.Debugger
# end
use Plug.ErrorHandler
plug(:match)
plug(:dispatch)
forward("/circlex", to: Circlex.Emulator.Api.CirclexApi)
forward("/v1/mocks", to: Circlex.Emulator.Api.MocksApi)
# Base
forward("/ping", to: Circlex.Emulator.Api.HealthApi)
forward("/v1/configuration", to: Circlex.Emulator.Api.ManagementApi)
forward("/v1/stablecoins", to: Circlex.Emulator.Api.StablecoinsApi)
forward("/v1/notifications/subscriptions", to: Circlex.Emulator.Api.SubscriptionsApi)
# Core
forward("/v1/businessAccount/balances", to: Circlex.Emulator.Api.Core.BalancesApi)
forward("/v1/businessAccount/payouts", to: Circlex.Emulator.Api.Core.PayoutsApi)
forward("/v1/businessAccount/banks", to: Circlex.Emulator.Api.Core.BankAccountsApi)
forward("/v1/businessAccount/transfers", to: Circlex.Emulator.Api.Core.TransfersApi)
forward("/v1/businessAccount/wallets/addresses", to: Circlex.Emulator.Api.Core.AddressesApi)
# forward("/v1/businessAccount/deposits", to: Circlex.Emulator.Api.Core.DepositsApi)
# Payments API
forward("/v1/payments", to: Circlex.Emulator.Api.Payments.PaymentsApi)
# Mirrors /v1/banks
# Payouts
forward("/v1/payouts", to: Circlex.Emulator.Api.Payouts.PayoutsApi)
forward("/v1/banks", to: Circlex.Emulator.Api.Core.BankAccountsApi)
forward("/v1/transfers", to: Circlex.Emulator.Api.Payouts.TransfersApi)
# forward("/v1/returns", to: Circlex.Emulator.Api.Payouts.ReturnsApi)
# Accounts
forward("/v1/wallets", to: Circlex.Emulator.Api.Accounts.WalletsApi)
# Mirrors /v1/transfers
get "/" do
conn
|> put_resp_content_type("application/json")
|> send_resp(200, Jason.encode!(%{message: "Welcome to the Circlex Emulator 🦦🪨"}))
end
defp handle_errors(conn, error = %{kind: _kind, reason: reason, stack: _stack}) do
Logger.error(inspect(error))
failure_reason =
case reason do
%FunctionClauseError{function: function} ->
if String.contains?(to_string(function), "match") do
:not_found
end
_ ->
nil
end
case failure_reason do
:not_found ->
send_resp(conn, 404, Jason.encode!(%{error: "not found"}))
_ ->
send_resp(conn, 500, Jason.encode!(%{error: "internal server error"}))
end
end
end