diff --git a/lib/decentralised_book_index/metadata.ex b/lib/decentralised_book_index/metadata.ex index 6db42f0..fc6e0b1 100644 --- a/lib/decentralised_book_index/metadata.ex +++ b/lib/decentralised_book_index/metadata.ex @@ -30,6 +30,7 @@ defmodule DecentralisedBookIndex.Metadata do define :list_books, action: :read define :get_book_by_id, args: [:id], action: :by_id + define :get_book_by_bid, args: [:type, :bid], action: :by_bid define :get_book_alternative_editions, args: [:book], action: :get_alternative_editions define :get_author_books, args: [:author], action: :get_author_books define :update_book, action: :update diff --git a/lib/decentralised_book_index/metadata/book.ex b/lib/decentralised_book_index/metadata/book.ex index fa5d14f..4df1d6a 100644 --- a/lib/decentralised_book_index/metadata/book.ex +++ b/lib/decentralised_book_index/metadata/book.ex @@ -69,6 +69,13 @@ defmodule DecentralisedBookIndex.Metadata.Book do filter expr(id == ^arg(:id)) end + read :by_bid do + argument :type, :string, allow_nil?: false + argument :bid, :string, allow_nil?: false + get? true + filter expr(exists(bids, type == ^arg(:type) and bid == ^arg(:bid))) + end + read :get_alternative_editions do argument :book, :struct, allow_nil?: false diff --git a/test/decentralised_book_index/metadata/book_test.exs b/test/decentralised_book_index/metadata/book_test.exs index f604d2d..3fa378c 100644 --- a/test/decentralised_book_index/metadata/book_test.exs +++ b/test/decentralised_book_index/metadata/book_test.exs @@ -117,4 +117,26 @@ defmodule DecentralisedBookIndex.Metadata.BookTest do assert book3.id in book_ids end end + + describe "get a book by book id" do + test "get by bid" do + {:ok, author} = Metadata.create_author("Author", "An description") + + type = "isbn10" + bid = "1234567890" + + bids = [ + %{order: 1, type: type, bid: bid} + ] + + author_roles = [ + %{order: 1, author_id: author.id, role: ""} + ] + + {:ok, expected_book} = Metadata.create_book("Book", "An description", bids, author_roles) + + assert {:ok, book} = Metadata.get_book_by_bid(type, bid) + assert expected_book.id == book.id + end + end end