defmodule Circlex.Emulator.Actor.PaymentActor do @moduledoc """ Models a wire payment (transfer in) When we create a wire, we will credit the account's master wallet. Note: we do not need to initiate any on-chain transfers """ use GenServer alias Circlex.Emulator alias Circlex.Emulator.Notifier alias Circlex.Emulator.State alias Circlex.Emulator.State.PaymentState alias Circlex.Emulator.Logic.PaymentLogic def start_link(payment_id) do GenServer.start_link(__MODULE__, {payment_id, Process.get(:state_pid)}) end @impl true def init({payment_id, state_pid}) do Process.put(:state_pid, state_pid) Process.send_after(self(), :accept_wire, Emulator.action_delay()) Notifier.notify_payment(payment_id) {:ok, %{payment_id: payment_id}} end @impl true def handle_info(:accept_wire, state = %{payment_id: payment_id}) do {:ok, payment} = PaymentState.get_payment(payment_id) case payment.status do "pending" -> # We've accepted the wire, set state and send notification State.update_st(fn st -> st |> PaymentLogic.process_payment(payment.id) end) Notifier.notify_payment(payment.id) end {:noreply, state} end end