MishkaDocument.WorkspaceVersion (Mishka Document v0.0.1)

Copy Markdown View Source

Manages workspace versions in the MishkaDocument plugin.

This resource represents different versions of a workspace, allowing version control and history tracking for workspace configurations. Each version belongs to a specific workspace and can have various statuses (draft, alpha, beta, stable, archived).

Versions support semantic versioning patterns (e.g., "0.0.1", "1.0.0") and can be cloned from existing versions. The resource tracks which version is the latest for a given workspace and maintains publication timestamps.

Database-level constraints ensure data integrity with version number validation. Multi-tenant isolation ensures versions are properly segregated between sites through their parent workspace relationship.

Summary

Functions

Apply the full GuardedStruct pipeline (sanitize → validate → derive → main_validator) to attrs and return either {:ok, transformed_attrs} or {:error, errors}. Wire this into an Ash.Resource.Change to plug guardedstruct rules into Ash's changeset pipeline.

O(1) lookup of a field's compile-time metadata by name. Returns nil for unknown fields.

Compile-time-baked MapSet of every field name owned by the guardedstruct block. Used by GuardedStruct.AshResource.Change to decide, in O(1), whether a key in changeset.atomics belongs to the pipeline.

Whether actor may clone a version on the dashboard: it holds the workspace area, which writes versions, and the section area, which writes their pages and notes — what :clone and :master_clone ask.

What the delete button asks before a version is deleted: a warning naming every version cloned from it (:clone_numbers), which goes with it, or the plain question when there is none.

What "Make independent" asks before it unties a version from the one it was cloned from.

The site the version form writes for: a master's chosen site, a site user's own.

The document the version form is for: the one it was opened with, or the edited record's. nil when it names none, so its pickers offer no version.

Validates that the keys in the provided input are valid for at least one action on the resource.

Same as input/1, except restricts the keys to values accepted by the action provided.

How a version is named in a list of versions to pick: its number, and its name when it has one.

Types

t()

@type t() :: %MishkaDocument.WorkspaceVersion{
  __lateral_join_source__: term(),
  __meta__: term(),
  __metadata__: term(),
  __order__: term(),
  aggregates: term(),
  calculations: term(),
  clone_numbers: term(),
  cloned_versions: term(),
  dated?: term(),
  description: term(),
  effective_permissions: term(),
  id: term(),
  inserted_at: term(),
  is_latest_for_version: term(),
  lineage_as_new: term(),
  lineage_as_source: term(),
  master_sections: term(),
  master_source_version: term(),
  master_workspace: term(),
  published_at: term(),
  sections: term(),
  site: term(),
  site_id: term(),
  source_version: term(),
  source_version_id: term(),
  status: term(),
  tenant_sections: term(),
  updated_at: term(),
  version_name: term(),
  version_number: term(),
  workspace: term(),
  workspace_id: term()
}

Functions

__guarded_change__(attrs, error? \\ false)

Apply the full GuardedStruct pipeline (sanitize → validate → derive → main_validator) to attrs and return either {:ok, transformed_attrs} or {:error, errors}. Wire this into an Ash.Resource.Change to plug guardedstruct rules into Ash's changeset pipeline.

The function is named __guarded_change__ because it does more than validate — it can also transform values (trim, downcase, slugify, auto-fill, etc.) before they reach the data layer.

__guarded_field_meta__(name)

O(1) lookup of a field's compile-time metadata by name. Returns nil for unknown fields.

__guarded_field_name_set__()

Compile-time-baked MapSet of every field name owned by the guardedstruct block. Used by GuardedStruct.AshResource.Change to decide, in O(1), whether a key in changeset.atomics belongs to the pipeline.

clone_allowed?(actor)

@spec clone_allowed?(map() | nil) :: boolean()

Whether actor may clone a version on the dashboard: it holds the workspace area, which writes versions, and the section area, which writes their pages and notes — what :clone and :master_clone ask.

default_short_name()

delete_confirm(arg1)

@spec delete_confirm(map()) :: String.t()

What the delete button asks before a version is deleted: a warning naming every version cloned from it (:clone_numbers), which goes with it, or the plain question when there is none.

detach_confirm(version)

@spec detach_confirm(map()) :: String.t()

What "Make independent" asks before it unties a version from the one it was cloned from.

form_site_id(state)

@spec form_site_id(map()) :: String.t() | nil

The site the version form writes for: a master's chosen site, a site user's own.

form_workspace_id(state)

@spec form_workspace_id(map()) :: String.t() | nil

The document the version form is for: the one it was opened with, or the edited record's. nil when it names none, so its pickers offer no version.

input(opts)

@spec input(values :: map() | Keyword.t()) :: map() | no_return()

Validates that the keys in the provided input are valid for at least one action on the resource.

Raises a KeyError error at compile time if not. This exists because generally a struct should only ever be created by Ash as a result of a successful action. You should not be creating records manually in code, e.g %MyResource{value: 1, value: 2}. Generally that is fine, but often with embedded resources it is nice to be able to validate the keys that are being provided, e.g

Resource
|> Ash.Changeset.for_create(:create, %{embedded: EmbeddedResource.input(foo: 1, bar: 2)})
|> Ash.create()

input(opts, action)

@spec input(values :: map() | Keyword.t(), action :: atom()) :: map() | no_return()

Same as input/1, except restricts the keys to values accepted by the action provided.

json_api_match_route(_, _)

primary_key_matches?(left, right)

source_label(map)

@spec source_label(map()) :: String.t()

How a version is named in a list of versions to pick: its number, and its name when it has one.