lib/ibanity/api/sandbox/financial_institution_user.ex

defmodule Ibanity.Sandbox.FinancialInstitutionUser do
  @moduledoc """
  [Financial institution user](https://documentation.ibanity.com/xs2a/api#financial-institution-user) API wrapper
  """

  use Ibanity.Resource

  @api_schema_path ["sandbox", "financialInstitutionUsers"]

  defstruct id: nil,
            first_name: nil,
            last_name: nil,
            login: nil,
            password: nil,
            created_at: nil,
            updated_at: nil

  @resource_type "financial_institution_user"

  @doc """
  [Creates a new financial institution user](https://documentation.ibanity.com/xs2a/api#create-financial-institution-user).

  Returns `{:ok, user}` when successful, `{:error, reason}` otherwise.

  ## Example

      iex> [
      ...>   login: "jlopez",
      ...>   password: "password",
      ...>   last_name: "Lopez",
      ...>   first_name: "Jane"
      ...> ]
      ...> |> Request.attributes
      ...> |> Ibanity.FinancialInstitutionUser.create
      {:ok, %Ibanity.FinancialInstitutionUser{id: "5178d658-0c33-440a-a3af-616a8e472617", ...}}
  """
  def create(%Request{} = request) do
    request
    |> Request.id(:id, "")
    |> Request.resource_type(@resource_type)
    |> Client.execute(:post, @api_schema_path)
  end

  @doc """
  [Lists all financial institution users](https://documentation.ibanity.com/xs2a/api#list-financial-institution-users).

  Returns `{:ok, collection}` where `collection` is of type `Ibanity.Collection` and its items are of type `Ibanity.FinancialInstitutionUser`,
  otherwise returns `{:error, reason}`.

  ## Example

      iex> Ibanity.FinancialInstitutionUser.list
      {:ok, %Ibanity.Collection{items: [%Ibanity.FinancialInstitutionUser{...}], ...}}
  """
  def list(%Request{} = request) do
    request
    |> Request.id(:id, "")
    |> Client.execute(:get, @api_schema_path)
  end
  def list, do: list(%Request{})

  @doc """
  Finds a financial institution user based on its id.

  Returns `{:ok, user}` when successful, `{:error, reason}` otherwise.

  ## Example

      iex>
      ...> |> Request.attribute()
      ...> |> Ibanity.FinancialInstitutionUser.find
      {:ok, %Ibanity.FinancialInstitutionUser{id: "5178d658-0c33-440a-a3af-616a8e472617", ...}}
  """
  def find(%Request{} = request) do
    request
    |> Client.execute(:get, @api_schema_path)
  end

  @doc """
  [Updates a financial institution user](https://documentation.ibanity.com/xs2a/api#update-financial-institution-user).

  Returns `{:ok, user}` when successful, `{:error, reason}` otherwise.

  ## Example

      iex> [
      ...>   login: "jlopez",
      ...>   password: "password",
      ...>   last_name: "Lopez",
      ...>   first_name: "Jane"
      ...> ]
      ...> |> Request.attributes
      ...> |> Request.id(:id, "0934789d-e177-484f-b197-f60b40b0f9c4")
      ...> |> Ibanity.FinancialInstitutionUser.update
      {:ok, %Ibanity.FinancialInstitutionUser{id: "5178d658-0c33-440a-a3af-616a8e472617", ...}}

  """
  def update(%Request{} = request) do
    request
    |> Request.resource_type(@resource_type)
    |> Client.execute(:patch, @api_schema_path)
  end

  @doc """
  [Deletes a financial institution user](https://documentation.ibanity.com/xs2a/api#deletefinancial-institution-user).

  Returns `{:ok, user}` when successful, `{:error, reason}` otherwise.

  ## Example

      iex> |> Request.id(:id, "0934789d-e177-484f-b197-f60b40b0f9c4")
      ...> |> Ibanity.FinancialInstitutionUser.update
      {:ok, %Ibanity.FinancialInstitutionUser{id: "5178d658-0c33-440a-a3af-616a8e472617", ...}}
  """
  def delete(%Request{} = request) do
    request
    |> Client.execute(:delete, @api_schema_path)
  end

  @doc false
  def key_mapping do
    [
      id: {~w(id), :string},
      first_name: {~w(attributes firstName), :string},
      last_name: {~w(attributes lastName), :string},
      login: {~w(attributes login), :string},
      password: {~w(attributes password), :string},
      created_at: {~w(attributes createdAt), :datetime},
      updated_at: {~w(attributes updatedAt), :datetime}
    ]
  end
end