From f4c11b99e3b1fe4cfab7cef19fc7485b92136b93 Mon Sep 17 00:00:00 2001 From: KKlochko Date: Tue, 8 Apr 2025 17:37:41 +0300 Subject: [PATCH] Update AuthorRole and BookId for sync Book data. --- .../metadata/author_role.ex | 4 +- .../metadata/book_id.ex | 6 +- .../sync/sync/book_sync_test.exs | 203 ++++++++++++++++++ 3 files changed, 208 insertions(+), 5 deletions(-) diff --git a/lib/decentralised_book_index/metadata/author_role.ex b/lib/decentralised_book_index/metadata/author_role.ex index c010e0a..60557cd 100644 --- a/lib/decentralised_book_index/metadata/author_role.ex +++ b/lib/decentralised_book_index/metadata/author_role.ex @@ -25,7 +25,7 @@ defmodule DecentralisedBookIndex.Metadata.AuthorRole do create :create do primary? true - accept [:order, :role] + accept [:id, :order, :role] argument :author_id, :uuid change fn changeset, _ -> @@ -75,7 +75,7 @@ defmodule DecentralisedBookIndex.Metadata.AuthorRole do end attributes do - uuid_primary_key :id + uuid_primary_key :id, writable?: true attribute :role, :string do allow_nil? true diff --git a/lib/decentralised_book_index/metadata/book_id.ex b/lib/decentralised_book_index/metadata/book_id.ex index 8d9c165..014949d 100644 --- a/lib/decentralised_book_index/metadata/book_id.ex +++ b/lib/decentralised_book_index/metadata/book_id.ex @@ -25,12 +25,12 @@ defmodule DecentralisedBookIndex.Metadata.BookId do create :create do primary? true - accept [:type, :bid, :order] + accept [:id, :type, :bid, :order] end update :update do primary? true - accept [:type, :bid, :order] + accept [:id, :type, :bid, :order] end read :by_id do @@ -41,7 +41,7 @@ defmodule DecentralisedBookIndex.Metadata.BookId do end attributes do - uuid_primary_key :id + uuid_primary_key :id, writable?: true attribute :type, :string do allow_nil? false 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 caf9780..20c6f74 100644 --- a/test/decentralised_book_index/sync/sync/book_sync_test.exs +++ b/test/decentralised_book_index/sync/sync/book_sync_test.exs @@ -43,6 +43,72 @@ defmodule DecentralisedBookIndex.Sync.DataTransformers.BookSyncTest do assert server.id == saved_book.dbi_server_id end + test "a new book with relationships will be created" do + server = generate(dbi_server(url: @test_server_endpoint)) + + author1 = generate(author()) + author2 = generate(author()) + publisher = generate(publisher()) + + book = %{ + author_roles: [ + %{ + id: "d6d784a9-4c9c-45a3-8068-a5a30bbe8934", + order: 0, + role: "", + author_id: author1.id + }, + %{ + id: "d6d784a9-4c9c-45a3-8068-a5a30bbe8935", + order: 1, + role: "Translator", + author_id: author2.id + } + ], + bids: [ + %{ + bid: "1234567890123", + id: "c6531191-ebc6-4a7c-af65-e2b5030a5147", + order: 0, + type: "isbn13" + }, + %{ + bid: "1234567890", + id: "c0238e74-845b-4d1f-94cf-fe16c0fa46a8", + order: 1, + type: "isbn10" + } + ], + cover_image_url: nil, + description: "Description 0", + format: "Format 0", + id: "fd09e57a-1f1e-4a80-b00a-398b3ee545fa", + inserted_at: "2025-04-08T07:02:42.778095Z", + language: "Language 0", + page_count: 1, + published: "2025-03-04", + publisher_id: publisher.id, + title: "Book 6", + updated_at: "2025-04-08T07:02:42.778095Z" + } + + {: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, load: [:author_roles, :bids]) + + bids = book[:bids] + author_roles = book[:author_roles] + + assert get_ids(bids) == get_ids(saved_book.bids) + assert get_ids(author_roles) == get_ids(saved_book.author_roles) + + assert bids = saved_book.bids + assert author_roles = saved_book.author_roles + assert book[:publisher_id] == saved_book.publisher_id + end + test "update an existing book" do server = generate(dbi_server(url: @test_server_endpoint)) @@ -66,5 +132,142 @@ defmodule DecentralisedBookIndex.Sync.DataTransformers.BookSyncTest do assert book = saved_book end + + test "update book's relationship for an existing book" do + server = generate(dbi_server(url: @test_server_endpoint)) + + book = generate(book()) + + author1 = generate(author()) + author2 = generate(author()) + publisher = generate(publisher()) + + book_attrs = %{ + author_roles: [ + %{ + id: "d6d784a9-4c9c-45a3-8068-a5a30bbe8934", + order: 0, + role: "", + author_id: author1.id + }, + %{ + id: "d6d784a9-4c9c-45a3-8068-a5a30bbe8935", + order: 1, + role: "Translator", + author_id: author2.id + } + ], + bids: [ + %{ + bid: "1234567890123", + id: "c6531191-ebc6-4a7c-af65-e2b5030a5147", + order: 0, + type: "isbn13" + }, + %{ + bid: "1234567890", + id: "c0238e74-845b-4d1f-94cf-fe16c0fa46a8", + order: 1, + type: "isbn10" + } + ], + cover_image_url: nil, + description: "Description 0", + format: "Format 0", + id: book.id, + inserted_at: "2025-04-08T07:02:42.778095Z", + language: "Language 0", + page_count: 1, + published: "2025-03-04", + publisher_id: publisher.id, + title: "Book 6", + updated_at: "2025-04-08T07:02:42.778095Z" + } + + assert :ok = BookSync.create_update(book_attrs, server.id) + assert {:ok, saved_book} = Metadata.get_book_by_id(book.id, load: [:author_roles, :bids]) + + bids = book_attrs[:bids] + author_roles = book_attrs[:author_roles] + + assert get_ids(bids) == get_ids(saved_book.bids) + assert get_ids(author_roles) == get_ids(saved_book.author_roles) + assert bids = saved_book.bids + assert author_roles = saved_book.author_roles + end + + test "olds bids and roles are destroyed after update" do + server = generate(dbi_server(url: @test_server_endpoint)) + + book = generate(book()) + + author1 = generate(author()) + author2 = generate(author()) + publisher = generate(publisher()) + + book_attrs = %{ + author_roles: [ + %{ + id: "d6d784a9-4c9c-45a3-8068-a5a30bbe8934", + order: 0, + role: "", + author_id: author1.id + }, + %{ + id: "d6d784a9-4c9c-45a3-8068-a5a30bbe8935", + order: 1, + role: "Translator", + author_id: author2.id + } + ], + bids: [ + %{ + bid: "1234567890123", + id: "c6531191-ebc6-4a7c-af65-e2b5030a5147", + order: 0, + type: "isbn13" + }, + %{ + bid: "1234567890", + id: "c0238e74-845b-4d1f-94cf-fe16c0fa46a8", + order: 1, + type: "isbn10" + } + ], + cover_image_url: nil, + description: "Description 0", + format: "Format 0", + id: book.id, + inserted_at: "2025-04-08T07:02:42.778095Z", + language: "Language 0", + page_count: 1, + published: "2025-03-04", + publisher_id: publisher.id, + title: "Book 6", + updated_at: "2025-04-08T07:02:42.778095Z" + } + + old_bids = get_ids(Metadata.list_book_ids!()) + old_roles = get_ids(Metadata.list_author_roles!()) + + assert :ok = BookSync.create_update(book_attrs, server.id) + assert {:ok, saved_book} = Metadata.get_book_by_id(book.id, load: [:author_roles, :bids]) + + new_bids = get_ids(Metadata.list_book_ids!()) + new_roles = get_ids(Metadata.list_author_roles!()) + + bids = book_attrs[:bids] + author_roles = book_attrs[:author_roles] + + assert Enum.all?(old_bids, fn id -> id not in new_bids end) + assert Enum.all?(old_roles, fn id -> id not in new_roles end) + end end + + defp get_ids(records) do + Enum.map(records, fn record -> get_id(record) end) + end + + defp get_id(record) when is_struct(record), do: record.id + defp get_id(record) when is_map(record), do: record[:id] end