defmodule Dwolla.Webhook do
@moduledoc """
Functions for `webhooks` endpoint.
"""
alias Dwolla.Utils
defstruct id: nil, topic: nil, account_id: nil, event_id: nil,
subscription_id: nil, attempts: nil
@type t :: %__MODULE__{id: String.t,
topic: String.t,
account_id: String.t,
event_id: String.t,
subscription_id: String.t,
attempts: [Dwolla.Webhook.Attempt.t]
}
@type token :: String.t
@type id :: String.t
@type error :: HTTPoison.Error.t | Dwolla.Errors.t | tuple
@type location :: %{id: String.t}
@endpoint "webhooks"
defmodule Attempt do
@moduledoc """
Dwolla Webhook Attempt data structure.
"""
defstruct id: nil, request: nil, response: nil
@type t :: %__MODULE__{id: String.t,
request: Dwolla.Webhook.Attempt.Request.t,
response: Dwolla.Webhook.Attempt.Response.t
}
defmodule Request do
@moduledoc """
Dwolla Webhook Attempt Request data structure.
"""
defstruct timestamp: nil, url: nil, headers: [], body: nil
@type t :: %__MODULE__{timestamp: String.t,
url: String.t,
headers: list,
body: String.t
}
end
defmodule Response do
@moduledoc """
Dwolla Webhook Attempt Response data structure.
"""
defstruct timestamp: nil, headers: [], status_code: nil, body: nil
@type t :: %__MODULE__{timestamp: String.t,
headers: list,
status_code: integer,
body: String.t
}
end
end
defmodule Retry do
@moduledoc """
Dwolla Webhook Retry data structure.
"""
defstruct id: nil, timestamp: nil
@type t :: %__MODULE__{id: String.t, timestamp: String.t}
end
@doc """
Gets a webhook by id.
"""
@spec get(token, id) :: {:ok, Dwolla.Webhook.t} | {:error, error}
def get(token, id) do
endpoint = @endpoint <> "/#{id}"
Dwolla.make_request_with_token(:get, endpoint, token)
|> Utils.handle_resp(:webhook)
end
@doc """
Retries a webhooks by id.
"""
@spec retry(token, id) :: {:ok, location} | {:error, error}
def retry(token, id) do
endpoint = @endpoint <> "/#{id}/retries"
Dwolla.make_request_with_token(:post, endpoint, token)
|> Utils.handle_resp(:webhook)
end
@doc """
Gets webhook retries by id.
"""
@spec list_retries(token, id) ::
{:ok, [Dwolla.Webhook.Retry.t]} | {:error, error}
def list_retries(token, id) do
endpoint = @endpoint <> "/#{id}/retries"
Dwolla.make_request_with_token(:get, endpoint, token)
|> Utils.handle_resp(:retry)
end
end