diff --git a/lib/music_library/records.ex b/lib/music_library/records.ex index d0435935..aef39926 100644 --- a/lib/music_library/records.ex +++ b/lib/music_library/records.ex @@ -124,7 +124,7 @@ defmodule MusicLibrary.Records do def import_from_musicbrainz(musicbrainz_id, opts \\ []) do with format = Keyword.get(opts, :format, "cd"), - purchased_at = Keyword.get(opts, :purchased_at, DateTime.utc_now()), + purchased_at = Keyword.get(opts, :purchased_at), {:ok, release_group} <- musicbrainz().get_release_group(musicbrainz_id), {:ok, cover_data} <- musicbrainz().get_cover_art(musicbrainz_id), record_params = build_record_params(release_group, cover_data, format, purchased_at) do diff --git a/lib/music_library_web/live/record_live/index.ex b/lib/music_library_web/live/record_live/index.ex index 98446bda..87dcf965 100644 --- a/lib/music_library_web/live/record_live/index.ex +++ b/lib/music_library_web/live/record_live/index.ex @@ -98,7 +98,12 @@ defmodule MusicLibraryWeb.RecordLive.Index do end def handle_event("import", %{"id" => musicbrainz_id, "format" => format}, socket) do - case Records.import_from_musicbrainz(musicbrainz_id, format: format) do + current_time = DateTime.utc_now() + + case Records.import_from_musicbrainz(musicbrainz_id, + format: format, + purchased_at: current_time + ) do {:ok, record} -> {:noreply, socket diff --git a/lib/music_library_web/live/wishlist_live/index.ex b/lib/music_library_web/live/wishlist_live/index.ex index 1134b38d..37087f51 100644 --- a/lib/music_library_web/live/wishlist_live/index.ex +++ b/lib/music_library_web/live/wishlist_live/index.ex @@ -28,6 +28,34 @@ defmodule MusicLibraryWeb.WishlistLive.Index do {:noreply, apply_action(socket, socket.assigns.live_action, params)} end + defp apply_action(socket, :import, params) do + socket = + if get_in(socket.assigns, [:streams, :records]) == nil do + socket + |> apply_action(:index, params) + else + socket + end + + socket + |> assign(:page_title, gettext("Import from MusicBrainz")) + |> assign(:record, nil) + end + + defp apply_action(socket, :edit, params = %{"id" => id}) do + socket = + if get_in(socket.assigns, [:streams, :records]) == nil do + socket + |> apply_action(:index, params) + else + socket + end + + socket + |> assign(:page_title, gettext("Edit")) + |> assign(:record, Records.get_record!(id)) + end + defp apply_action(socket, :index, params) do query = params["query"] || "" total_records = Wishlist.search_records_count(query) @@ -53,6 +81,14 @@ defmodule MusicLibraryWeb.WishlistLive.Index do end @impl true + + def handle_event("delete", %{"id" => id}, socket) do + record = Records.get_record!(id) + {:ok, _} = Records.delete_record(record) + + {:noreply, stream_delete(socket, :records, record)} + end + def handle_event("search", %{"query" => query}, socket) do qs = @default_records_list_params @@ -63,6 +99,25 @@ defmodule MusicLibraryWeb.WishlistLive.Index do {:noreply, push_patch(socket, to: ~s"/wishlist?#{qs}")} end + def handle_event("import", %{"id" => musicbrainz_id, "format" => format}, socket) do + case Records.import_from_musicbrainz(musicbrainz_id, format: format, purchased_at: nil) do + {:ok, record} -> + {:noreply, + socket + |> put_flash(:info, gettext("Record imported successfully")) + |> push_navigate(to: ~p"/wishlist/#{record.id}")} + + {:error, %Ecto.Changeset{} = changeset} -> + {:noreply, assign(socket, form: to_form(changeset))} + + {:error, reason} -> + {:noreply, + socket + |> put_flash(:error, gettext("Error importing record") <> "," <> inspect(reason)) + |> push_patch(to: ~p"/wishlist")} + end + end + defp merge_query(record_list_params, query) do Map.put(record_list_params, :query, query) end diff --git a/lib/music_library_web/router.ex b/lib/music_library_web/router.ex index 45643015..184f0fc2 100644 --- a/lib/music_library_web/router.ex +++ b/lib/music_library_web/router.ex @@ -39,7 +39,11 @@ defmodule MusicLibraryWeb.Router do live "/records/:id/show/edit", RecordLive.Show, :edit live "/wishlist", WishlistLive.Index, :index + live "/wishlist/import", WishlistLive.Index, :import + live "/wishlist/:id/edit", WishlistLive.Index, :edit + live "/wishlist/:id", WishlistLive.Show, :show + live "/wishlist/:id/show/edit", WishlistLive.Show, :edit end end