Packages

An Absinthe extension for composing GraphQL endpoints together

Current section

Files

Jump to
absinthe_compose lib absinthe compose http_client.ex
Raw

lib/absinthe/compose/http_client.ex

defmodule Absinthe.Compose.HTTPClient do
require Logger
def resolve(query, variables, opts, _resolution) do
url = Keyword.fetch!(opts, :url)
headers =
[
{"Content-Type", "application/json"},
{"Accept", "application/graphql"}
] ++ Keyword.get(opts, :headers, [])
body =
Jason.encode!(%{
query: query,
variables: variables
})
HTTPoison.post(url, body, headers)
|> handle_response()
end
def handle_response({:ok, %HTTPoison.Response{status_code: 200, body: body}}) do
body
|> Jason.decode()
|> handle_json()
end
def handle_response({:ok, %HTTPoison.Response{status_code: code}}) do
Logger.error("Non-200 Response from downstream graphql: #{code}")
{:error, "Unexpected Error"}
end
def handle_response({:error, %HTTPoison.Error{} = err}) do
Logger.error("Downstream error: #{inspect(err)}")
{:error, "Unexpected Error"}
end
def handle_json({:ok, %{"data" => data}}) do
{:ok, data}
end
def handle_json({:ok, other}) do
Logger.error("Downstream Unexpected JSON Response: #{inspect(other)}")
{:error, "Unexpected Error"}
end
def handle_json({:error, reason}) do
Logger.error("Downstream JSON Error: #{inspect(reason)}")
{:error, "Unexpected Error"}
end
end