From 8a80062c80826024b45ad58f91606d8b7962e2c8 Mon Sep 17 00:00:00 2001 From: Claudio Ortolina Date: Fri, 7 Mar 2025 11:48:18 +0000 Subject: [PATCH] Surface scan+import errors --- lib/music_library/barcode_scan.ex | 14 ++++++++++- .../components/barcode_scanner_component.ex | 24 ++++++++++++++----- priv/gettext/default.pot | 7 +++++- 3 files changed, 37 insertions(+), 8 deletions(-) diff --git a/lib/music_library/barcode_scan.ex b/lib/music_library/barcode_scan.ex index 31f19b85..af25491e 100644 --- a/lib/music_library/barcode_scan.ex +++ b/lib/music_library/barcode_scan.ex @@ -26,7 +26,19 @@ defmodule MusicLibrary.BarcodeScan do end end - def import(scan_result, current_time) do + def import_results(scan_results, current_time) do + Enum.reduce(scan_results, [], fn scan_result, errors -> + case import_result(scan_result, current_time) do + {:error, reason} -> + [{scan_result.number, reason} | errors] + + _ -> + errors + end + end) + end + + defp import_result(scan_result, current_time) do case scan_result.status do :new -> Records.import_from_musicbrainz_release(scan_result.release.id, diff --git a/lib/music_library_web/components/barcode_scanner_component.ex b/lib/music_library_web/components/barcode_scanner_component.ex index e6b14dd8..ec8b4b1b 100644 --- a/lib/music_library_web/components/barcode_scanner_component.ex +++ b/lib/music_library_web/components/barcode_scanner_component.ex @@ -193,18 +193,30 @@ defmodule MusicLibraryWeb.BarcodeScannerComponent do def handle_event("import_releases", _params, socket) do current_time = DateTime.utc_now() - # TODO: error handling when a release fails to import - :ok = - Enum.each(socket.assigns.scan_results, fn scan_result -> - BarcodeScan.import(scan_result, current_time) - end) + + socket = + case BarcodeScan.import_results(socket.assigns.scan_results, current_time) do + [] -> + put_flash(socket, :info, gettext("Records imported successfully")) + + errors -> + errors_summary = + Enum.map_join(errors, "\n", fn {number, reason} -> + "#{number}: #{inspect(reason)}" + end) + + put_flash( + socket, + :error, + gettext("Some records could not be imported: %{summary}", summary: errors_summary) + ) + end qs = %{order: :purchase} {:noreply, socket |> assign(:scan_results, []) - |> put_flash(:info, gettext("Records imported successfully")) |> push_patch(to: ~p"/collection?#{qs}")} end diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot index 17ed37a5..d2325b69 100644 --- a/priv/gettext/default.pot +++ b/priv/gettext/default.pot @@ -641,7 +641,7 @@ msgstr "" msgid "Importing..." msgstr "" -#: lib/music_library_web/components/barcode_scanner_component.ex:207 +#: lib/music_library_web/components/barcode_scanner_component.ex:200 #, elixir-autogen, elixir-format msgid "Records imported successfully" msgstr "" @@ -690,3 +690,8 @@ msgstr "" #, elixir-autogen, elixir-format msgid "Barcode not found" msgstr "" + +#: lib/music_library_web/components/barcode_scanner_component.ex:211 +#, elixir-autogen, elixir-format +msgid "Some records could not be imported: %{summary}" +msgstr ""