defmodule Plaid.Identity do @moduledoc """ Functions for Plaid `identity` endpoint. """ alias Plaid.Client.Request alias Plaid.Client @derive Jason.Encoder defstruct accounts: [], item: nil, request_id: nil @type t :: %__MODULE__{ accounts: [Plaid.Accounts.Account.t()], item: Plaid.Item.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 @doc """ Gets identity data associated with an Item. Parameters ``` %{ access_token: "access-env-identifier" } ``` """ @spec get(params, config) :: {:ok, Plaid.Identity.t()} | error def get(params, config \\ %{}) do c = config[:client] || Plaid Request |> struct(method: :post, endpoint: "identity/get", body: params) |> Request.add_metadata(config) |> c.send_request(Client.new(config)) |> c.handle_response(&map_identity(&1)) end defp map_identity(body) do Poison.Decode.transform( body, %{ as: %Plaid.Identity{ item: %Plaid.Item{}, accounts: [ %Plaid.Accounts.Account{ balances: %Plaid.Accounts.Account.Balance{}, owners: [ %Plaid.Accounts.Account.Owner{ addresses: [%Plaid.Accounts.Account.Owner.Address{}], emails: [%Plaid.Accounts.Account.Owner.Email{}], phone_numbers: [%Plaid.Accounts.Account.Owner.PhoneNumber{}] } ] } ] } } ) end end