lib/ibanity/api/consent/processing_operation.ex

defmodule Ibanity.Consent.ProcessingOperation do
  @moduledoc """
  """

  use Ibanity.Resource

  @api_schema_path  ~w(consent consent processingOperations)
  @revoke_api_schema_path ~w(consent consent processingOperation revocations)

  @resource_type "processing_operation"

  defstruct id: nil,
            business_domain: nil,
            revoked_at: nil,
            recurrent: nil,
            data_source_category: nil,
            data_source_host: nil,
            data_source_type: nil,
            data_source_reference: nil,
            it_service: nil,
            consent_id: nil,
            status: nil

  @doc """
  [Creates a processing operation].

  Returns `{:ok, processing_operation}` if successful, `{:error, reason}` otherwise.

  ## Example

      iex> [
      ...>   business_domain: "Legal",
      ...>   recurrent: true,
      ...>   ...
      ...> ]
      ...> |> Request.attributes
      ...> |> Request.id(:consent_id, "b5d6c5f9-e1d2-4cd1-a2aa-7baf964f7bf7")
      ...> |> ProcessingOperation.create
      {:ok, %Ibanity.Consent.ProcessingOperation{id: "270141aa-0c93-42a5-9adf-e2b9a8ab4cea"}}
  """
  def create(%Request{} = request) do
    request
    |> Request.resource_type(@resource_type)
    |> Client.execute(:post, @api_schema_path)
  end

  @doc """
  [Lists all processing operations belonging to a consent].

  Returns `{:ok, collection}` where `collection` is a `Ibanity.Collection` where items are of type `Ibanity.Consent.ProcessingOperation`,
  otherwise it returns `{:error, reason}`.

  ## Example

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

    @doc """
  [Revokes a processing operation].

  Returns `{:ok, processing_operation}` if successful, `{:error, reason}` otherwise.

  ## Example

      iex> [
      ...>   consent_id: "270141aa-0c93-42a5-9adf-e2b9a8ab4cea"
      ...>   id: "55c09df6-0bdd-46ef-8e66-e5297e0e8a7f"
      ...> ]
      ...> |> Request.ids
      ...> |> ProcessingOperation.revoke
      {:ok, %Ibanity.Consent.ProcessingOperation{id: "55c09df6-0bdd-46ef-8e66-e5297e0e8a7f"}}
  """
  def revoke(%Request{} = request) do
    request
    |> Client.execute(:post, @revoke_api_schema_path)
  end

  @doc false
  def key_mapping do
    [
      id: {~w(id), :string},
      business_domain: {~w(attributes businessDomain), :string},
      revoked_at: {~w(attributes revokedAt), :datetime},
      recurrent: {~w(attributes recurrent), :boolean},
      data_source_category: {~w(attributes dataSourceCategory), :string},
      data_source_host: {~w(attributes dataSourceHost), :string},
      data_source_type: {~w(attributes dataSourceType), :string},
      data_source_reference: {~w(attributes dataSourceReference), :string},
      it_service: {~w(attributes itService), :string},
      status: {~w(attributes status), :string}
    ]
  end
end