Current section
Files
Jump to
Current section
Files
lib/annon_client/request.ex
defmodule Annon.Client.Request.Latencies do
@moduledoc false
@derive [Poison.Encoder]
defstruct gateway: nil,
upstream: nil,
client_request: nil
end
defmodule Annon.Client.Request.Response do
@moduledoc false
@derive [Poison.Encoder]
defstruct headers: nil,
body: nil
end
defmodule Annon.Client.Request.Request do
@moduledoc false
@derive [Poison.Encoder]
defstruct method: nil,
uri: nil,
query: nil,
headers: nil,
body: nil
end
defmodule Annon.Client.Request do
@moduledoc """
REST client to the Annon API Gateway requests.
"""
use Annon.Client.Base
alias Annon.Client.Request.Request, as: RequestStruct
alias Annon.Client.Request.Response, as: ResponseStruct
alias Annon.Client.Request.Latencies, as: LatenciesStruct
alias Annon.Client.Request
alias Annon.Client.API
alias HTTPoison.Response
@derive [Poison.Encoder]
defstruct id: nil,
api: %API{},
request: %RequestStruct{},
response: %ResponseStruct{},
latencies: %LatenciesStruct{},
idempotency_key: nil,
ip_address: nil,
status_code: nil
def list_requests(opts) do
management_endpoint = Keyword.fetch!(opts, :management_endpoint)
query =
%{limit: Keyword.get(opts, :limit, 25)}
|> maybe_filter_by_idempotency_key(Keyword.get(opts, :idempotency_key))
|> maybe_filter_by_api_ids(Keyword.get(opts, :api_ids))
|> maybe_filter_by_status_codes(Keyword.get(opts, :status_codes))
|> maybe_filter_by_ip_addresses(Keyword.get(opts, :ip_addresses))
request_params = "?" <> URI.encode_query(query)
reqest_uri = "#{management_endpoint}/requests#{request_params}"
with {:ok, %Response{body: encoded_body, status_code: 200}} <- get(reqest_uri),
{:ok, %{"data" => requests}} <- Poison.decode(encoded_body, as: %{"data" => [%Request{}]}) do
requests
else
{:ok, %Response{status_code: status_code}} ->
throw "Error receiving Requests: invalid response status code. " <>
"Expected: 200, got: #{to_string(status_code)}"
{:ok, data} ->
throw "Error receiving Requests: invalid response structure. " <>
"Expected list of Requests, got: #{inspect data}"
{:error, reason} ->
throw "Error receiving Requests: #{inspect reason}."
end
end
defp maybe_filter_by_idempotency_key(query, nil),
do: query
defp maybe_filter_by_idempotency_key(query, idempotency_key),
do: Map.put(query, :idempotency_key, idempotency_key)
defp maybe_filter_by_api_ids(query, nil),
do: query
defp maybe_filter_by_api_ids(query, api_ids),
do: Map.put(query, :api_ids, api_ids)
defp maybe_filter_by_status_codes(query, nil),
do: query
defp maybe_filter_by_status_codes(query, status_codes),
do: Map.put(query, :status_codes, status_codes)
defp maybe_filter_by_ip_addresses(query, nil),
do: query
defp maybe_filter_by_ip_addresses(query, ip_addresses),
do: Map.put(query, :ip_addresses, ip_addresses)
def get_request(request_id, opts) do
management_endpoint = Keyword.fetch!(opts, :management_endpoint)
reqest_uri = "#{management_endpoint}/requests/#{request_id}"
with {:ok, %Response{body: encoded_body, status_code: 200}} <- get(reqest_uri),
{:ok, %{"data" => request}} <- Poison.decode(encoded_body, as: %{"data" => %Request{}}) do
request
else
{:ok, %Response{status_code: status_code}} ->
throw "Error receiving Request: invalid response status code. " <>
"Expected: 200, got: #{to_string(status_code)}"
{:ok, data} ->
throw "Error receiving Request: invalid response structure. " <>
"Expected list of Request, got: #{inspect data}"
{:error, reason} ->
throw "Error receiving Request: #{inspect reason}."
end
end
def delete_request(%Request{id: request_id}, opts) do
management_endpoint = Keyword.fetch!(opts, :management_endpoint)
reqest_uri = "#{management_endpoint}/requests/#{request_id}"
case delete(reqest_uri) do
{:ok, %HTTPoison.Response{status_code: 204}} -> :ok
{:error, reason} -> throw "Error deleting API: #{inspect reason}."
end
end
end