lib/dwolla/event.ex

defmodule Dwolla.Event do
  @moduledoc """
  Functions for `events` endpoint.
  """

  alias Dwolla.Utils

  defstruct id: nil, created: nil, topic: nil, resource: nil, resource_id: nil

  @type t :: %__MODULE__{id: String.t,
                         created: String.t,
                         topic: String.t,
                         resource: String.t,
                         resource_id: String.t
                        }

  @type token :: String.t
  @type id :: String.t
  @type error :: HTTPoison.Error.t | Dwolla.Errors.t | tuple

  @endpoint "events"

  @doc """
  Lists events. Results paginated.
  """
  @spec list(token, integer | nil, integer | nil) :: {:ok, [Dwolla.Event.t]} | {:error, error}
  def list(token, limit \\ nil, offset \\ nil) do
    endpoint =
      case {limit, offset} do
        {nil, nil}    -> @endpoint
        {limit, nil}  -> "#{@endpoint}/?" <> Utils.encode_params(%{limit: limit})
        _             -> "#{@endpoint}/?" <> Utils.encode_params(%{limit: limit, offset: offset})
      end
    Dwolla.make_request_with_token(:get, endpoint, token)
    |> Utils.handle_resp(:event)
  end

  @doc """
  Gets a funding source by id.
  """
  @spec get(token, id) :: {:ok, Dwolla.Event.t} | {:error, error}
  def get(token, id) do
    endpoint = @endpoint <> "/#{id}"
    Dwolla.make_request_with_token(:get, endpoint, token)
    |> Utils.handle_resp(:event)
  end
end