MishkaCmsCore.Runtime.Site (Mishka CMS Core v0.0.1)

Copy Markdown View Source

Manages sites in the MishkaCMS multi-tenant runtime system.

This resource represents individual sites (tenants) in the CMS, each with its own domain, content, and configuration. Sites serve as the top-level organizational unit, containing pages, layouts, components, error pages, and JavaScript hooks. The host-based routing system uses priority ordering to determine which site handles incoming requests when multiple sites might match a domain pattern.

Sites implement activation/deactivation controls allowing temporary disabling without data loss, and soft deletion through archival for recovery capabilities. Each site maintains relationships with all its associated resources, providing complete content isolation in the multi-tenant architecture. The resource enforces unique constraints on both site names and hosts to prevent conflicts.

Database-level constraints ensure valid domain formats and prevent modifications to archived sites. When sites are modified, background jobs are triggered to recompile associated resources. The resource provides comprehensive access control through the policy system, ensuring proper authorization for site management operations.

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.

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.

Mode → badge colours and labels, in the shape the Gervaz :badge column type expects. Shared by the Mode table column and the site detail modal so both draw the same badge from one definition.

Types

t()

@type t() :: %MishkaCmsCore.Runtime.Site{
  __lateral_join_source__: term(),
  __meta__: term(),
  __metadata__: term(),
  __order__: term(),
  active: term(),
  aggregates: term(),
  allowed_origins: term(),
  archived_at: term(),
  calculations: term(),
  components: term(),
  error_pages: term(),
  frontend_domain: term(),
  host: term(),
  id: term(),
  inserted_at: term(),
  js_hooks: term(),
  layouts: term(),
  master: term(),
  mode: term(),
  name: term(),
  pages: term(),
  priority: term(),
  updated_at: term(),
  users: 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.

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

mode_badge_config()

Mode → badge colours and labels, in the shape the Gervaz :badge column type expects. Shared by the Mode table column and the site detail modal so both draw the same badge from one definition.

primary_key_matches?(left, right)