defmodule Circlex.Emulator.Api.MocksApi do
@moduledoc """
Mounted under `/v1/mocks`.
"""
use Circlex.Emulator.Api
alias Circlex.Emulator.Actor.PaymentActor
alias Circlex.Emulator.State.{BankAccountState, PaymentState}
alias Circlex.Struct.Amount
# https://developers.circle.com/reference/payments-payments-mock-create
@route path: "/payments/wire", method: :post
def create_mock_wire(%{
trackingRef: tracking_ref,
amount: %{amount: amount, currency: currency},
beneficiaryBank: beneficiary_bank
}) do
with {:ok, master_wallet} <- get_master_wallet() do
with {:ok, bank_account} <- BankAccountState.get_bank_account_by_tracking_ref(tracking_ref) do
{:ok, payment} =
PaymentState.new_payment(master_wallet.wallet_id, bank_account.id, amount, currency)
PaymentState.add_payment(payment)
PaymentActor.start_link(payment.id)
# It's weird we don't just serialize a payment, but this is what the API returns.
{:ok,
%{
amount: Amount.serialize(payment.amount),
status: payment.status,
trackingRef: tracking_ref,
beneficiaryBank: beneficiary_bank
}}
end
end
end
end