1.2 KiB · text History bfa2c00
defmodule DiogramosWeb.Api.V1.CanvasJSON do
  @moduledoc """
  Canvas payloads.

  `document` is emitted **verbatim** — the same jsonb map
  `Diogramos.Diagrams.Document` validates and stores. It is deliberately
  not remapped into a client-flavored schema: patches stay partial, and a
  client never has to send back fields it didn't understand.

  The list payload omits `document` entirely; a canvas list on a phone
  doesn't need every element of every diagram.
  """

  alias Diogramos.Diagrams.Canvas

  def index(%{canvases: canvases, roles: roles}) do
    %{data: for(canvas <- canvases, do: summary(canvas, roles[canvas.id]))}
  end

  def show(%{canvas: canvas, role: role}) do
    %{data: full(canvas, role)}
  end

  @doc false
  def summary(%Canvas{} = canvas, role) do
    %{
      id: canvas.id,
      slug: canvas.slug,
      title: canvas.title,
      theme: canvas.theme,
      folder_id: canvas.folder_id,
      version: canvas.version,
      role: role,
      inserted_at: canvas.inserted_at,
      updated_at: canvas.updated_at
    }
  end

  @doc false
  def full(%Canvas{} = canvas, role) do
    canvas
    |> summary(role)
    |> Map.put(:document, canvas.document)
  end
end