Skip to main content

lib/pomelo_ex/cards/tokenization/delete_token.ex

defmodule PomeloEx.Cards.Tokenization.DeleteToken do
  @moduledoc false

  alias PomeloEx.Types.Cards.Tokenization.DeleteTokenType

  def execute(%DeleteTokenType{token: token, external_token_id: external_token_id} = payload) do
    headers = build_headers(token)

    body =
      payload
      |> Map.from_struct()
      |> Map.delete(:token)
      |> Map.delete(:external_token_id)
      |> Enum.reject(fn {_, v} -> v == nil end)
      |> Enum.into(%{})
      |> Jason.encode!()

    PomeloEx.Client.request(
      :post,
      "/tokenization/v1/tokens/#{external_token_id}/deletion",
      body,
      headers
    )
  end

  defp build_headers(token) do
    idempotency_key_length = Application.get_env(:pomelo_ex, :idempotency_key_length)

    idempotency_key =
      idempotency_key_length
      |> :crypto.strong_rand_bytes()
      |> Base.encode64(padding: false)
      |> binary_part(0, idempotency_key_length)

    [
      {"Content-Type", "application/json"},
      {"Authorization", "Bearer #{token}"},
      {"x-idempotency-key", idempotency_key}
    ]
  end
end