FYI.Multi (FYI v1.0.2)

View Source

Integrates FYI events with Ecto.Multi for transactional event emission.

This ensures events are only emitted after the transaction commits successfully.

Example

Ecto.Multi.new()
|> Ecto.Multi.insert(:purchase, changeset)
|> FYI.Multi.emit("purchase.created", fn %{purchase: p} ->
  %{payload: %{amount: p.amount, currency: p.currency}, actor: p.user_id}
end)
|> Repo.transaction()

The event will only be emitted if the entire transaction succeeds.

Summary

Functions

Adds an FYI event emission to an Ecto.Multi.

Adds an FYI event emission with a static payload.

Functions

emit(multi, event_name, callback)

@spec emit(Ecto.Multi.t(), String.t(), (map() -> map())) :: Ecto.Multi.t()

Adds an FYI event emission to an Ecto.Multi.

The callback receives the Multi changes map and should return a map with:

  • :payload - event payload (required)
  • :actor - who triggered the event (optional)
  • :tags - additional metadata (optional)
  • :source - event source (optional)

Examples

Multi.new()
|> Multi.insert(:user, user_changeset)
|> FYI.Multi.emit("user.created", fn %{user: user} ->
  %{payload: %{email: user.email}, actor: user.id}
end)

# With static payload
Multi.new()
|> Multi.update(:settings, settings_changeset)
|> FYI.Multi.emit("settings.updated", fn _ ->
  %{payload: %{}, actor: current_user_id}
end)

emit(multi, event_name, payload, opts \\ [])

@spec emit(Ecto.Multi.t(), String.t(), map(), keyword()) :: Ecto.Multi.t()

Adds an FYI event emission with a static payload.

Examples

Multi.new()
|> Multi.delete(:subscription, subscription)
|> FYI.Multi.emit("subscription.cancelled", %{reason: "user_requested"}, actor: user_id)