Packages

OpenTravel API Extension for Elixir

Current section

Files

Jump to
ex_open_travel lib request.ex
Raw

lib/request.ex

defmodule ExOpenTravel.Request do
@moduledoc "Get HTTP request after validation payload"
alias ExOpenTravel.Response.Parser
@type options :: keyword() | any()
@spec send({String.t(), map()}, map(), Keyword.t(), options) ::
{:ok, map(), map()} | {:error, map(), map()}
def send(params, credentials, headers \\ [], opts \\ [])
def send({document, %{success: true} = meta}, %{endpoint: endpoint}, headers, opts) do
timeout = Keyword.get(opts, :timeout, 60_000)
recv_timeout = Keyword.get(opts, :recv_timeout, 120_000)
{_, payload} =
response =
HTTPoison.post(endpoint, document, headers, timeout: timeout, recv_timeout: recv_timeout)
with {:ok, parsed_response} <- Parser.handle_response(response) do
{:ok, parsed_response,
Map.merge(meta, %{
response: payload.body,
headers: payload.headers,
finished_at: DateTime.utc_now(),
request: document
})}
else
{:error, reason} ->
{:error, response,
Map.merge(meta, %{
success: false,
errors: [reason],
finished_at: DateTime.utc_now(),
request: document
})}
end
end
def send({document, %{success: false} = meta}, _, _headers, _opts) do
{:error, document, Map.merge(meta, %{success: false, errors: meta.errors})}
end
def send({:error, document, meta}, _, _headers, _opts) do
{:error, document, Map.merge(meta, %{success: false, errors: meta.errors})}
end
def send({document, meta}, _, _headers, _opts) do
{:error, document, Map.merge(meta, %{success: false, errors: [:invalid_endpoint]})}
end
end