Current section

Files

Jump to
clicksign lib clicksign.ex
Raw

lib/clicksign.ex

defmodule Clicksign do
def config do
Application.get_env(:clicksign, Clicksign) |> Enum.into(%{})
end
def all do
HTTPoison.get!("#{config.host}/#{config.api_version}/documents?access_token==#{config.token}", ["Accept": "application/json"])
|> Map.get(:body)
|> JSX.decode([{:labels, :atom}])
end
def process_signer(payload) do
Enum.map(payload, fn{k, v} -> {"signers[][#{k}]", v} end)
end
def process_signers(payload) do
Enum.reduce(payload, [], &(&2 ++ process_signer(&1)))
end
def process_file(payload) do
{
payload.name,
payload.file,
{ ["form-data"], [name: "document[archive][original]", filename: payload.name]},
[]
}
end
def process_payload(payload) do
skip_email = if payload.skip_email, do: "true", else: "false"
list = [] ++ process_signers(payload.signers)
list = list ++ [{"skip_email", skip_email}]
list = list ++ [process_file(payload.document)]
{:multipart, list}
end
def create(payload) do
headers = ["Accept": "application/json", "Content-Type": "multipart/form-data; boundary=----WebKitFormBoundaryjm7rLhiPSO6cEjWs"]
url = "#{config.host}/#{config.api_version}/documents?access_token=#{config.token}"
params = process_payload(payload)
case HTTPoison.post(url, params, headers) do
{:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
{:ok, result} = JSX.decode(body, [{:labels, :atom}])
result |> Map.get(:document)
{:ok, %HTTPoison.Response{status_code: 401, body: body}} ->
body
{:ok, %HTTPoison.Response{status_code: 404, body: body}} ->
"Not found :("
{:error, %HTTPoison.Error{reason: reason}} ->
IO.inspect reason
end
end
def list(key, payload) do
headers = ["Accept": "application/json"]
url = "#{config.host}/#{config.api_version}/documents/#{key}/list?access_token=#{config.token}"
params = JSX.encode!(payload)
case HTTPoison.post(url, params, headers) do
{:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
{:ok, result} = JSX.decode(body, [{:labels, :atom}])
result
{:ok, %HTTPoison.Response{status_code: 401, body: body}} ->
body
{:ok, %HTTPoison.Response{status_code: 404, body: body}} ->
"Not found :("
{:error, %HTTPoison.Error{reason: reason}} ->
IO.inspect reason
end
end
def cancel(key) do
headers = ["Accept": "application/json"]
url = "#{config.host}/#{config.api_version}/documents/#{key}/cancel?access_token=#{config.token}"
case HTTPoison.post(url, [], headers) do
{:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
{:ok, result} = JSX.decode(body, [{:labels, :atom}])
result |> Map.get(:document)
{:ok, %HTTPoison.Response{status_code: 401, body: body}} ->
body
{:ok, %HTTPoison.Response{status_code: 404, body: body}} ->
"Not found :("
{:error, %HTTPoison.Error{reason: reason}} ->
IO.inspect reason
end
end
end