defmodule Ibanity.Xs2a.Synchronization do
@moduledoc """
[Synchronization](https://documentation.ibanity.com/xs2a/api#synchronization) API wrapper
"""
use Ibanity.Resource
@api_schema_path ~w(xs2a customer synchronizations)
# Please note that this is NOT the same as the 'resource_type' defined in the struct
@resource_type "synchronization"
defstruct id: nil,
subtype: nil,
status: nil,
resource_type: nil,
resource_id: nil,
customer_online: nil,
customer_ip_address: nil,
updated_pending_transactions: nil,
updated_transactions: nil,
errors: [],
created_at: nil,
updated_at: nil
@doc """
[Lists account's transactions synchronizations](https://documentation.ibanity.com/xs2a/api#list-synchronizations) for a specific account information access request authorization.
Returns `{:ok, collection}` where `collection` is a `Ibanity.Collection` where items are of type `Ibanity.Xs2a.Synchronization`.
## Example
iex> Request.id(:financial_institution_id, "0f88f06c-3cfe-4b8f-9338-69981c0c4632")
...> |> Request.id(:account_information_access_request_id, "ce3893cd-fff5-435a-bdfc-d55a7e98df6f")
...> |> Synchronization.list
{:ok, %Ibanity.Collection{items: [%Ibanity.Synchronization{...}], ...}}
"""
def list(%Request{resource_ids: [financial_institution_id: _financial_institution_id, account_information_access_request_id: _account_information_access_request_id]} = request) do
request
|> Client.execute(:get, ["xs2a", "customer", "financialInstitution", "accountInformationAccessRequest", "initialAccountTransactionsSynchronizations"])
end
@doc """
[Creates a new synchronization resource](https://documentation.ibanity.com/xs2a/api#create-synchronization).
*Note that at this moment it only supports `account` as resource type.*
Returns `{:ok, synchronization}` if successful, `{:error, reason}` otherwise.
## Example
iex> [
...> resource_type: "account",
...> resource_id: "88099509-ce43-4a49-ba98-115af962d96d",
...> subtype: "accountDetails"
...> ]
...> |> Request.attributes
...> |> Request.customer_access_token("...")
...> |> Synchronization.create
{:ok, %Ibanity.Xs2a.Synchronization{id: "f92fc927-7c39-48c1-aa4b-2820efbfed00", ...}}
"""
def create(%Request{} = request) do
request
|> Request.id("")
|> Request.resource_type(@resource_type)
|> Client.execute(:post, @api_schema_path)
end
@doc """
[Retrieves a synchronization resource](https://documentation.ibanity.com/xs2a/api#get-synchronization).
Returns `{:ok, synchronization}` if successful, `{:error, reason}` otherwise.
## Example
iex> Request.id("0516f501-4a1c-4e37-8716-758f2bff8e37")
...> |> Request.customer_access_token("...")
...> |> Synchronization.find
{:ok, %Ibanity.Xs2a.Synchronization{id: "0516f501-4a1c-4e37-8716-758f2bff8e37"}}
"""
def find(%Request{} = request) do
request
|> Client.execute(:get, @api_schema_path)
end
@doc false
def key_mapping do
[
id: {~w(id), :string},
subtype: {~w(attributes subtype), :string},
status: {~w(attributes status), :string},
resource_type: {~w(attributes resourceType), :string},
resource_id: {~w(attributes resourceId), :string},
customer_online: {~w(attributes customerOnline), :boolean},
customer_ip_address: {~w(attributes customerIpAddress), :string},
errors: {~w(attributes errors), :string},
created_at: {~w(attributes createdAt), :datetime},
updated_at: {~w(attributes updatedAt), :datetime},
updated_pending_transactions: {~w(relationships updatedPendingTransactions links related), :string},
updated_transactions: {~w(relationships updatedTransactions links related), :string}
]
end
end