Packages

Production-grade Elixir client for the Token.io Open Banking platform (Payments v2, VRP, AIS, Banks, Refunds, Payouts, Settlement, Transfers, Tokens, Token Requests, Account on File, Sub-TPPs, Auth Keys, Reports, Webhooks, Verification).

Current section

Files

Jump to
tokenio_client lib tokenio vrp consent.ex
Raw

lib/tokenio/vrp/consent.ex

defmodule TokenioClient.VRP.Consent do
@moduledoc """
A Token.io VRP consent resource.
A consent represents the PSU's authorisation for a TPP to make variable
recurring payments from their account up to the agreed limits.
## Status predicates
TokenioClient.VRP.Consent.final?(consent)
TokenioClient.VRP.Consent.authorized?(consent)
TokenioClient.VRP.Consent.requires_redirect?(consent)
"""
alias TokenioClient.Types
@terminal ~w[AUTHORIZED REJECTED REVOKED FAILED]
@redirect ~w[PENDING_REDIRECT_AUTH PENDING_REDIRECT_AUTH_VERIFICATION]
@type t :: %__MODULE__{
id: String.t(),
member_id: String.t() | nil,
status: String.t(),
bank_vrp_consent_id: String.t() | nil,
redirect_url: String.t() | nil,
embedded_auth_fields: [Types.EmbeddedField.t()],
status_reason_information: String.t() | nil,
created_at: DateTime.t() | nil,
updated_at: DateTime.t() | nil,
raw: map()
}
defstruct [
:id,
:member_id,
:status,
:bank_vrp_consent_id,
:redirect_url,
:status_reason_information,
:created_at,
:updated_at,
embedded_auth_fields: [],
raw: %{}
]
@doc "Build a `Consent` from a raw API response map."
@spec from_map(map() | nil) :: t() | nil
def from_map(nil), do: nil
def from_map(m) when is_map(m) do
auth = m["authentication"] || %{}
%__MODULE__{
id: m["id"],
member_id: m["memberId"],
status: m["status"] || "",
bank_vrp_consent_id: m["bankVrpConsentId"],
redirect_url: auth["redirectUrl"],
embedded_auth_fields: Enum.map(auth["embeddedAuth"] || [], &Types.EmbeddedField.from_map/1),
status_reason_information: m["statusReasonInformation"],
created_at: Types.parse_datetime(m["createdDateTime"]),
updated_at: Types.parse_datetime(m["updatedDateTime"]),
raw: m
}
end
@doc "Returns `true` when the consent is in a terminal state."
@spec final?(t()) :: boolean()
def final?(%__MODULE__{status: s}), do: s in @terminal
@doc "Returns `true` when the PSU must be redirected to authorise."
@spec requires_redirect?(t()) :: boolean()
def requires_redirect?(%__MODULE__{status: s}), do: s in @redirect
@doc "Returns `true` when the consent is fully authorised."
@spec authorized?(t()) :: boolean()
def authorized?(%__MODULE__{status: "AUTHORIZED"}), do: true
def authorized?(%__MODULE__{}), do: false
end