lib/shared/request_service.ex

defmodule Transbank.Shared.RequestService do
  @environments %{
    production: "https://webpay3g.transbank.cl/",
    integration: "https://webpay3gint.transbank.cl/"
  }

  def new(environment, endpoint, commerce_code, api_key) do
    commerce_code = commerce_code
    api_key = api_key

    url =
      if is_nil(environment) do
        endpoint
      else
        @environments[environment] <> endpoint
      end

    middleware = [
      {Tesla.Middleware.BaseUrl, url},
      Tesla.Middleware.JSON,
      {Tesla.Middleware.Headers, headers(commerce_code, api_key)}
    ]

    Tesla.client(middleware)
  end

  def set_patpass(trx) do
    headers_patpass(trx.commerce_code, trx.api_key)
  end

  def post(client, body) do
    Tesla.post(client, "/", body) |> handle_response
  end

  def put(client, body) do
    Tesla.put(client, "/", body) |> handle_response
  end

  def get(client) do
    Tesla.get(client, "/") |> handle_response
  end

  def delete(client, body) do
    Tesla.delete(client, "/", body) |> handle_response
  end

  def headers(commerce_code, api_key) do
    [
      {"Tbk-Api-Key-Id", commerce_code},
      {"Tbk-Api-Key-Secret", api_key},
      {"Content-Type", "application/json"}
    ]
  end

  def headers_patpass(commerce_code, api_key) do
    [
      {"commercecode", commerce_code},
      {"Authorization", api_key},
      {"Content-Type", "application/json"}
    ]
  end

  defp handle_response({:ok, %{body: %{"error" => error}}}) do
    {:error, error}
  end

  defp handle_response({:ok, %{body: body}}) do
    {:ok, body}
  end
end