defmodule HonuWeb.Storage.Disk do
alias Honu.Attachments.Blob
alias HonuWeb.Storage
@behaviour Storage
@impl true
def url(conn, blob = %Blob{}, opts \\ []) do
data =
Storage.generate_data(%{
key: blob.key,
disposition: Storage.content_disposition_with(blob.filename, opts[:disposition])
# content_type: content_type
# service_name: name
})
Storage.base_url(conn)
|> URI.merge(path(blob, data))
|> URI.merge(blob_query(blob, opts))
|> to_string
end
def blob_content_disposition(blob, %{disposition: disposition, filename: filename}) do
"#{disposition}; filename=\"#{filename}\"; filename*=UTF-8''#{blob.filename}"
end
defp path(blob, data) do
"/#{Storage.namespace()}/storage/disk/#{data}--#{Storage.generate_digest(data)}/#{Storage.sanitized_filename(blob.filename)}"
end
defp blob_query(blob, opts) do
map = Storage.content_disposition_with(blob.filename, opts[:disposition])
URI.encode_query(%{
"content_type" => blob.content_type,
"disposition" => blob_content_disposition(blob, map)
})
|> (&"?#{&1}").()
end
end