defmodule Circlex.Emulator.Api.Payouts.TransfersApi do
@moduledoc """
Mounted under `/v1/transfers`.
"""
use Circlex.Emulator.Api
alias Circlex.Emulator.State.TransferState
alias Circlex.Emulator.Actor.TransferActor
alias Circlex.Struct.Transfer
# https://developers.circle.com/reference/payouts-transfers-get
@route "/"
def list_transfers(%{}) do
{:ok, Enum.map(TransferState.all_transfers(), &Transfer.serialize/1)}
end
# https://developers.circle.com/reference/payouts-transfers-get-id
@route "/:transfer_id"
def get_transfer(%{transfer_id: transfer_id}) do
with {:ok, transfer} <- TransferState.get_transfer(transfer_id) do
{:ok, Transfer.serialize(transfer)}
end
end
# https://developers.circle.com/reference/payouts-transfers-create
@route path: "/", method: :post
def create_transfer(%{
idempotencyKey: idempotency_key,
source: source,
destination: destination,
amount: amount
}) do
with :ok <- check_idempotency_key(idempotency_key),
{:ok, transfer} <-
TransferState.new_transfer(source, destination, amount) do
TransferState.add_transfer(transfer)
TransferActor.start_link(transfer.id)
{:ok, Transfer.serialize(transfer)}
end
end
end