defmodule Plaid.Processor do @moduledoc """ [Plaid Processor API](https://plaid.com/docs/api/processors) calls and schema. """ alias Plaid.Castable defmodule CreateTokenResponse do @moduledoc """ [Plaid API /processor/token/create response schema.](https://plaid.com/docs/api/processors/#processortokencreate) """ @behaviour Castable @type t :: %__MODULE__{ processor_token: String.t(), request_id: String.t() } defstruct [:processor_token, :request_id] @impl true def cast(generic_map) do %__MODULE__{ processor_token: generic_map["processor_token"], request_id: generic_map["request_id"] } end end @doc """ Creates a processor token from an access_token. Does a `POST /processor/token/create` call which generates any non-stripe processor token for a given account ID. Params: * `access_token` - access_token to create a processor token for. * `account_id` - ID of the account to create a processor token for. * `processor` - name of the processor to create a token for. ## Examples Processor.create_token("access-prod-123xxx", "blejdkalk3kdlsl", "galileo", client_id: "123", secret: "abc") {:ok, %Processor.CreateTokenResponse{}} """ @spec create_token(String.t(), String.t(), String.t(), Plaid.config()) :: {:ok, CreateTokenResponse.t()} | {:error, Plaid.Error.t()} def create_token(access_token, account_id, processor, config) do Plaid.Client.call( "/processor/token/create", %{access_token: access_token, account_id: account_id, processor: processor}, CreateTokenResponse, config ) end defmodule CreateStripeBankAccountTokenResponse do @moduledoc """ [Plaid API /processor/stripe/bank_account_token/create response schema.](https://plaid.com/docs/api/processors/#processorstripebank_account_tokencreate) """ @behaviour Castable @type t :: %__MODULE__{ stripe_bank_account_token: String.t(), request_id: String.t() } defstruct [:stripe_bank_account_token, :request_id] @impl true def cast(generic_map) do %__MODULE__{ stripe_bank_account_token: generic_map["stripe_bank_account_token"], request_id: generic_map["request_id"] } end end @doc """ Creates a stripe bank account token from an access_token. Does a POST `/processor/stripe/bank_account_token/create` call which generates a stripe bank account token for a given account ID. Params: * `access_token` - access_token to create a processor token for. * `account_id` - ID of the account to create a processor token for. ## Examples Processor.create_stripe_bank_account_token("access-prod-123xxx", "blejdkalk3kdlsl", client_id: "123", secret: "abc") {:ok, %Processor.CreateStripeBankAccountTokenResponse{}} """ @spec create_stripe_bank_account_token(String.t(), String.t(), Plaid.config()) :: {:ok, CreateStripeBankAccountTokenResponse.t()} | {:error, Plaid.Error.t()} def create_stripe_bank_account_token(access_token, account_id, config) do Plaid.Client.call( "/processor/stripe/bank_account_token/create", %{access_token: access_token, account_id: account_id}, CreateStripeBankAccountTokenResponse, config ) end defmodule GetAuthResponse do @moduledoc """ [Plaid API /processor/auth/get response schema.](https://plaid.com/docs/api/processors/#processorauthget) """ @behaviour Castable alias Plaid.Account alias Plaid.Processor.Numbers @type t :: %__MODULE__{ account: Account.t(), numbers: Numbers.t(), request_id: String.t() } defstruct [:account, :numbers, :request_id] @impl true def cast(generic_map) do %__MODULE__{ account: Castable.cast(Account, generic_map["account"]), numbers: Castable.cast(Numbers, generic_map["numbers"]), request_id: generic_map["request_id"] } end end @doc """ Get the bank account info given a processor_token. Does a POST `/processor/auth/get` call which returns the bank account and bank identification number (such as the routing number, for US accounts), for a checking or savings account that's associated with a given processor_token. Params: * `processor_token` - The processor token obtained from the Plaid integration partner. ## Examples Processor.get_auth("processor-prod-123xxx", client_id: "123", secret: "abc") {:ok, %Processor.GetAuthResponse{}} """ @spec get_auth(String.t(), Plaid.config()) :: {:ok, GetAuthResponse.t()} | {:error, Plaid.Error.t()} def get_auth(processor_token, config) do Plaid.Client.call( "/processor/auth/get", %{processor_token: processor_token}, GetAuthResponse, config ) end defmodule GetBalanceResponse do @moduledoc """ [Plaid API /processor/balance/get response schema.](https://plaid.com/docs/api/processors/#processorbalanceget) """ @behaviour Castable alias Plaid.Account @type t :: %__MODULE__{ account: Account.t(), request_id: String.t() } defstruct [:account, :request_id] @impl true def cast(generic_map) do %__MODULE__{ account: Castable.cast(Account, generic_map["account"]), request_id: generic_map["request_id"] } end end @doc """ Get real-time balance for each of an Item's accounts. Does a POST `/processor/balance/get` call which returns the balance for each of a Item's accounts. While other endpoints may return a balance object, only /processor/balance/get forces the available and current balance fields to be refreshed rather than cached. Params: * `processor_token` - The processor token obtained from the Plaid integration partner. ## Examples Processor.get_balance("processor-prod-123xxx", client_id: "123", secret: "abc") {:ok, %Processor.GetBalanceResponse{}} """ @spec get_balance(String.t(), Plaid.config()) :: {:ok, GetBalanceResponse.t()} | {:error, Plaid.Error.t()} def get_balance(processor_token, config) do Plaid.Client.call( "/processor/balance/get", %{processor_token: processor_token}, GetBalanceResponse, config ) end defmodule GetIdentityResponse do @moduledoc """ [Plaid API /processor/identity/get response schema.](https://plaid.com/docs/api/processors/#processoridentityget) """ @behaviour Castable alias Plaid.Account @type t :: %__MODULE__{ account: Account.t(), request_id: String.t() } defstruct [:account, :request_id] @impl true def cast(generic_map) do %__MODULE__{ account: Castable.cast(Account, generic_map["account"]), request_id: generic_map["request_id"] } end end @doc """ Get account holder information on file with the financial institution. Does a POST `/processor/identity/get` call which allows you to retrieve various account holder information on file with the financial institution, including names, emails, phone numbers, and addresses. Params: * `processor_token` - The processor token obtained from the Plaid integration partner. ## Examples Processor.get_identity("processor-prod-123xxx", client_id: "123", secret: "abc") {:ok, %Processor.GetIdentityResponse{}} """ @spec get_identity(String.t(), Plaid.config()) :: {:ok, GetIdentityResponse.t()} | {:error, Plaid.Error.t()} def get_identity(processor_token, config) do Plaid.Client.call( "/processor/identity/get", %{processor_token: processor_token}, GetIdentityResponse, config ) end end