Show barcodes that are not found inside the results UI

Includes a refactor to extract/cleanup barcode scan logic from the
component to a separate context with a better API.
This commit is contained in:
Claudio Ortolina
2025-03-07 09:14:27 +00:00
parent 12b38ecbb2
commit fee2799d50
6 changed files with 149 additions and 70 deletions
+48
View File
@@ -0,0 +1,48 @@
defmodule MusicLibrary.BarcodeScan do
alias MusicLibrary.BarcodeScan.Result
alias MusicLibrary.Records
def scan(number) do
case MusicBrainz.search_release_by_barcode(number) do
{:ok, [best_match_release | _other_releases]} ->
format = MusicBrainz.ReleaseSearchResult.format(best_match_release)
case Records.get_release_status(best_match_release.id, format) do
:new ->
{:ok, Result.new(number, best_match_release)}
{:wishlisted, record_id} ->
{:ok, Result.wishlisted(number, record_id, best_match_release)}
{:collected, record_id} ->
{:ok, Result.collected(number, record_id, best_match_release)}
end
{:ok, []} ->
{:ok, Result.not_found(number)}
error ->
error
end
end
def import(scan_result, current_time) do
case scan_result.status do
:new ->
Records.import_from_musicbrainz_release(scan_result.release.id,
format: MusicBrainz.ReleaseSearchResult.format(scan_result.release),
purchased_at: current_time
)
:wishlisted ->
record = Records.get_record!(scan_result.record_id)
Records.update_record(record, %{"purchased_at" => current_time})
:collected ->
{:error, :already_collected}
:not_found ->
{:error, :not_found}
end
end
end
+36
View File
@@ -0,0 +1,36 @@
defmodule MusicLibrary.BarcodeScan.Result do
defstruct [:status, :number, :record_id, :release]
def new(number, release) do
%__MODULE__{
number: number,
status: :new,
release: release
}
end
def wishlisted(number, record_id, release) do
%__MODULE__{
number: number,
status: :wishlisted,
record_id: record_id,
release: release
}
end
def collected(number, record_id, release) do
%__MODULE__{
number: number,
status: :collected,
record_id: record_id,
release: release
}
end
def not_found(number) do
%__MODULE__{
number: number,
status: :not_found
}
end
end
+5 -1
View File
@@ -107,7 +107,11 @@ defmodule MusicLibrary.Records do
purchased_at: fragment("records.purchased_at")
}
Repo.one(q)
case Repo.one(q) do
nil -> :new
%{record_id: record_id, purchased_at: nil} -> {:wishlisted, record_id}
%{record_id: record_id} -> {:collected, record_id}
end
end
def get_artist_records(musicbrainz_id) do