Current section

Files

Jump to
astra lib http_base.ex
Raw

lib/http_base.ex

defmodule Astra.HttpBase do
@moduledoc false
@config Application.get_all_env(:astra)
defmacro __using__(opts) do
path = Keyword.get(opts, :path, "")
url = "https://#{@config[:id]}-#{@config[:region]}.apps.astra.datastax.com/api/"
quote do
def parse_response({:ok, %HTTPoison.Response{status_code: 200, body: body}}), do: {:ok, Map.get(Jason.decode!(body, keys: :atoms), :data)}
def parse_response({:ok, %HTTPoison.Response{status_code: 201, body: body}}), do: {:ok, Jason.decode!(body, keys: :atoms)}
def parse_response({:ok, %HTTPoison.Response{status_code: 204}}), do: {:ok, []}
def parse_response({:ok, %HTTPoison.Response{status_code: 409}}), do: {:rejected, "duplicate"}
def parse_response(resp), do: {:error, resp}
def process_request_url(sub_path), do: unquote(url <> path) <> sub_path
def process_request_headers(headers) do
{:ok, token} = Astra.TokenManager.get_token
headers ++ [{"Content-Type", "application/json"},
{"accept", "application/json"},
{"x-cassandra-token", token},
{"x-cassandra-request-id", UUID.uuid1()}]
end
def process_request_options(options), do: options ++ [ssl: [{:versions, [:'tlsv1.2']}]]
def json!(entity) do
{:ok, body} = Jason.encode(entity)
body
end
end
end
end