From dbc6d029b459ac9dbb0301cb545db99f2bd8d67c Mon Sep 17 00:00:00 2001 From: Claudio Ortolina Date: Thu, 12 Mar 2026 16:58:31 +0000 Subject: [PATCH] Move collected artist IDs query to Collection context Closes #112 --- lib/music_library/artists.ex | 17 +++-------------- lib/music_library/collection.ex | 15 ++++++++++++++- test/music_library/collection_test.exs | 24 ++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 15 deletions(-) diff --git a/lib/music_library/artists.ex b/lib/music_library/artists.ex index e8db07ef..bd590371 100644 --- a/lib/music_library/artists.ex +++ b/lib/music_library/artists.ex @@ -3,7 +3,8 @@ defmodule MusicLibrary.Artists do alias MusicLibrary.Artists.ArtistInfo alias MusicLibrary.Assets - alias MusicLibrary.Records.{ArtistRecord, Record} + alias MusicLibrary.Collection + alias MusicLibrary.Records.ArtistRecord alias MusicLibrary.{Repo, Worker} @spec get_artist!(String.t()) :: map() @@ -21,7 +22,7 @@ defmodule MusicLibrary.Artists do def get_similar_artists(artist) do case LastFm.get_similar_artists(artist.musicbrainz_id, artist.name) do {:ok, artists} -> - collected_artist_ids = get_collected_artist_ids() + collected_artist_ids = Collection.collected_artist_ids() {:ok, Enum.filter(artists, fn a -> @@ -309,18 +310,6 @@ defmodule MusicLibrary.Artists do |> Repo.update() end - defp get_collected_artist_ids do - q = - from ar in ArtistRecord, - join: r in Record, - on: r.id == ar.record_id, - where: not is_nil(r.purchased_at), - distinct: true, - select: ar.musicbrainz_id - - q |> Repo.all() |> MapSet.new() - end - defp enqueue_worker(worker, params) do params |> worker.new(meta: %{}) |> Oban.insert() end diff --git a/lib/music_library/collection.ex b/lib/music_library/collection.ex index 059eb4e7..b8d421f0 100644 --- a/lib/music_library/collection.ex +++ b/lib/music_library/collection.ex @@ -3,7 +3,7 @@ defmodule MusicLibrary.Collection do import MusicLibrary.Records, only: [order_alphabetically: 0] alias MusicLibrary.Records - alias MusicLibrary.Records.{Record, RecordRelease, SearchIndex} + alias MusicLibrary.Records.{ArtistRecord, Record, RecordRelease, SearchIndex} alias MusicLibrary.Repo @excluded_genres Application.compile_env!(:music_library, :excluded_genres) @@ -164,6 +164,19 @@ defmodule MusicLibrary.Collection do select: %{record_id: rr.record_id, cover_hash: rr.cover_hash, release_id: rr.release_id} end + @spec collected_artist_ids() :: MapSet.t(String.t()) + def collected_artist_ids do + from(ar in ArtistRecord, + join: r in Record, + on: r.id == ar.record_id, + where: not is_nil(r.purchased_at), + distinct: true, + select: ar.musicbrainz_id + ) + |> Repo.all() + |> MapSet.new() + end + defp base_search do from r in SearchIndex, where: not is_nil(r.purchased_at) diff --git a/test/music_library/collection_test.exs b/test/music_library/collection_test.exs index 870afa2c..0fac8526 100644 --- a/test/music_library/collection_test.exs +++ b/test/music_library/collection_test.exs @@ -156,6 +156,30 @@ defmodule MusicLibrary.CollectionTest do end end + describe "collected_artist_ids/0" do + setup [:fill_collection] + + test "returns musicbrainz_ids for artists on collected records" do + result = Collection.collected_artist_ids() + + assert is_struct(result, MapSet) + assert MapSet.size(result) > 0 + end + + test "does not include artists only on wishlisted records" do + wishlisted = + record_with_artist("Wishlist Only Artist", %{ + title: "Not Purchased", + purchased_at: nil + }) + + wishlisted_artist = hd(wishlisted.artists) + result = Collection.collected_artist_ids() + + refute MapSet.member?(result, wishlisted_artist.musicbrainz_id) + end + end + describe "get_latest_record!/0" do setup [:fill_collection]