Packages

An HTTP client for the Beanstalk API written in Elixir.

Current section

Files

Jump to
beanstalk lib beanstalk.ex
Raw

lib/beanstalk.ex

defmodule Beanstalk do
@moduledoc false
use Application
use HTTPoison.Base
def start(_type, _args) do
Beanstalk.Supervisor.start_link
end
def process_url(endpoint) do
super("https://" <> account() <> ".beanstalkapp.com/api/" <> endpoint)
end
defp process_request_headers([]) do
# Set the default headers required for Beanstalk
Map.new
|> Map.put('Content-Type', 'application/json')
|> Map.put('Accept', 'application/json')
|> Map.to_list
end
def process_request_body(body) do
JSX.encode!(body)
end
def process_response_body(body) do
JSX.decode(body)
end
defp request(method, url, body, headers, options) do
# Attach the authentication required by Beanstalk
options = Enum.concat([hackney: [basic_auth: { username(), password() }]], options)
super(method, url, body, headers, options)
end
def get(url) do
super(url)
|> parse_response
end
def post(url, parameters) do
super(url, parameters)
|> parse_response
end
def put(url, parameters) do
super(url, parameters)
|> parse_response
end
def patch(url, parameters) do
super(url, parameters)
|> parse_response
end
def delete(url) do
super(url)
|> parse_response
end
defp parse_response(response) do
case response do
{:ok, %HTTPoison.Response{status_code: status_code, body: {:error, :badarg}}} when status_code in 200..299 ->
{:ok, :empty}
{:ok, %HTTPoison.Response{status_code: status_code} = response } when status_code in 200..201 ->
response.body
{:ok, %HTTPoison.Response{status_code: status_code} = response } when status_code in 202..299 ->
{:ok, response.body}
{:ok, %HTTPoison.Response{status_code: status_code} = response } when status_code in 400..599 ->
{:error, get_error_messages(response.body)}
{:error, %HTTPoison.Error{reason: reason}} ->
{:error, get_error_messages(reason)}
end
end
defp get_error_messages(error) do
case error do
"timeout" ->
"The end-point timed out. This could mean the resource you're looking for couldn't be found. Did you supply the right parameters?"
:timeout ->
"The end-point timed out. This could mean the resource you're looking for couldn't be found. Did you supply the right parameters?"
{:ok, %{"error" => error}} ->
error
{:ok, %{"errors" => errors}} ->
to_string(errors)
end
end
def account do
Application.get_env(:beanstalk, :account) ||
System.get_env(:beanstalk_account)
end
def username do
Application.get_env(:beanstalk, :username) ||
System.get_env(:beanstalk_username)
end
def password do
Application.get_env(:beanstalk, :password) ||
System.get_env(:beanstalk_password)
end
end