defmodule Dwolla.Document do @moduledoc """ Functions for `documents` endpoint. """ alias Dwolla.Utils defstruct id: nil, type: nil, status: nil, created: nil, failure_reason: nil @type t :: %__MODULE__{id: String.t, type: String.t, # passport | license | idCard | other status: String.t, # pending | reviewed created: String.t, failure_reason: String.t } @type token :: String.t @type id :: String.t @type error :: HTTPoison.Error.t | Dwolla.Errors.t | tuple @type location :: %{id: String.t} @endpoint "documents" @headers %{ "Cache-Control" => "no-cache", "Content-Type" => "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW" } @doc """ Upload a document for a customer. Accepted document type values: - `passport` - `license` - `idCard` - `other` """ @spec create(token, id, String.t, String.t) :: {:ok, location} | {:error, error} def create(token, customer_id, document_type, file) do endpoint = "customers/#{customer_id}/#{@endpoint}" form = {:multipart, [ {:file, file}, {"documentType", document_type} ]} Dwolla.make_request_with_token(:post, endpoint, token, form, @headers) |> Utils.handle_resp(:document) end @doc """ List a customer's documents. """ @spec list(token, id) :: {:ok, [Dwolla.Document.t]} | {:error, error} def list(token, customer_id) do endpoint = "customers/#{customer_id}/#{@endpoint}" Dwolla.make_request_with_token(:get, endpoint, token) |> Utils.handle_resp(:document) end @doc """ Get a document. """ @spec get(token, id) :: {:ok, Dwolla.Document.t} | {:error, error} def get(token, id) do endpoint = @endpoint <> "/#{id}" Dwolla.make_request_with_token(:get, endpoint, token) |> Utils.handle_resp(:document) end end