Skuld.Effects.ChangeEvent (skuld v0.1.26)
View SourceGeneric 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.UserWith 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
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
@type op() :: :insert | :update | :upsert | :delete
Changeset operation type
@type t() :: %Skuld.Effects.ChangeEvent{ changeset: Ecto.Changeset.t(), op: op(), opts: keyword() }
ChangeEvent struct
Functions
@spec changeset(t()) :: Ecto.Changeset.t()
Extract the changeset from a ChangeEvent.
@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)
@spec insert( Ecto.Changeset.t(), keyword() ) :: t()
Create an insert event.
Example
ChangeEvent.insert(User.changeset(%User{}, attrs))
ChangeEvent.insert(changeset, returning: true)
Extract the operation type from a ChangeEvent.
Extract the options from a ChangeEvent.
Extract the schema module from a ChangeEvent.
Example
event = ChangeEvent.insert(User.changeset(%User{}, attrs))
ChangeEvent.schema(event)
#=> MyApp.User
@spec update( Ecto.Changeset.t(), keyword() ) :: t()
Create an update event.
Example
ChangeEvent.update(User.changeset(user, attrs))
ChangeEvent.update(changeset, force: true)
@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)