Current section
Files
Jump to
Current section
Files
lib/ups_package_tracking_client.ex
defmodule UpsPackageTrackingClient do
@moduledoc """
Public interface for the library.
"""
@production_hostname "onlinetools.ups.com"
@http_client Application.get_env(
:ups_package_tracking_client,
:http_client,
UpsPackageTrackingClient.HttpClient.HTTPoison
)
defp api_hostname() do
Application.get_env(:ups_package_tracking_client, :api_hostname, @production_hostname)
end
@doc """
Query UPS for the tracking status of a tracking number
"""
@spec track(String.t(), String.t(), String.t()) ::
{:ok, UpsPackageTrackingClient.TrackingResponse.t()} | {:error, any()}
def track(tracking_number, access_key, locale \\ "en_US") do
with {:ok, %HTTPoison.Response{status_code: 200, body: body}} <-
@http_client.get(
"https://#{api_hostname()}/track/v1/details/#{tracking_number}?locale=#{locale}",
[
{"AccessLicenseNumber", access_key},
{"Content-Type", "application/json"},
{"Accept", "application/json"}
],
[]
),
{:ok, %{"trackResponse" => response}} <- Jason.decode(IO.inspect(body)) do
response
|> UpsPackageTrackingClient.TrackingResponse.build()
else
{:ok, %HTTPoison.Response{status_code: status_code, body: body}}
when status_code >= 400 and status_code < 600 ->
{:ok, %{"response" => %{"errors" => errors}}} = Jason.decode(body)
{:error, errors}
end
end
end