Skip to main content

lib/pomelo_ex/cards/tokenization/visa/provisioning_apple_pay.ex

defmodule PomeloEx.Cards.Tokenization.Visa.ProvisioningApplePay do
  @moduledoc false

  alias PomeloEx.Types.Cards.Tokenization.Visa.ProvisioningApplePayType

  def execute(%ProvisioningApplePayType{token: token} = payload) do
    headers = build_headers(token)

    body =
      payload
      |> Map.from_struct()
      |> Map.delete(:token)
      |> Jason.encode!()

    PomeloEx.Client.request(:post, "/token-provisioning/visa/apple-pay", 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