Update AuthorRole and BookId for sync Book data.

dev
KKlochko 3 months ago
parent 74570c81a1
commit f4c11b99e3

@ -25,7 +25,7 @@ defmodule DecentralisedBookIndex.Metadata.AuthorRole do
create :create do create :create do
primary? true primary? true
accept [:order, :role] accept [:id, :order, :role]
argument :author_id, :uuid argument :author_id, :uuid
change fn changeset, _ -> change fn changeset, _ ->
@ -75,7 +75,7 @@ defmodule DecentralisedBookIndex.Metadata.AuthorRole do
end end
attributes do attributes do
uuid_primary_key :id uuid_primary_key :id, writable?: true
attribute :role, :string do attribute :role, :string do
allow_nil? true allow_nil? true

@ -25,12 +25,12 @@ defmodule DecentralisedBookIndex.Metadata.BookId do
create :create do create :create do
primary? true primary? true
accept [:type, :bid, :order] accept [:id, :type, :bid, :order]
end end
update :update do update :update do
primary? true primary? true
accept [:type, :bid, :order] accept [:id, :type, :bid, :order]
end end
read :by_id do read :by_id do
@ -41,7 +41,7 @@ defmodule DecentralisedBookIndex.Metadata.BookId do
end end
attributes do attributes do
uuid_primary_key :id uuid_primary_key :id, writable?: true
attribute :type, :string do attribute :type, :string do
allow_nil? false allow_nil? false

@ -43,6 +43,72 @@ defmodule DecentralisedBookIndex.Sync.DataTransformers.BookSyncTest do
assert server.id == saved_book.dbi_server_id assert server.id == saved_book.dbi_server_id
end 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 test "update an existing book" do
server = generate(dbi_server(url: @test_server_endpoint)) server = generate(dbi_server(url: @test_server_endpoint))
@ -66,5 +132,142 @@ defmodule DecentralisedBookIndex.Sync.DataTransformers.BookSyncTest do
assert book = saved_book assert book = saved_book
end 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 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 end

Loading…
Cancel
Save