Maestro.Store (Maestro v0.5.0)

View Source

Concise API for events and snapshots.

If you are using the Maestro.Store.Postgres adapter, an Ecto.Repo should be provided.

Summary

Functions

Commit the events and apply all projections within a transaction. If there's a sequence number conflict, the events and projections will be discarded such that the command generating these components could be retried.

Commit the events provided iff there is no sequence number conflict. Otherwise, the command should be retried as indicated by the specific error tuple.

Store the snapshot iff the sequence number is greater than what is in the store. This allows nodes that are partitioned from each other to treat the store as the source of truth even when writing snapshots.

Retrieve all events for a specific aggregate by id and minimum sequence number.

Retrieve a snapshot by aggregate id and minimum sequence number. If no snapshot is found, nil is returned.

Return the maximum allowable sequence number permitted by the durable storage adapter.

Types

event()

@type event() :: Maestro.Types.Event.t()

events()

@type events() :: [event()]

id()

@type id() :: HLClock.Timestamp.t()

opts()

@type opts() :: [{:max_sequence, sequence()}]

sequence()

@type sequence() :: non_neg_integer()

snapshot()

@type snapshot() :: Maestro.Types.Snapshot.t()

Functions

commit_all(events, projections)

@spec commit_all(events(), [module()]) :: :ok | {:error, :retry_command}

Commit the events and apply all projections within a transaction. If there's a sequence number conflict, the events and projections will be discarded such that the command generating these components could be retried.

commit_events(events)

@spec commit_events(events()) :: :ok | {:error, :retry_command}

Commit the events provided iff there is no sequence number conflict. Otherwise, the command should be retried as indicated by the specific error tuple.

commit_snapshot(snapshot)

@spec commit_snapshot(snapshot()) :: :ok

Store the snapshot iff the sequence number is greater than what is in the store. This allows nodes that are partitioned from each other to treat the store as the source of truth even when writing snapshots.

get_events(aggregate_id, seq, opts \\ [])

@spec get_events(id(), sequence(), opts()) :: events()

Retrieve all events for a specific aggregate by id and minimum sequence number.

Options include:

  • :max_sequence - useful hydration purposes (defaults to max_sequence/0)

get_snapshot(aggregate_id, seq, opts \\ [])

@spec get_snapshot(id(), sequence(), opts()) :: snapshot() | nil

Retrieve a snapshot by aggregate id and minimum sequence number. If no snapshot is found, nil is returned.

Options include:

  • :max_sequence - useful hydration purposes (defaults to max_sequence/0)

max_sequence()

@spec max_sequence() :: non_neg_integer()

Return the maximum allowable sequence number permitted by the durable storage adapter.