View Source Sorcery.EventStore (Sorcery v0.1.0)

Provides a clean interface for storing and retrieving events.

Configuration

In your config.exs:

config :sorcery, :event_store,
  store: Sorcery.Stores.PostgresStore,
  store_opts: [
    repo: MyApp.Repo,
    table_name: "events"
  ]

Or for in-memory storage:

config :sorcery, :event_store,
  store: Sorcery.Stores.MemoryStore

Usage

# Create and store an event
event = Sorcery.Event.new(%{
  type: "user_registered",
  data: %{user_id: "123"},
  domain: "users",
  instance_id: "instance_1",
  domain_sequence_number: 1
})

Sorcery.EventStore.append(event)

# Retrieve events with pagination
{:ok, events, pagination} = Sorcery.EventStore.get_events()

# Query specific events
{:ok, events, pagination} = Sorcery.EventStore.get_events_by_domain("users")
{:ok, events, pagination} = Sorcery.EventStore.get_events_by_type("user_registered")

Summary

Functions

Appends one or more events to the configured store.

Retrieves events from the configured store.

Get events in time range.

Starts the configured event store.

Returns the configured event store module.

Returns the configured options for the event store.

Subscribes to the event store.

Types

query()

Functions

append(events)

@spec append(Sorcery.Event.t() | [Sorcery.Event.t()]) ::
  {:ok, [Sorcery.Event.t()]} | {:error, term()}

Appends one or more events to the configured store.

child_spec(opts)

get_events(query \\ nil, opts \\ [])

@spec get_events(query() | nil, Keyword.t()) ::
  {:ok, [Sorcery.Event.t()]} | {:error, term()}

Retrieves events from the configured store.

Query Parameters

  • :type - Filter by event type
  • :domain - Filter by domain
  • :instance_id - Filter by instance ID
  • :from - Filter events after this timestamp
  • :to - Filter events before this timestamp

Options

  • :limit - Maximum number of events per page (default: 100)
  • :offset - Number of events to skip

Returns {:ok, events, pagination} where pagination includes:

  • :total_count - Total number of events
  • :page_size - Number of events per page
  • :page_number - Current page number
  • :total_pages - Total number of pages
  • :has_next? - Whether there are more pages
  • :has_prev? - Whether there are previous pages

get_events_by_domain(domain, opts \\ [])

@spec get_events_by_domain(String.t(), Keyword.t()) ::
  {:ok, [Sorcery.Event.t()]} | {:error, term()}

Get events by domain.

Options

  • :limit - Maximum number of events per page (default: 100)
  • :offset - Number of events to skip

get_events_by_instance(domain, instance_id, opts \\ [])

@spec get_events_by_instance(String.t(), String.t(), Keyword.t()) ::
  {:ok, [Sorcery.Event.t()]} | {:error, term()}

Get events by instance.

Options

  • :limit - Maximum number of events per page (default: 100)
  • :offset - Number of events to skip

get_events_by_type(type, opts \\ [])

@spec get_events_by_type(String.t(), Keyword.t()) ::
  {:ok, [Sorcery.Event.t()]} | {:error, term()}

Get events by type.

Options

  • :limit - Maximum number of events per page (default: 100)
  • :offset - Number of events to skip

get_events_by_type_in_domain(type, domain, opts \\ [])

@spec get_events_by_type_in_domain(String.t(), String.t(), Keyword.t()) ::
  {:ok, [Sorcery.Event.t()]} | {:error, term()}

Get events by type in domain.

Options

  • :limit - Maximum number of events per page (default: 100)
  • :offset - Number of events to skip

get_events_in_range(from, to, opts \\ [])

@spec get_events_in_range(DateTime.t(), DateTime.t(), Keyword.t()) ::
  {:ok, [Sorcery.Event.t()]} | {:error, term()}

Get events in time range.

Options

  • :limit - Maximum number of events per page (default: 100)
  • :offset - Number of events to skip

start_link(opts \\ [])

@spec start_link(Keyword.t()) :: GenServer.on_start()

Starts the configured event store.

store()

@spec store() :: module()

Returns the configured event store module.

store_opts()

@spec store_opts() :: Keyword.t()

Returns the configured options for the event store.

subscribe()

@spec subscribe() :: :ok

Subscribes to the event store.