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:
- Creating a new note in an existing section (section_id set, source_note_id nil)
- Editing an existing note (section_id set, source_note_id set)
- 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
@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
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.
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.
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()
Same as input/1, except restricts the keys to values accepted by the action provided.
@spec note_fields() :: [atom()]
The note's fields a draft of it holds.