Skuld.Effects.ChangeEvent (skuld v0.1.26)

View Source

Generic wrapper for changeset persistence operations.

Captures what happened (insert/update/upsert/delete) along with the changeset and any options for the operation.

This follows the Decider pattern where Events are facts about what happened (past tense). Rather than requiring per-schema event structs, this provides a generic wrapper - the schema is derived from the changeset.

Example

alias Skuld.Effects.ChangeEvent

# Create events for different operations
insert_event = ChangeEvent.insert(user_changeset)
update_event = ChangeEvent.update(user_changeset, returning: true)
delete_event = ChangeEvent.delete(user_changeset)

# Extract the schema from an event
ChangeEvent.schema(insert_event)
#=> MyApp.User

With EventAccumulator

alias Skuld.Effects.{EventAccumulator, ChangeEvent}

comp do
  user_cs = User.changeset(%User{}, %{name: "Alice"})
  _ <- EventAccumulator.emit(ChangeEvent.insert(user_cs))
  return(:ok)
end
|> EventAccumulator.with_handler(output: &{&1, &2})
|> Comp.run!()
#=> {:ok, [%ChangeEvent{op: :insert, ...}]}

Summary

Types

Changeset operation type

t()

ChangeEvent struct

Functions

Extract the changeset from a ChangeEvent.

Create a delete event.

Create an insert event.

Extract the operation type from a ChangeEvent.

Extract the options from a ChangeEvent.

Extract the schema module from a ChangeEvent.

Create an update event.

Create an upsert event.

Types

op()

@type op() :: :insert | :update | :upsert | :delete

Changeset operation type

t()

@type t() :: %Skuld.Effects.ChangeEvent{
  changeset: Ecto.Changeset.t(),
  op: op(),
  opts: keyword()
}

ChangeEvent struct

Functions

changeset(change_event)

@spec changeset(t()) :: Ecto.Changeset.t()

Extract the changeset from a ChangeEvent.

delete(changeset, opts \\ [])

@spec delete(
  Ecto.Changeset.t(),
  keyword()
) :: t()

Create a delete event.

Example

ChangeEvent.delete(Ecto.Changeset.change(user))
ChangeEvent.delete(changeset, stale_error_field: :id)

insert(changeset, opts \\ [])

@spec insert(
  Ecto.Changeset.t(),
  keyword()
) :: t()

Create an insert event.

Example

ChangeEvent.insert(User.changeset(%User{}, attrs))
ChangeEvent.insert(changeset, returning: true)

op(change_event)

@spec op(t()) :: op()

Extract the operation type from a ChangeEvent.

opts(change_event)

@spec opts(t()) :: keyword()

Extract the options from a ChangeEvent.

schema(change_event)

@spec schema(t()) :: module()

Extract the schema module from a ChangeEvent.

Example

event = ChangeEvent.insert(User.changeset(%User{}, attrs))
ChangeEvent.schema(event)
#=> MyApp.User

update(changeset, opts \\ [])

@spec update(
  Ecto.Changeset.t(),
  keyword()
) :: t()

Create an update event.

Example

ChangeEvent.update(User.changeset(user, attrs))
ChangeEvent.update(changeset, force: true)

upsert(changeset, opts \\ [])

@spec upsert(
  Ecto.Changeset.t(),
  keyword()
) :: t()

Create an upsert event.

Example

ChangeEvent.upsert(changeset, conflict_target: :email)
ChangeEvent.upsert(changeset, on_conflict: :replace_all)