From f2f4990779ddbe27a2e51be851fb72240c54b8e0 Mon Sep 17 00:00:00 2001 From: KKlochko Date: Fri, 7 Mar 2025 13:47:15 +0200 Subject: [PATCH] Update the create action for Author to set AuthorAliasRegistry. --- lib/decentralised_book_index/metadata.ex | 2 +- .../metadata/author.ex | 19 +++++++++++++++++++ .../metadata/author_test.exs | 18 ++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 test/decentralised_book_index/metadata/author_test.exs diff --git a/lib/decentralised_book_index/metadata.ex b/lib/decentralised_book_index/metadata.ex index c64ef4b..c5663b1 100644 --- a/lib/decentralised_book_index/metadata.ex +++ b/lib/decentralised_book_index/metadata.ex @@ -6,7 +6,7 @@ defmodule DecentralisedBookIndex.Metadata do resource DecentralisedBookIndex.Metadata.Book resource DecentralisedBookIndex.Metadata.Author do - define :create_author, action: :create, args: [:name, :description, :author_alias_registry_id] + define :create_author, action: :create, args: [:name, :description, {:optional, :author_alias_registry_id}] define :add_author_to_alias_registry, action: :add_author_to_alias_registry, args: [:author_alias_registry_id] define :list_authors, action: :read define :get_author_by_id, args: [:id], action: :by_id diff --git a/lib/decentralised_book_index/metadata/author.ex b/lib/decentralised_book_index/metadata/author.ex index 545c8b6..a880cae 100644 --- a/lib/decentralised_book_index/metadata/author.ex +++ b/lib/decentralised_book_index/metadata/author.ex @@ -20,6 +20,25 @@ defmodule DecentralisedBookIndex.Metadata.Author do primary? true accept [:name, :description, :author_alias_registry_id] + change fn changeset, _ -> + registry_id = Ash.Changeset.get_attribute(changeset, :author_alias_registry_id) + + if registry_id == nil do + {:ok, registry} = DecentralisedBookIndex.Metadata.create_author_alias_registry() + + Ash.Changeset.force_change_attribute(changeset, :author_alias_registry_id, registry.id) + else + changeset + end + end + end + + read :by_id do + argument :id, :uuid, allow_nil?: false + get? true + filter expr(id == ^arg(:id)) + end + end end diff --git a/test/decentralised_book_index/metadata/author_test.exs b/test/decentralised_book_index/metadata/author_test.exs new file mode 100644 index 0000000..413a4ca --- /dev/null +++ b/test/decentralised_book_index/metadata/author_test.exs @@ -0,0 +1,18 @@ +defmodule DecentralisedBookIndex.Metadata.AuthorTest do + use DecentralisedBookIndex.DataCase, async: true + + alias DecentralisedBookIndex.Metadata + + describe "authors and registries relationship" do + test "a new author get new registry by default" do + assert {:ok, author} = Metadata.create_author("Author", "An description") + assert author.author_alias_registry_id != nil + end + + test "a new author belongs to a registry if specified" do + assert {:ok, registry} = Metadata.create_author_alias_registry() + assert {:ok, author} = Metadata.create_author("Author", "An description", registry.id) + assert author.author_alias_registry_id == registry.id + end + end +end