From cbec8fceb474226ddc8848dd81095e3315e51037 Mon Sep 17 00:00:00 2001 From: KKlochko Date: Thu, 10 Apr 2025 11:19:43 +0300 Subject: [PATCH] Update to sync also BookEditionsRegistry. --- lib/decentralised_book_index/metadata/book.ex | 4 +- .../metadata/book_editions_registry.ex | 12 +++++- .../sync/sync/book_editions_registry_sync.ex | 31 ++++++++++++++ .../sync/sync/book_sync.ex | 31 +++++++++++++- .../sync/book_editions_registry_sync_test.exs | 37 +++++++++++++++++ .../sync/sync/book_sync_test.exs | 40 ++++++++++++++++++- 6 files changed, 150 insertions(+), 5 deletions(-) create mode 100644 lib/decentralised_book_index/sync/sync/book_editions_registry_sync.ex create mode 100644 test/decentralised_book_index/sync/sync/book_editions_registry_sync_test.exs diff --git a/lib/decentralised_book_index/metadata/book.ex b/lib/decentralised_book_index/metadata/book.ex index 160df18..0c1b893 100644 --- a/lib/decentralised_book_index/metadata/book.ex +++ b/lib/decentralised_book_index/metadata/book.ex @@ -318,7 +318,9 @@ defmodule DecentralisedBookIndex.Metadata.Book do relationships do belongs_to :dbi_server, Metadata.DBIServer - belongs_to :book_editions_registry, Metadata.BookEditionsRegistry + belongs_to :book_editions_registry, Metadata.BookEditionsRegistry do + public? true + end belongs_to :publisher, Metadata.Publisher do public? true diff --git a/lib/decentralised_book_index/metadata/book_editions_registry.ex b/lib/decentralised_book_index/metadata/book_editions_registry.ex index 3111916..806f008 100644 --- a/lib/decentralised_book_index/metadata/book_editions_registry.ex +++ b/lib/decentralised_book_index/metadata/book_editions_registry.ex @@ -14,6 +14,14 @@ defmodule DecentralisedBookIndex.Metadata.BookEditionsRegistry do actions do defaults [:read, :create, :update, :destroy] + create :sync_create do + accept [:id, :dbi_server_id] + end + + update :sync do + accept [:id, :dbi_server_id] + end + read :by_id do argument :id, :uuid, allow_nil?: false get? true @@ -22,7 +30,7 @@ defmodule DecentralisedBookIndex.Metadata.BookEditionsRegistry do end attributes do - uuid_primary_key :id + uuid_primary_key :id, writable?: true timestamps() end @@ -30,6 +38,6 @@ defmodule DecentralisedBookIndex.Metadata.BookEditionsRegistry do relationships do belongs_to :dbi_server, Metadata.DBIServer - has_many :authors, DecentralisedBookIndex.Metadata.Book + has_many :books, DecentralisedBookIndex.Metadata.Book end end diff --git a/lib/decentralised_book_index/sync/sync/book_editions_registry_sync.ex b/lib/decentralised_book_index/sync/sync/book_editions_registry_sync.ex new file mode 100644 index 0000000..633ac10 --- /dev/null +++ b/lib/decentralised_book_index/sync/sync/book_editions_registry_sync.ex @@ -0,0 +1,31 @@ +defmodule DecentralisedBookIndex.Sync.BookEditionsRegistrySync do + alias DecentralisedBookIndex.Metadata + alias DecentralisedBookIndex.Metadata.BookEditionsRegistry + + def create_update(attrs, server_id) do + case Metadata.get_book_editions_registry_by_id(attrs.id) do + {:ok, editions_registry} -> + attrs = + attrs + |> Map.delete(:id) + |> Map.put(:dbi_server_id, server_id) + + editions_registry + |> Ash.Changeset.for_update(:sync, attrs) + |> Ash.update!() + + :ok + + {:error, %Ash.Error.Query.NotFound{}} -> + attrs = + attrs + |> Map.put(:dbi_server_id, server_id) + + BookEditionsRegistry + |> Ash.Changeset.for_create(:sync_create, attrs) + |> Ash.create!() + + :ok + end + end +end diff --git a/lib/decentralised_book_index/sync/sync/book_sync.ex b/lib/decentralised_book_index/sync/sync/book_sync.ex index 74938f2..d7afd61 100644 --- a/lib/decentralised_book_index/sync/sync/book_sync.ex +++ b/lib/decentralised_book_index/sync/sync/book_sync.ex @@ -1,14 +1,17 @@ defmodule DecentralisedBookIndex.Sync.BookSync do alias DecentralisedBookIndex.Metadata alias DecentralisedBookIndex.Metadata.Book + alias DecentralisedBookIndex.Sync.BookEditionsRegistrySync def create_update(attrs, server_id) do + registry_info = sync_registry(attrs, server_id) + case Metadata.get_book_by_id(attrs.id) do {:ok, book} -> attrs = attrs |> Map.delete(:id) - |> Map.delete(:book_editions_registry) + |> update_registry(registry_info) |> Map.put(:dbi_server_id, server_id) book @@ -19,6 +22,7 @@ defmodule DecentralisedBookIndex.Sync.BookSync do {:error, %Ash.Error.Query.NotFound{}} -> attrs = attrs + |> update_registry(registry_info) |> Map.put(:dbi_server_id, server_id) Book @@ -28,4 +32,29 @@ defmodule DecentralisedBookIndex.Sync.BookSync do :ok end end + + defp sync_registry(attrs, server_id) do + id = Map.get(attrs, :book_editions_registry_id, nil) + + if id != nil do + %{id: id} + |> BookEditionsRegistrySync.create_update(server_id) + + {:ok, id} + else + {:error, :no_book_editions_registry_id} + end + end + + defp update_registry(attrs, registry_info) do + case registry_info do + {:ok, id} -> + attrs + |> Map.replace(:book_editions_registry_id, id) + + {:error, _} -> + attrs + |> Map.delete(:book_editions_registry_id) + end + end end diff --git a/test/decentralised_book_index/sync/sync/book_editions_registry_sync_test.exs b/test/decentralised_book_index/sync/sync/book_editions_registry_sync_test.exs new file mode 100644 index 0000000..d9899db --- /dev/null +++ b/test/decentralised_book_index/sync/sync/book_editions_registry_sync_test.exs @@ -0,0 +1,37 @@ +defmodule DecentralisedBookIndex.Sync.DataTransformers.BookEditionsRegistrySyncTest do + use DecentralisedBookIndex.DataCase, async: true + + alias DecentralisedBookIndex.Sync.BookEditionsRegistrySync + alias DecentralisedBookIndex.Metadata + + alias DecentralisedBookIndex.TestEndpoints + @test_server_endpoint TestEndpoints.test_api_endpoint() + + describe "sync book edition registry transformations" do + test "a new registry will be created" do + server = generate(dbi_server(url: @test_server_endpoint)) + + attrs = %{ + id: "889a323e-d104-4b5d-b276-dad5a9b1da9d", + } + + assert :ok = BookEditionsRegistrySync.create_update(attrs, server.id) + assert {:ok, saved_alias} = Metadata.get_book_editions_registry_by_id(attrs.id) + assert server.id == saved_alias.dbi_server_id + end + + test "the same registry" do + server = generate(dbi_server(url: @test_server_endpoint)) + + {:ok, same_alias} = Metadata.create_book_editions_registry() + + attrs = %{ + id: same_alias.id, + } + + assert :ok = BookEditionsRegistrySync.create_update(attrs, server.id) + assert {:ok, saved_alias} = Metadata.get_book_editions_registry_by_id(attrs.id) + assert server.id == saved_alias.dbi_server_id + end + end +end diff --git a/test/decentralised_book_index/sync/sync/book_sync_test.exs b/test/decentralised_book_index/sync/sync/book_sync_test.exs index 20c6f74..8312c28 100644 --- a/test/decentralised_book_index/sync/sync/book_sync_test.exs +++ b/test/decentralised_book_index/sync/sync/book_sync_test.exs @@ -37,8 +37,46 @@ defmodule DecentralisedBookIndex.Sync.DataTransformers.BookSyncTest do book |> Map.replace(:inserted_at, inserted_at) |> Map.replace(:updated_at, updated_at) + |> Map.replace(:published, Date.from_iso8601!(book[:published])) - assert book = saved_book + assert get_submap(saved_book, book) == book + assert nil != saved_book.book_editions_registry_id + assert server.id == saved_book.dbi_server_id + end + + test "a new book has the same editions registry" do + server = generate(dbi_server(url: @test_server_endpoint)) + + publisher = generate(publisher()) + + book = %{ + id: "1bbe8861-9d9d-4684-bda6-b6ec238d8d08", + cover_image_url: "/images/book_cover.png", + description: "A cool book.", + format: "Paper", + inserted_at: "2025-03-20T14:44:36.162986Z", + language: "English", + page_count: 1000, + published: "2025-03-05", + publisher_id: publisher.id, + title: "Book", + updated_at: "2025-04-01T18:14:25.754055Z", + book_editions_registry_id: "1ed81d9e-3757-472a-aa3b-44fcdfbe770a" + } + + {:ok, inserted_at, 0} = DateTime.from_iso8601(book[:inserted_at]) + {:ok, updated_at, 0} = DateTime.from_iso8601(book[:updated_at]) + + assert :ok = BookSync.create_update(book, server.id) + assert {:ok, saved_book} = Metadata.get_book_by_id(book.id) + + book = + book + |> Map.replace(:inserted_at, inserted_at) + |> Map.replace(:updated_at, updated_at) + |> Map.replace(:published, Date.from_iso8601!(book[:published])) + + assert get_submap(saved_book, book) == book assert nil != saved_book.book_editions_registry_id assert server.id == saved_book.dbi_server_id end