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:
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user