lib/honu_web/router.ex

defmodule HonuWeb.Router do
  use Plug.Router

  alias HonuWeb.Storage

  plug(:match)
  plug(:dispatch)

  get "/storage/blobs/:signed_blob_id/:filename" do
    {:ok, blob} = Storage.find_signed(signed_blob_id, "blob_id", Storage.permanent_opts())

    conn
    |> put_resp_header("location", Storage.config!(:storage).url(conn, blob))
    |> send_resp(302, "")
  end

  delete "/storage/blobs/:signed_blob_id/:filename" do
    with {:ok, blob} <- Storage.find_signed(signed_blob_id, "blob_id", Storage.permanent_opts()),
         {:ok, _} <- Honu.Attachments.delete_blob(blob, Storage.config!(:repo)) do
      send_resp(conn, 204, "")
    else
      {:error, _} -> send_resp(conn, 404, "Not Found")
    end
  end

  get "/storage/disk/:encoded_key/:filename" do
    with {:ok, %{key: key, disposition: disposition}} <- Storage.decode_verified_key(encoded_key) do
      blob = Honu.Attachments.get_attachment_by_key!(key, Storage.config!(:repo))

      # with {:ok, file} <- Honu.Storage.Disk.read(blob) do
      #  send_resp(conn, 200, file)
      # end
      conn
      |> put_resp_header("content-type", blob.content_type)
      |> put_resp_header(
        "content-disposition",
        Storage.Disk.blob_content_disposition(blob, disposition)
      )
      |> send_file(200, Honu.Storage.Disk.path_for(blob.key))
    else
      {:error, _msg} -> send_resp(conn, 404, "Not Found")
    end
  end

  match _ do
    send_resp(conn, 404, "Not Found")
  end
end