From 49c3a5cba2535542a07f2fa52fc46623340da44f Mon Sep 17 00:00:00 2001 From: Claudio Ortolina Date: Mon, 1 Sep 2025 13:46:32 +0300 Subject: [PATCH] Serve images from assets table --- lib/music_library/assets.ex | 4 ++++ .../controllers/cover_controller.ex | 15 +++++++++++++-- .../controllers/cover_controller_test.exs | 9 ++++++++- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/lib/music_library/assets.ex b/lib/music_library/assets.ex index 38ba91d2..f388303a 100644 --- a/lib/music_library/assets.ex +++ b/lib/music_library/assets.ex @@ -20,4 +20,8 @@ defmodule MusicLibrary.Assets do |> Asset.image_changeset(params) |> Repo.insert() end + + def get(hash) do + Repo.get!(Asset, hash) + end end diff --git a/lib/music_library_web/controllers/cover_controller.ex b/lib/music_library_web/controllers/cover_controller.ex index 58f1a5ab..4be434f9 100644 --- a/lib/music_library_web/controllers/cover_controller.ex +++ b/lib/music_library_web/controllers/cover_controller.ex @@ -1,6 +1,7 @@ defmodule MusicLibraryWeb.CoverController do use MusicLibraryWeb, :controller + alias MusicLibrary.Assets alias MusicLibrary.Records alias MusicLibrary.Records.Cover @@ -29,10 +30,12 @@ defmodule MusicLibraryWeb.CoverController do nil -> not_found(conn) - %{cover_data: cover_data, cover_hash: etag} -> + %{cover_hash: etag} -> + asset = Assets.get(etag) + case get_req_header(conn, "if-none-match") do [^etag] -> extend_cache(conn) - _ -> respond_with_cache(conn, cover_data, etag) + _ -> respond_with_cache(conn, asset) end end end @@ -49,6 +52,14 @@ defmodule MusicLibraryWeb.CoverController do |> send_resp(304, "") end + defp respond_with_cache(conn, asset) do + conn + |> put_resp_content_type(asset.format, "utf-8") + |> put_resp_header("cache-control", "public, max-age=#{@cache_duration}") + |> put_resp_header("etag", asset.hash) + |> send_resp(200, asset.content) + end + defp respond_with_cache(conn, cover_data, etag) do conn |> put_resp_content_type("image/jpeg", "utf-8") diff --git a/test/music_library_web/controllers/cover_controller_test.exs b/test/music_library_web/controllers/cover_controller_test.exs index 70ced89e..e017dc8a 100644 --- a/test/music_library_web/controllers/cover_controller_test.exs +++ b/test/music_library_web/controllers/cover_controller_test.exs @@ -3,14 +3,21 @@ defmodule MusicLibraryWeb.CoverControllerTest do import MusicLibrary.Fixtures.Records + alias MusicLibrary.Assets alias MusicLibrary.Records.Cover defp create_record(_) do %{record: record()} end + defp create_asset(%{record: record}) do + {:ok, asset} = Assets.store(%{content: record.cover_data, format: "image/jpeg"}) + + %{asset: asset} + end + describe "GET /covers/:record_id" do - setup [:create_record] + setup [:create_record, :create_asset] test "404s when record doesn't exist", %{conn: conn} do id = Ecto.UUID.generate()