From c546c61268525c81890ddfc34ab6f372af6baca4 Mon Sep 17 00:00:00 2001 From: KKlochko Date: Thu, 13 Mar 2025 17:41:14 +0200 Subject: [PATCH] Add the action to get author's books. --- lib/decentralised_book_index/metadata.ex | 1 + lib/decentralised_book_index/metadata/book.ex | 11 +++++++++++ .../metadata/book_test.exs | 14 ++++++++++++++ 3 files changed, 26 insertions(+) diff --git a/lib/decentralised_book_index/metadata.ex b/lib/decentralised_book_index/metadata.ex index 67ea6bd..20d3013 100644 --- a/lib/decentralised_book_index/metadata.ex +++ b/lib/decentralised_book_index/metadata.ex @@ -22,6 +22,7 @@ defmodule DecentralisedBookIndex.Metadata do define :list_books, action: :read define :get_book_by_id, args: [:id], action: :by_id 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 define :destroy_book, action: :destroy end diff --git a/lib/decentralised_book_index/metadata/book.ex b/lib/decentralised_book_index/metadata/book.ex index 77c4d6c..34f8543 100644 --- a/lib/decentralised_book_index/metadata/book.ex +++ b/lib/decentralised_book_index/metadata/book.ex @@ -76,6 +76,17 @@ defmodule DecentralisedBookIndex.Metadata.Book do and id != ^book.id) end end + + read :get_author_books do + argument :author, :struct, allow_nil?: false + + prepare fn query, context -> + author = query.arguments.author + + Metadata.Book + |> Ash.Query.filter(expr(exists(author_roles, author_id == ^author.id))) + end + end end attributes do diff --git a/test/decentralised_book_index/metadata/book_test.exs b/test/decentralised_book_index/metadata/book_test.exs index 7928d29..02d35d6 100644 --- a/test/decentralised_book_index/metadata/book_test.exs +++ b/test/decentralised_book_index/metadata/book_test.exs @@ -59,4 +59,18 @@ defmodule DecentralisedBookIndex.Metadata.BookTest do assert alternatives_names = [related_book] end end + + describe "author's books" do + test "get the list via author's id" do + {:ok, author} = Metadata.create_author("Author", "An description") + + author_roles = [ + %{order: 1, author_id: author.id, role: ""} + ] + + {:ok, book} = Metadata.create_book("Book", "1234567890", "An description", author_roles) + + assert {:ok, books} = Metadata.get_author_books(author) + end + end end