defmodule Dust.FileRef do
@moduledoc "Reference to a file stored in Dust. Returned by Dust.get/2 when the value is a file."
defstruct [:hash, :size, :content_type, :filename, :uploaded_at, :_server_url, :_token]
@doc "Create a FileRef from a raw map (as stored in cache)."
def from_map(map, opts \\ []) do
%__MODULE__{
hash: map["hash"],
size: map["size"],
content_type: map["content_type"],
filename: map["filename"],
uploaded_at: map["uploaded_at"],
_server_url: opts[:server_url],
_token: opts[:token]
}
end
@doc "Fetch the file content as binary over HTTP."
def fetch(%__MODULE__{} = ref) do
url = "#{ref._server_url}/api/files/#{URI.encode(ref.hash)}"
headers = [{"authorization", "Bearer #{ref._token}"}]
case Req.get(url, headers: headers) do
{:ok, %{status: 200, body: body}} -> {:ok, body}
{:ok, %{status: status}} -> {:error, {:http_error, status}}
{:error, reason} -> {:error, reason}
end
end
@doc "Download the file to a local path."
def download(%__MODULE__{} = ref, path) do
case fetch(ref) do
{:ok, content} -> File.write(path, content)
error -> error
end
end
end