MishkaDocument.NoteDraft (Mishka Document v0.0.1)

Copy Markdown View Source

Manages draft proposals for note changes within sections.

This resource represents proposed changes to notes that must go through a dual approval workflow (content review and technical review) before being applied to the actual Note resource.

Three main use cases:

  1. Creating a new note in an existing section (section_id set, source_note_id nil)
  2. Editing an existing note (section_id set, source_note_id set)
  3. Creating a note as part of a new section (section_draft_id set, source_note_id nil)

The draft includes version management:

  • version_increment_type determines if a new version should be created
  • When approved, changes are automatically applied via AutoApplyDraft change
  • If part of a section draft, must wait for section draft to be applied first

Multi-tenant isolation ensures drafts are properly segregated between sites.

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.

Who created draft, for the reader whose read loaded its :created_by_user and :created_by_master?: the email the reader may see, "Master" for a master, else "Unknown".

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.

The note's fields a draft of it holds.

Types

t()

@type t() :: %MishkaDocument.NoteDraft{
  __lateral_join_source__: term(),
  __meta__: term(),
  __metadata__: term(),
  __order__: term(),
  aggregates: term(),
  applied_at: term(),
  archived_at: term(),
  calculations: term(),
  change_version: term(),
  changed_fields: term(),
  content: term(),
  content_review_status: term(),
  content_word_count: term(),
  created_by_master?: term(),
  created_by_user: term(),
  created_by_user_id: term(),
  id: term(),
  inserted_at: term(),
  master_section: term(),
  master_section_draft: term(),
  master_source_note: term(),
  master_workspace_version: term(),
  order_position: term(),
  schema: term(),
  section: term(),
  section_draft: term(),
  section_draft_id: term(),
  section_id: term(),
  seo_tags: term(),
  site: term(),
  site_id: term(),
  source_note: term(),
  source_note_id: term(),
  technical_review_status: term(),
  title: term(),
  updated_at: term(),
  version_increment_type: term(),
  workspace_version: term(),
  workspace_version_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.

creator(draft)

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

Who created draft, for the reader whose read loaded its :created_by_user and :created_by_master?: the email the reader may see, "Master" for a master, else "Unknown".

default_short_name()

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(_, _)

note_fields()

@spec note_fields() :: [atom()]

The note's fields a draft of it holds.

primary_key_matches?(left, right)