From 70542781c2c5be9bf66774b4a14a05f2d55aafa1 Mon Sep 17 00:00:00 2001 From: KKlochko Date: Thu, 13 Mar 2025 17:29:24 +0200 Subject: [PATCH] Update AuthorRole to set author_id. --- lib/decentralised_book_index/metadata.ex | 8 +++++- .../metadata/author_role.ex | 18 +++++++++++++ .../metadata/author_roles_test.exs | 27 +++++++++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 test/decentralised_book_index/metadata/author_roles_test.exs diff --git a/lib/decentralised_book_index/metadata.ex b/lib/decentralised_book_index/metadata.ex index b42c400..67ea6bd 100644 --- a/lib/decentralised_book_index/metadata.ex +++ b/lib/decentralised_book_index/metadata.ex @@ -61,7 +61,13 @@ defmodule DecentralisedBookIndex.Metadata do define :destroy_book_editions_registry, action: :destroy end - resource DecentralisedBookIndex.Metadata.AuthorRole + resource DecentralisedBookIndex.Metadata.AuthorRole do + define :create_author_role, action: :create, args: [:author_id, :order, :role] + define :list_author_roles, action: :read + define :get_author_role_by_id, args: [:id], action: :by_id + define :update_author_role, action: :update + define :destroy_author_role, action: :destroy + end end json_api do diff --git a/lib/decentralised_book_index/metadata/author_role.ex b/lib/decentralised_book_index/metadata/author_role.ex index a190c9c..4c519a6 100644 --- a/lib/decentralised_book_index/metadata/author_role.ex +++ b/lib/decentralised_book_index/metadata/author_role.ex @@ -18,6 +18,24 @@ defmodule DecentralisedBookIndex.Metadata.AuthorRole do primary? true accept [:order, :role] argument :author_id, :uuid + + change fn changeset, _ -> + author_id = changeset.arguments.author_id + + if author_id != nil do + {:ok, author} = DecentralisedBookIndex.Metadata.get_author_by_id(author_id) + + Ash.Changeset.force_change_attribute(changeset, :author_id, author.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 diff --git a/test/decentralised_book_index/metadata/author_roles_test.exs b/test/decentralised_book_index/metadata/author_roles_test.exs new file mode 100644 index 0000000..ac7d964 --- /dev/null +++ b/test/decentralised_book_index/metadata/author_roles_test.exs @@ -0,0 +1,27 @@ +defmodule DecentralisedBookIndex.Metadata.AuthorRolesTest do + use DecentralisedBookIndex.DataCase, async: true + + alias DecentralisedBookIndex.Metadata + + describe "create action" do + test "an author's role must belongs to an author" do + {:ok, author} = Metadata.create_author("Author", "An description") + + assert {:ok, author_role} = Metadata.create_author_role(author.id, 1, "role") + + {:ok, author_role} = + author_role + |> Ash.load(:author) + + assert author.id == author_role.author_id + end + + test "an author's role can be blank" do + {:ok, author} = Metadata.create_author("Author", "An description") + + {:ok, author_role} = Metadata.create_author_role(author.id, 1, "") + + refute author_role.role + end + end +end