defmodule Circlex.Api.Payouts.Payouts do
@moduledoc """
API Client to the Payouts Payouts API.
Reference: https://developers.circle.com/reference/payouts-payouts-create
"""
import Circlex.Api.Tooling
alias Circlex.Struct.Payout
@doc ~S"""
Create a payout.
Reference: https://developers.circle.com/reference/payouts-payouts-create
## Examples
iex> host = Circlex.Test.start_server()
iex> source = %{id: "1000788811", type: "wallet"}
iex> destination = %{address: "0x871A9FF377eCf2632A0928950dCEb181557F2e17", chain: "ETH", type: "blockchain"}
iex> amount = %{amount: "12345.00", currency: "USD"}
iex> metadata = %{beneficiaryEmail: "tom@example.com"}
iex> Circlex.Api.Payouts.Payouts.create(source, destination, amount, metadata, host: host)
{
:ok,
%Circlex.Struct.Payout{
adjustments: nil,
amount: %Circlex.Struct.Amount{amount: "12345.00", currency: "USD"},
create_date: "2022-07-17T08:59:41.344582Z",
destination: %Circlex.Struct.SourceDest{address: "0x871a9ff377ecf2632a0928950dceb181557f2e17", chain: "ETH", type: :blockchain},
fees: %Circlex.Struct.Amount{amount: "0.00", currency: "USD"},
id: "a033a6d8-05ae-11ed-9e62-6a1733211c00",
return: nil,
risk_evaluation: nil,
source_wallet_id: "1000788811",
status: "pending",
tracking_ref: "CIR3KXZZ00",
update_date: "2022-07-17T08:59:41.344582Z"
}
}
"""
def create(source, destination, amount, metadata, opts \\ []) do
idempotency_key = Keyword.get(opts, :idempotency_key, UUID.uuid1())
with {:ok, payout} <-
api_post(
"/v1/payouts",
%{
idempotencyKey: idempotency_key,
source: source,
destination: destination,
amount: amount,
metadata: metadata
},
opts
) do
{:ok, Payout.deserialize(payout)}
end
end
@doc ~S"""
Get a list of payouts.
Reference: https://developers.circle.com/reference/payouts-payouts-get
# TODO: Filters
## Examples
iex> host = Circlex.Test.start_server()
iex> Circlex.Api.Payouts.Payouts.list_payouts(host: host)
{
:ok,
[
%Circlex.Struct.Payout{
adjustments: nil,
amount: %Circlex.Struct.Amount{amount: "12111.00", currency: "USD"},
create_date: "2022-07-15T20:03:32.718Z",
destination: %Circlex.Struct.SourceDest{id: "4847be95-8b73-44cc-a329-549a25a776e2", type: :wire},
fees: %Circlex.Struct.Amount{amount: "25.00", currency: "USD"},
id: "5e2e20bd-6ad6-4603-950b-64803647a4e5",
return: nil,
risk_evaluation: nil,
source_wallet_id: "1000788811",
status: "complete",
tracking_ref: nil,
update_date: "2022-07-15T20:20:32.255Z"
},
%Circlex.Struct.Payout{
adjustments: nil,
amount: %Circlex.Struct.Amount{amount: "12111.00", currency: "USD"},
create_date: "2022-07-15T20:03:32.718Z",
destination: %Circlex.Struct.SourceDest{
id: "4847be95-8b73-44cc-a329-549a25a776e2",
type: :wire
},
fees: %Circlex.Struct.Amount{amount: "25.00", currency: "USD"},
id: "6e2e20bd-6ad6-4603-950b-64803647a4e6",
return: nil,
risk_evaluation: nil,
source_wallet_id: "1000216185",
status: "complete",
tracking_ref: nil,
update_date: "2022-07-15T20:20:32.255Z"
}
]
}
"""
def list_payouts(opts \\ []) do
with {:ok, payouts} <- api_get("/v1/payouts", opts) do
{:ok, Enum.map(payouts, &Payout.deserialize/1)}
end
end
@doc ~S"""
Get a payout.
Reference: https://developers.circle.com/reference/payouts-payouts-get-id
## Examples
iex> host = Circlex.Test.start_server()
iex> Circlex.Api.Payouts.Payouts.get_payout("5e2e20bd-6ad6-4603-950b-64803647a4e5", host: host)
{
:ok,
%Circlex.Struct.Payout{
adjustments: nil,
amount: %Circlex.Struct.Amount{amount: "12111.00", currency: "USD"},
create_date: "2022-07-15T20:03:32.718Z",
destination: %Circlex.Struct.SourceDest{id: "4847be95-8b73-44cc-a329-549a25a776e2", type: :wire},
fees: %Circlex.Struct.Amount{amount: "25.00", currency: "USD"},
id: "5e2e20bd-6ad6-4603-950b-64803647a4e5",
return: nil,
risk_evaluation: nil,
source_wallet_id: "1000788811",
status: "complete",
tracking_ref: nil,
update_date: "2022-07-15T20:20:32.255Z"
}
}
"""
def get_payout(id, opts \\ []) do
with {:ok, payout} <- api_get(Path.join("/v1/payouts", to_string(id)), opts) do
{:ok, Payout.deserialize(payout)}
end
end
end