defmodule Client do @secret_key Application.get_env(:checkout_sdk, :secret_key) def get(%{id: id}, url) do client() |> Tesla.get("#{url}/#{id}") |> handle_response() end def get(url_query, url) when is_binary(url_query) do client() |> Tesla.get("#{url}?#{url_query}") |> handle_response() end def post(body, url) do client() |> Tesla.post(url, body) |> handle_response() end def update(%{id: id} = body, url) do client() |> Tesla.patch("#{url}/#{id}", body) |> handle_response() end def delete(%{id: id}, url) do client() |> Tesla.delete("#{url}/#{id}") |> handle_response() end defp client do middleware = [ {Tesla.Middleware.BaseUrl, "https://api.sandbox.checkout.com/"}, Tesla.Middleware.JSON, {Tesla.Middleware.Headers, [{"Authorization", "Bearer " <> @secret_key}, {"Content-Type", "application/json"}]} ] Tesla.client(middleware) end defp handle_response({:ok, %Tesla.Env{status: 204}}), do: {:ok, "Successful"} defp handle_response({:ok, %Tesla.Env{status: status, body: body}}) when status in 200..299, do: {:ok, body} defp handle_response({:ok, %Tesla.Env{status: 401}}), do: {:error, "unauthorized"} defp handle_response({:ok, %Tesla.Env{status: 404}}), do: {:error, "object not found"} defp handle_response({:ok, %Tesla.Env{status: 422, body: body}}) do {:error, %{ request_id: body["request_id"], error_type: body["error_type"], error_codes: body["error_codes"] }} end defp handle_response({:ok, %Tesla.Env{status: status, body: body}}), do: {:error, "Tesla returned status: #{status} with body: #{body}"} defp handle_response({:error, message}), do: {:error, message} end