Current section
Files
Jump to
Current section
Files
lib/cf_sync/sync_payload.ex
defmodule CFSync.SyncPayload do
@moduledoc false
alias CFSync.Entry
alias CFSync.Asset
@type delta() :: {:upsert, Entry.t() | Asset.t()} | {:delete_asset | :delete_entry, binary()}
defstruct next_url: "",
next_url_type: :next_page,
deltas: []
@type t() :: %__MODULE__{
next_url: binary(),
next_url_type: :next_page | :next_sync,
deltas: list(delta())
}
@spec new(%{:items => [], optional(any) => any}, map, binary) ::
CFSync.SyncPayload.t()
def new(%{"nextPageUrl" => url, "items" => items}, content_types, locale)
when is_list(items) and is_binary(locale) do
%__MODULE__{
next_url: url,
next_url_type: :next_page,
deltas: deltas(items, content_types, locale)
}
end
def new(%{"nextSyncUrl" => url, "items" => items}, content_types, locale)
when is_list(items) and is_binary(locale) do
%__MODULE__{
next_url: url,
next_url_type: :next_sync,
deltas: deltas(items, content_types, locale)
}
end
defp deltas(items, content_types, locale) do
for %{"sys" => %{"id" => id, "type" => type}} = item <- items do
case type do
"Asset" ->
{:upsert, Asset.new(item, locale)}
"Entry" ->
{:upsert, Entry.new(item, content_types, locale)}
"DeletedAsset" ->
{:delete_asset, id}
"DeletedEntry" ->
{:delete_entry, id}
end
end
end
end