diff --git a/lib/music_library/artists.ex b/lib/music_library/artists.ex index d18b493f..5f5e9c57 100644 --- a/lib/music_library/artists.ex +++ b/lib/music_library/artists.ex @@ -45,6 +45,14 @@ defmodule MusicLibrary.Artists do q |> Repo.all() end + def exists?(artist_id) do + Repo.get_by(ArtistRecord, musicbrainz_id: artist_id) !== nil + end + + def delete_artist_info(artist_id) do + Repo.delete_all(from ai in ArtistInfo, where: ai.id == ^artist_id) + end + def fetch_artist_info(artist_id) do with {:ok, musicbrainz_artist} <- MusicBrainz.get_artist(artist_id) do if discogs_id = MusicBrainz.Artist.get_discogs_id(musicbrainz_artist) do @@ -106,6 +114,15 @@ defmodule MusicLibrary.Artists do |> BackgroundRepo.insert() end + def prune_artist_info_async(artist_id) do + meta = %{} + params = %{"id" => artist_id} + + params + |> Worker.PruneArtistInfo.new(meta: meta) + |> BackgroundRepo.insert() + end + def get_image(artist_id) do q = from ai in ArtistInfo, diff --git a/lib/music_library/records.ex b/lib/music_library/records.ex index ad7b511b..33e57cf0 100644 --- a/lib/music_library/records.ex +++ b/lib/music_library/records.ex @@ -283,7 +283,15 @@ defmodule MusicLibrary.Records do end def delete_record(%Record{} = record) do - Repo.delete(record) + with {:ok, record} <- Repo.delete(record) do + record + |> Record.artist_ids() + |> Enum.each(fn artist_id -> + Artists.prune_artist_info_async(artist_id) + end) + + {:ok, record} + end end def change_record(%Record{} = record, attrs \\ %{}) do diff --git a/lib/music_library/worker/prune_artist_info.ex b/lib/music_library/worker/prune_artist_info.ex new file mode 100644 index 00000000..b85795ae --- /dev/null +++ b/lib/music_library/worker/prune_artist_info.ex @@ -0,0 +1,18 @@ +defmodule MusicLibrary.Worker.PruneArtistInfo do + use Oban.Worker, queue: :default, max_attempts: 3 + + @impl Oban.Worker + def perform(%Oban.Job{args: %{"id" => artist_id}}) do + if MusicLibrary.Artists.exists?(artist_id) do + :ok + else + delete_artist_info(artist_id) + end + end + + defp delete_artist_info(artist_id) do + with {_count, nil} <- MusicLibrary.Artists.delete_artist_info(artist_id) do + :ok + end + end +end