Current section
Files
Jump to
Current section
Files
lib/phoenix/sync/writer/format/tanstack_db.ex
defmodule Phoenix.Sync.Writer.Format.TanstackDB do
@moduledoc """
Implements the `Phoenix.Sync.Writer.Format` behaviour for the data format used by
[TanStack/db](https://github.com/TanStack/db).
"""
alias Phoenix.Sync.Writer.Transaction
@behaviour Phoenix.Sync.Writer.Format
@impl Phoenix.Sync.Writer.Format
def parse_transaction([]), do: {:error, "empty transaction"}
def parse_transaction(json) when is_binary(json) do
with {:ok, operations} <- Jason.decode(json) do
parse_transaction(operations)
end
end
def parse_transaction(operations) when is_list(operations) do
with {:ok, operations} <- Transaction.parse_operations(operations, &parse_operation/1) do
Transaction.new(operations)
end
end
def parse_transaction(operations) do
{:error, "invalid operation list #{inspect(operations)}"}
end
def parse_operation(%{"type" => type} = m) do
{data, changes} =
case type do
# for inserts we don't use the original data, just the changes
"insert" -> {%{}, m["modified"]}
"update" -> {m["original"], m["changes"]}
"delete" -> {m["original"], %{}}
end
Transaction.operation(type, get_in(m, ["syncMetadata", "relation"]), data, changes)
end
end