defmodule Plaid.Auth do
@moduledoc """
Functions for Plaid `auth` endpoint.
"""
alias Plaid.Client.Request
alias Plaid.Client
@derive Jason.Encoder
defstruct accounts: [], item: nil, numbers: [], request_id: nil
@type t :: %__MODULE__{
accounts: [Plaid.Accounts.Account.t()],
item: Plaid.Item.t(),
numbers: %Plaid.Auth.Numbers{
ach: [Plaid.Auth.Numbers.ACH.t()],
eft: [Plaid.Auth.Numbers.EFT.t()],
international: [Plaid.Auth.Numbers.International.t()],
bacs: [Plaid.Auth.Numbers.BACS.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 Numbers do
@moduledoc """
Plaid Account Number data structure.
There are 2 types of numbers that Plaid supports: ACH and EFT, the latter being specific to Canadian banking.
"""
@derive Jason.Encoder
defstruct ach: [], eft: [], international: [], bacs: []
@type t :: %__MODULE__{
ach: [Plaid.Auth.Numbers.ACH.t()],
eft: [Plaid.Auth.Numbers.EFT.t()],
international: [Plaid.Auth.Numbers.International.t()],
bacs: [Plaid.Auth.Numbers.BACS.t()]
}
defmodule ACH do
@moduledoc """
Plaid Account Number ACH data structure.
"""
@derive Jason.Encoder
defstruct account: nil, account_id: nil, routing: nil, wire_routing: nil
@type t :: %__MODULE__{
account: String.t(),
account_id: String.t(),
routing: String.t(),
wire_routing: String.t()
}
end
defmodule EFT do
@moduledoc """
Plaid Account Number EFT data structure
"""
@derive Jason.Encoder
defstruct account: nil, account_id: nil, institution: nil, branch: nil
@type t :: %__MODULE__{
account: String.t(),
account_id: String.t(),
institution: String.t(),
branch: String.t()
}
end
defmodule International do
@moduledoc """
Plaid Account Number Institution data structure.
"""
@derive Jason.Encoder
defstruct account_id: nil, bic: nil, iban: nil
@type t :: %__MODULE__{
account_id: String.t(),
bic: String.t(),
iban: String.t()
}
end
defmodule BACS do
@moduledoc """
Plaid Account Number BACS data structure.
"""
@derive Jason.Encoder
defstruct account: nil, account_id: nil, sort_code: nil
@type t :: %__MODULE__{
account: String.t(),
account_id: String.t(),
sort_code: String.t()
}
end
end
@doc """
Gets auth data associated with an Item.
Parameters
```
%{
access_token: "access-env-identifier",
options: %{
account_ids: [
]
}
}
```
"""
@spec get(params, config) :: {:ok, Plaid.Auth.t()} | error
def get(params, config \\ %{}) do
c = config[:client] || Plaid
Request
|> struct(method: :post, endpoint: "auth/get", body: params)
|> Request.add_metadata(config)
|> c.send_request(Client.new(config))
|> c.handle_response(&map_auth(&1))
end
defp map_auth(body) do
Poison.Decode.transform(
body,
%{
as: %Plaid.Auth{
numbers: %Plaid.Auth.Numbers{
ach: [%Plaid.Auth.Numbers.ACH{}],
eft: [%Plaid.Auth.Numbers.EFT{}],
international: [%Plaid.Auth.Numbers.International{}],
bacs: [%Plaid.Auth.Numbers.BACS{}]
},
item: %Plaid.Item{},
accounts: [
%Plaid.Accounts.Account{
balances: %Plaid.Accounts.Account.Balance{}
}
]
}
}
)
end
end