defmodule Plaid.Link do
@moduledoc """
Functions for Plaid `link` endpoint.
"""
alias Plaid.Client.Request
alias Plaid.Client
@derive Jason.Encoder
defstruct link_token: nil,
expiration: nil,
# Deprecated, not returned by Plaid.
request_id: nil,
created_at: nil,
metadata: nil
@type t :: %__MODULE__{
link_token: String.t(),
expiration: String.t(),
request_id: String.t(),
created_at: String.t(),
metadata: Plaid.Link.Metadata.t()
}
@type params :: %{required(atom) => term}
@type config :: %{required(atom) => String.t() | keyword}
@type error :: {:error, Plaid.Error.t() | any()} | no_return
defmodule Metadata do
@moduledoc """
Plaid Link Metadata data structure.
"""
@derive Jason.Encoder
defstruct initial_products: nil,
webhook: nil,
country_codes: nil,
language: nil,
account_filters: nil,
redirect_uri: nil,
products: nil,
client_name: nil,
user: nil,
access_token: nil
@type t :: %__MODULE__{
initial_products: [String.t()],
products: [String.t()],
webhook: String.t(),
country_codes: [String.t()],
language: String.t(),
account_filters: map(),
redirect_uri: String.t(),
client_name: String.t(),
user: map(),
access_token: String.t()
}
end
@doc """
Creates a Link Token.
Parameters
```
%{
client_name: "",
language: "",
country_codes: "",
user: %{client_user_id: ""}
}
```
"""
@spec create_link_token(params, config) :: {:ok, Plaid.Link.t()} | error
def create_link_token(params, config \\ %{}) do
request_operation("link/token/create", params, config)
end
defp request_operation(endpoint, params, config) 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(&map_link(&1))
end
defp map_link(body) do
Poison.Decode.transform(
body,
%{
as: %Plaid.Link{metadata: %Plaid.Link.Metadata{}}
}
)
end
@doc """
Gets a Link Token's information.
Parameters
```
%{
link_token: ""
}
```
"""
@spec get_link_token(params, config) :: {:ok, Plaid.Link.t()} | error
def get_link_token(params, config \\ %{}) do
request_operation("link/token/get", params, config)
end
end