AshDispatch.Context (AshDispatch v0.5.0)

View Source

Event context passed to all event callbacks and transports.

The context contains:

  • Event data (resources, user, etc.)
  • Metadata (event_id, source, timestamp)
  • Configuration (locale, base_url)
  • Computed values from enrichment

Example

%Context{
  event_id: "orders.created",
  data: %{
    order: %ProductOrder{...},
    user: %User{...}
  },
  user: %User{...},
  locale: "sv",
  base_url: "https://myapp.com",
  now: ~U[2025-01-15 10:00:00Z],
  resource_key: :order
}

Summary

Functions

Recursively atomizes string keys in maps.

Enriches context with additional data.

Merges metadata into context.

Creates a new context.

Gets all assigns for template rendering by merging data and variables.

Types

t()

@type t() :: %AshDispatch.Context{
  base_url: String.t(),
  data: map(),
  event_id: String.t(),
  locale: String.t(),
  metadata: map(),
  now: DateTime.t(),
  opts: map(),
  priority: :urgent | :standard | :informational,
  resource_key: atom() | nil,
  source: String.t() | nil,
  user: struct() | nil,
  variables: map()
}

Functions

atomize_keys(struct)

Recursively atomizes string keys in maps.

Skips structs to preserve Ash resources.

Examples

iex> Context.atomize_keys(%{"user" => %{"email" => "test@example.com"}})
%{user: %{email: "test@example.com"}}

iex> Context.atomize_keys(%User{email: "test@example.com"})
%User{email: "test@example.com"}

enrich(context, map)

enrich(context, key, value)

Enriches context with additional data.

Used by Dispatcher to auto-populate common fields like admins.

Example

context
|> Context.enrich(:admins, list_of_admins)
|> Context.enrich(:metadata, %{custom: "value"})

merge_metadata(context, metadata)

Merges metadata into context.

new(opts)

Creates a new context.

Options

  • :event_id - Event identifier
  • :data - Event data map (resources, domain objects)
  • :variables - Variables map (tokens, simple values, template data)
  • :resource_key - Hint for nested user lookup
  • :locale - Locale for i18n
  • :user - Actor/user triggering the event
  • :base_url - Base URL for link building
  • :metadata - Additional metadata
  • :opts - Additional options

Example

Context.new(
  event_id: "orders.created",
  data: %{order: order, user: user},
  variables: %{confirmation_token: token},
  user: user,
  locale: "sv"
)

template_assigns(context)

Gets all assigns for template rendering by merging data and variables.

Variables take precedence over data in case of key conflicts.

Example

context = %Context{
  data: %{user: user, order: order},
  variables: %{confirmation_token: "abc123"}
}

Context.template_assigns(context)
# => %{user: user, order: order, confirmation_token: "abc123"}