Current section
Files
Jump to
Current section
Files
lib/paddle/request.ex
defmodule Paddle.Request do
@moduledoc """
Request
"""
@doc """
Creates a new request
"""
def post(path, params \\ %{}) do
url = vendors_base_url() <> path
config = Paddle.Config.resolve() |> Map.take([:vendor_id, :vendor_auth_code])
params = Map.merge(config, params)
request =
Peppermint.post(
url,
params: params,
headers: [{"Content-Type", "application/x-www-form-urlencoded"}]
)
case request do
{:ok, response} ->
parse_response_body(response.body)
{:error, %Mint.TransportError{} = error} ->
{:error, parse_transport_error(error)}
{:error, reason} ->
{:error, reason}
end
end
def get(path, params \\ %{}) do
url = checkout_base_url() <> path
case Peppermint.get(url, params: params) do
{:ok, response} ->
parse_response_body(response.body)
{:error, %Mint.TransportError{} = error} ->
{:error, parse_transport_error(error)}
{:error, reason} ->
{:error, reason}
end
end
defp parse_response_body(request_body) do
body = Jason.decode!(request_body)
case body do
%{"success" => true, "response" => response} -> {:ok, response}
%{"success" => true, "message" => message} -> {:ok, message}
%{"success" => true} -> {:ok, nil}
%{"success" => false} -> {:error, parse_api_error(body["error"])}
_ -> body
end
end
defp parse_api_error(error) do
%Paddle.Error{
code: error["code"],
message: error["message"]
}
end
defp parse_transport_error(%Mint.TransportError{} = error) do
%Paddle.Error{
code: error.reason,
message: Mint.TransportError.message(error)
}
end
defp vendors_base_url do
case Paddle.Config.resolve() do
%{environment: :production} -> "https://vendors.paddle.com/api"
%{environment: :sandbox} -> "https://sandbox-vendors.paddle.com/api"
%{environment: :test} -> "http://localhost:12345/api"
end
end
defp checkout_base_url do
case Paddle.Config.resolve() do
%{environment: :production} -> "https://checkout.paddle.com/api"
%{environment: :sandbox} -> "https://sandbox-checkout.paddle.com/api"
%{environment: :test} -> "http://localhost:12345/api"
end
end
end