defmodule CIPHER.DOWN do
require Record
require N2O
def start(login, pass, msg) do
spawn(fn ->
:n2o_pi.start(N2O.pi(module: __MODULE__, table: :cipher, sup: CIPHER,
state: {"local", login, pass, msg, true, []}, name: msg)) end)
end
def proc(:init, N2O.pi(state: {_, login, pass, msg_id, _, _}) = pi) do
bearer = case :application.get_env(:n2o, :jwt_prod, false) do
false -> :application.get_env(:n2o, :bearer, [])
true -> CIPHER.auth(login, pass)
end
CIPHER.download(bearer, msg_id) |> savePayload
CIPHER.downloadSignature(bearer, msg_id) |> saveSignatures
CIPHER.cancel(msg_id)
{:ok, pi}
end
def proc(_,pi) do
{:noreply, pi}
end
def savePayload({status, id, body}) do
:filelib.ensure_dir("priv/download/")
case status do
{_,200,_} ->
file = "priv/download/" <> :erlang.list_to_binary(id)
:file.write_file(file, body, [:binary,:raw])
_ -> :skip
end
end
def saveSignatures({status, id, body}) do
case {status,body} do
{{_,200,_},[]} -> CIPHER.warning 'DOWNLOAD SIGNATURE: empty for ~ts', [id]
{{_,200,_},signatures} ->
:lists.map(fn res ->
sid = :maps.get "id", res
sign = :maps.get("signature", res) |> :base64.decode
CIPHER.debug 'DOWNLOAD SIGNATURE: ~ts', [sid]
file = "priv/download/" <> :erlang.list_to_binary(id) <> "-" <> sid <> ".p7s"
:file.write_file(file, sign, [:binary,:raw])
end, signatures)
_ -> :skip
end
end
end