defmodule Vuforex do @moduledoc """ HTTP Client for Vuforia Web Services. """ alias Calendar.DateTime.Format @api_url Application.compile_env(:vuforex, :base_url) @server_access_key Application.compile_env(:vuforex, :server_access_key) @spec summary() :: {:ok, map()} | {:error, map()} @doc """ Get a summary of images from a cloud database. ## Examples iex> Vuforex.summary() {:ok, %{ "result_code" => "Success", "active_images" => 0, "current_month_recos" => 0, "failed_images" => 0, "inactive_images" => 0, "name" => "Vuforex", "previous_month_recos" => 0, "processing_images" => 0, "reco_threshold" => 1000, "request_quota" => 100000, "request_usage" => 0, "target_quota" => 1000, "total_recos" => 0, "transaction_id" => "659755bdbaf2406dad42f267ef877a7a" } } """ def summary do time = Format.httpdate(DateTime.utc_now()) signature = Vuforex.Signature.generate("/summary", nil, "GET", time) case Tesla.get(tesla_client(signature, time), "#{@api_url}/summary") do {:ok, %Tesla.Env{status: status, body: summary}} when status in [200, 201] -> {:ok, Jason.decode!(summary)} {:ok, %Tesla.Env{status: status, body: body}} when status not in [200, 201] -> {:error, Jason.decode!(body)} end end def get_tesla_client(signature, time), do: tesla_client(signature, time) defp tesla_client(signature, time) do middleware = [ {Tesla.Middleware.BaseUrl, @api_url}, {Tesla.Middleware.Headers, [ {"Date", time}, {"Authorization", "VWS #{@server_access_key}:#{signature}"} ]} ] Tesla.client(middleware) end end