defmodule Plaid.Item do
@moduledoc """
[Plaid Item API](https://plaid.com/docs/api/items/#itemget) calls and schema.
"""
@behaviour Plaid.Castable
alias Plaid.Castable
@type t :: %__MODULE__{
available_products: [String.t()],
billed_products: [String.t()],
consent_expiration_time: String.t() | nil,
error: Plaid.Error.t() | nil,
has_perpetual_otp: boolean(),
institution_id: String.t() | nil,
item_id: String.t(),
update_type: String.t(),
webhook: String.t() | nil
}
defstruct [
:available_products,
:billed_products,
:consent_expiration_time,
:has_perpetual_otp,
:error,
:institution_id,
:item_id,
:update_type,
:webhook
]
@impl true
def cast(generic_map) do
%__MODULE__{
available_products: generic_map["available_products"],
billed_products: generic_map["billed_products"],
consent_expiration_time: generic_map["consent_expiration_time"],
error: Castable.cast(Plaid.Error, generic_map["error"]),
has_perpetual_otp: generic_map["has_perpetual_otp"],
institution_id: generic_map["institution_id"],
item_id: generic_map["item_id"],
update_type: generic_map["update_type"],
webhook: generic_map["webhook"]
}
end
defmodule GetResponse do
@moduledoc """
[Plaid API /item/get response schema.](https://plaid.com/docs/api/items/#itemget)
"""
@behaviour Castable
alias Plaid.Castable
alias Plaid.Item
alias Plaid.Item.Status
@type t :: %__MODULE__{
item: Item.t(),
status: Status.t() | nil,
request_id: String.t(),
access_token: String.t() | nil
}
defstruct [
:item,
:status,
:request_id,
:access_token
]
@impl true
def cast(generic_map) do
%__MODULE__{
item: Castable.cast(Item, generic_map["item"]),
status: Castable.cast(Status, generic_map["status"]),
request_id: generic_map["request_id"],
access_token: generic_map["access_token"]
}
end
end
@doc """
Get information about an item.
Does a `POST /item/get` call which returns information about an item and
its status.
## Params
* `access_token` - The access token associated with the item.
## Examples
Item.get("access-prod-123xxx", client_id: "123", secret: "abc")
{:ok, %Item.GetResponse{}}
"""
@spec get(String.t(), Plaid.config()) :: {:ok, GetResponse.t()} | {:error, Plaid.Error.t()}
def get(access_token, config) do
Plaid.Client.call("/item/get", %{access_token: access_token}, GetResponse, config)
end
@doc """
Removes an item.
Does a `POST /item/remove` call to remove an item.
## Params
* `access_token` - The access token associated with the item.
## Examples
Item.remove("access-prod-123xxx", client_id: "123", secret: "abc")
{:ok, %Plaid.SimpleResponse{}}
"""
@spec remove(String.t(), Plaid.config()) ::
{:ok, Plaid.SimpleResponse.t()} | {:error, Plaid.Error.t()}
def remove(access_token, config) do
Plaid.Client.call("/item/remove", %{access_token: access_token}, Plaid.SimpleResponse, config)
end
defmodule UpdateWebhookResponse do
@moduledoc """
[Plaid API /item/webhook/update response schema.](https://plaid.com/docs/api/items/#itemwebhookupdate)
"""
@behaviour Castable
alias Plaid.Item
@type t :: %__MODULE__{
item: Item.t(),
request_id: String.t()
}
defstruct [
:item,
:request_id
]
@impl true
def cast(generic_map) do
%__MODULE__{
item: Castable.cast(Item, generic_map["item"]),
request_id: generic_map["request_id"]
}
end
end
@doc """
Update a webhook for an access_token.
Does a `POST /item/webhook/update` call which is used to update webhook
for a particular access_token.
## Params
* `access_token` - The access token associated with the item.
* `webhook` - The new webhook URL.
## Examples
Item.update_webhook(
"access-prod-123xxx",
"https://plaid.com/fake/webhook",
client_id: "123",
secret: "abc"
)
{:ok, %Item.UpdateWebhookResponse{}}
"""
@spec update_webhook(String.t(), String.t(), Plaid.config()) ::
{:ok, UpdateWebhookResponse.t()} | {:error, Plaid.Error.t()}
def update_webhook(access_token, webhook, config) do
Plaid.Client.call(
"/item/webhook/update",
%{access_token: access_token, webhook: webhook},
UpdateWebhookResponse,
config
)
end
defmodule ExchangePublicTokenResponse do
@moduledoc """
[Plaid API /item/public_token/exchange response schema.](https://plaid.com/docs/api/tokens/#itempublic_tokenexchange)
"""
@behaviour Castable
@type t :: %__MODULE__{
access_token: String.t(),
item_id: String.t(),
request_id: String.t()
}
defstruct [
:access_token,
:item_id,
:request_id
]
@impl true
def cast(generic_map) do
%__MODULE__{
access_token: generic_map["access_token"],
item_id: generic_map["item_id"],
request_id: generic_map["request_id"]
}
end
end
@doc """
Exchange a public token for an access token.
Does a `POST /item/public_token/exchange` call which exchanges a public token
for an access token.
## Params
* `public_token` - Your public_token, obtained from the Link `onSuccess` callback
or `POST /sandbox/item/public_token/create.`
## Examples
Item.exchange_public_token(
"public-prod-123xxx",
client_id: "123",
secret: "abc"
)
{:ok, %Item.ExchangePublicTokenResponse{}}
"""
@spec exchange_public_token(String.t(), Plaid.config()) ::
{:ok, ExchangePublicTokenResponse.t()} | {:error, Plaid.Error.t()}
def exchange_public_token(public_token, config) do
Plaid.Client.call(
"/item/public_token/exchange",
%{public_token: public_token},
ExchangePublicTokenResponse,
config
)
end
defmodule InvalidateAccessTokenResponse do
@moduledoc """
[Plaid API /item/access_token/invalidate response schema.](https://plaid.com/docs/api/tokens/#itemaccess_tokeninvalidate)
"""
@behaviour Castable
@type t :: %__MODULE__{
new_access_token: String.t(),
request_id: String.t()
}
defstruct [
:new_access_token,
:request_id
]
@impl true
def cast(generic_map) do
%__MODULE__{
new_access_token: generic_map["new_access_token"],
request_id: generic_map["request_id"]
}
end
end
@doc """
Invalidate an access token.
Does a `POST /item/access_token/invalidate` call which rotates an access token
for an item. Immediately invalidating it and returning a new access token.
## Params
* `access_token` - The access token associated with the Item data is being requested for.
## Examples
Item.invalidate_access_token(
"access-prod-123xxx",
client_id: "123",
secret: "abc"
)
{:ok, %Item.InvalidateAccessTokenResponse{}}
"""
@spec invalidate_access_token(String.t(), Plaid.config()) ::
{:ok, InvalidateAccessTokenResponse.t()} | {:error, Plaid.Error.t()}
def invalidate_access_token(access_token, config) do
Plaid.Client.call(
"/item/access_token/invalidate",
%{access_token: access_token},
InvalidateAccessTokenResponse,
config
)
end
end