defmodule Circlex.Emulator.Api.Payouts.PayoutsApi do
@moduledoc """
Mounted under `/v1/payouts`.
"""
use Circlex.Emulator.Api
alias Circlex.Emulator.State.PayoutState
alias Circlex.Emulator.Actor.PayoutActor
alias Circlex.Struct.Payout
# https://developers.circle.com/reference/payouts-payouts-get
@route "/"
def list_payouts(%{}) do
{:ok, Enum.map(PayoutState.all_payouts(), fn payout -> Payout.serialize(payout, true) end)}
end
# https://developers.circle.com/reference/payouts-payouts-get-id
@route "/:payout_id"
def get_payout(%{payout_id: payout_id}) do
with {:ok, payout} <- PayoutState.get_payout(payout_id) do
{:ok, Payout.serialize(payout, true)}
end
end
# https://developers.circle.com/reference/payouts-payouts-create
@route path: "/", method: :post
def create_payout(%{
idempotencyKey: idempotency_key,
source: source,
destination: destination,
amount: %{amount: amount, currency: currency},
metadata: metadata
}) do
# TODO: Check idempotency key
with :ok <- check_idempotency_key(idempotency_key),
{:ok, payout} <-
PayoutState.new_payout(source, destination, amount, currency, metadata) do
PayoutState.add_payout(payout)
PayoutActor.start_link(payout.id)
{:ok, Payout.serialize(payout, true)}
end
end
end