defmodule GnApiSdkElixir.Request do @moduledoc false def base_url do if Application.get_env(:gerencianet, :sandbox), do: "https://sandbox.gerencianet.com.br", else: "https://sandbox.gerencianet.com.br" end def headers do [{"Content-Type", "application/json"}] end def auth do body = Jason.encode!(%{grant_type: :client_credentials}) credentials = "#{Application.get_env(:gerencianet, :client_id)}:#{Application.get_env(:gerencianet, :client_secret)}" |> Base.encode64() headers = [{"Authorization", "Basic #{credentials}"} | headers()] HTTPoison.post("#{base_url()}/v1/authorize", body, headers) |> parse_response() end def access_header do with {:ok, tokens} <- auth() do {:ok, {"Authorization", "Bearer #{tokens.access_token}"}} end end def get(uri) do with {:ok, token} <- access_header() do HTTPoison.get("#{base_url()}#{uri}", [token | headers()]) |> parse_response() end end def post(uri, data) do with {:ok, token} <- access_header() do HTTPoison.post("#{base_url()}#{uri}", Jason.encode!(data), [token | headers()]) |> parse_response() end end def put(uri, data) do with {:ok, token} <- access_header() do HTTPoison.put("#{base_url()}#{uri}", Jason.encode!(data), [token | headers()]) |> parse_response() end end def delete(uri) do with {:ok, token} <- access_header() do HTTPoison.delete("#{base_url()}#{uri}", [token | headers()] ) |> parse_response() end end def parse_response(request) do case request do {:ok, %HTTPoison.Response{status_code: 200, body: body}} -> {:ok, Jason.decode!(body, keys: :atoms)} {:ok, %HTTPoison.Response{status_code: 404}} -> {:error, 404} {:error, %HTTPoison.Error{reason: reason}} -> {:error, reason} end end end