defmodule Plaid.PaymentInitiation.Recipients do
@moduledoc """
Functions for Plaid `payment_initiation/recipient` endpoints.
"""
alias Plaid.Client.Request
alias Plaid.Client
@derive Jason.Encoder
defstruct recipients: [], request_id: nil
@type t :: %__MODULE__{
recipients: [Plaid.PaymentInitiation.Recipients.Recipient.t()],
request_id: String.t()
}
@type params :: %{required(atom) => term}
@type config :: %{required(atom) => String.t() | keyword}
@type error :: {:error, Plaid.Error.t() | any()} | no_return
defmodule Recipient do
@moduledoc """
Plaid Recipient data structure.
"""
@derive Jason.Encoder
defstruct recipient_id: nil,
name: nil,
iban: nil,
address: nil,
request_id: nil
@type t :: %__MODULE__{
recipient_id: String.t(),
name: String.t(),
iban: String.t(),
address: Plaid.PaymentInitiation.Recipients.Recipient.Address.t(),
request_id: String.t()
}
defmodule Address do
@moduledoc """
Plaid Recipient Address data structure.
"""
@derive Jason.Encoder
defstruct street: nil,
city: nil,
postal_code: nil,
country: nil
@type t :: %__MODULE__{
street: [String.t()],
city: String.t(),
postal_code: String.t(),
country: String.t()
}
end
end
@doc """
Creates recipient.
Parameters
```
%{
}
```
"""
@spec create(params, config) :: {:ok, Plaid.PaymentInitiation.Recipients.Recipient.t()} | error
def create(params, config \\ %{}) do
request_operation("payment_initiation/recipient/create", params, config, &map_recipient(&1))
end
defp request_operation(endpoint, params, config, mapper) do
c = config[:client] || Plaid
Request
|> struct(method: :post, endpoint: endpoint, body: params)
|> Request.add_metadata(config)
|> c.send_request(Client.new(config))
|> c.handle_response(mapper)
end
defp map_recipients(body) do
Poison.Decode.transform(body, %{
as: %Plaid.PaymentInitiation.Recipients{recipients: [full_struct()]}
})
end
defp map_recipient(body) do
Poison.Decode.transform(body, %{as: full_struct()})
end
defp full_struct do
%Plaid.PaymentInitiation.Recipients.Recipient{
address: %Plaid.PaymentInitiation.Recipients.Recipient.Address{}
}
end
@doc """
Gets recipient by recipient_id.
Parameters
```
%{
recipient_id: ""
}
```
"""
@spec get(params, config) :: {:ok, Plaid.PaymentInitiation.Recipients.Recipient.t()} | error
def get(params, config \\ %{}) do
request_operation("payment_initiation/recipient/get", params, config, &map_recipient(&1))
end
@doc """
Lists all recipients.
"""
@spec list(config) :: {:ok, Plaid.PaymentInitiation.Recipients.t()} | error
def list(config \\ %{}) do
request_operation("payment_initiation/recipient/list", %{}, config, &map_recipients(&1))
end
end