When generating a new Sequent project the configuration can be found in config/initializers/sequent.rb. You are free to determine your own location as long as you require the file at startup of your application.

There are many configuration options, but generally sticking to the defaults should be sufficient. With that thought in mind this chapter is divided into 3 sections:

  1. The minimum configuration you need
  2. Configuration options you will likely want to change
  3. The complete overview of options. Basically the rest.

Minimum configuration

As a bare minimum you need:

require './db/migrations'

Sequent.configure do |config|
  config.migrations_class_name = 'Migrations'

  # sequent >= 6.0.2
  config.enable_autoregistration = true

  # sequent < 6.0.2
  config.command_handlers = [
    YourCommandHandler.new,
    OtherCommandHandler.new,
  ]

  config.event_handlers = [
    MyProjector.new,
    MyWorkflow.new,
  ]
  # end sequent < 6.0.2

end

The migration_class_name is the name of the class used to define your Migrations. See the Migrations chapter for an in-depth explanation.

Autoregistration

Sequent 6.0.2 introduced autoregistration of command_handlers and event_handlers via setting enable_autoregistration to true. Autoregistered classes will be appended to any already manually registered command_handlers and event_handlers. If Sequent detects duplicates it will currently fail. When setting enable_autoregistration to true in your initializer any CommandHandlers, Projectors and Workflows are automatically registered in your Sequent configuration. When you have base classes that you don’t want to have automatically registered you can set self.abstract_class = true for these classes. Another option to skip autoregistration is to set self.skip_autoregister to true.

Frequently used configuration:

Sequent.configure do |config|
  # minimum config omitted

  # common config options
  config.command_filters = [
    MyFilter.new,
  ]

  config.number_of_replay_processes = 4

  config.logger = Logger.new(STDOUT)
end

CommandFilters

CommandFilters can be used to enforce certain criteria are met before executing commands. Typical concerns are authorization in a user based application. A filter must implement the method execute(command). If any of the CommandFilters raises an Exception, execution is aborted for all passed Commands.

Example


class AdminFilter
  def execute(command)
    fail NotAnAdmin unless is_allowed?(command.user_id, command.class)
  end

  # only admin may execute admin commands
  def is_allowed?(user_id, command_class)
    return false if !UserRecord.is_admin?(user_id) && command_class <= AdminCommand
    return true
  end
end

Sequent.configure do |config|
  config.command_filters = [
    AdminFilter.new,
  ]
end

number_of_replay_processes

The number of processes used to replay the events when doing a Migration. By default this is 4. This should be adjusted to the capacity of your server running the Migration.

logger

The ruby Logger used by Sequent.

Complete configuration

For the latest configuration possibilities please check the Sequent::Configuration implementation.

Option Meaning Default Value
migrations_class_name Required. The name of the class containing the migrations. 'Migrations'
command_handlers The list of CommandHandlers []
event_handlers The list of Projectors and Workflows []
aggregate_repository The AggregateRepository Sequent::Core::AggregateRepository.new
command_filters The list of CommandFilters []
command_service The CommandService Sequent::Core::CommandService.new
database_config_directory The directory in which db config can be found 'db'
database_schema_directory The directory in which db schema and migrations can be found 'db'
disable_event_handlers If true no event_handlers will be called false
error_locale_resolver A lambda that returns the desired locale for command validation errors -> { I18n.locale &#124;&#124; :en }
event_publisher The EventPublisher used by the EventStore. Sequent::Core::EventPublisher.new
event_record_class The class mapped to the event_records Sequent::Core::EventRecord
event_record_hooks_class The class with EventRecord life cycle hooks Sequent::Core::EventRecordHooks
event_store The EventStore Sequent::Core::EventStore.new
event_store_schema_name The name of the db schema in which the EventStore is installed 'sequent_schema'
migration_sql_files_directory The location of the sql files for Migrations 'db/tables'
number_of_replay_processes The number of process used while offline migration 4
offline_replay_persistor_class The class used to persist the Projectors during the offline migration part. Sequent::Core::Persistors::ActiveRecordPersistor
online_replay_persistor_class The class used to persist the Projectors. Sequent::Core::Persistors::ActiveRecordPersistor
primary_database_key A symbol indicating the primary database if multiple databases are specified within the provided db_config :primary
primary_database_role A symbol indicating the primary database role if using multiple databases with active record :writing
snapshot_record_class The class mapped to the snapshot_records table Sequent::Core::SnapshotRecord
stream_record_class The class mapped to the stream_records table Sequent::Core::StreamRecord
strict_check_attributes_on_apply_events Whether or not sequent should fail on calling apply with invalid attributes. false. Will be enabled by default in the next major release.
time_precision Sets the precision of encoded time values. Defaults to 3 (equivalent to millisecond precision) ActiveSupport::JSON::Encoding.time_precision
transaction_provider The transaction provider used by the CommandService Sequent::Core::Transactions::ActiveRecordTransactionProvider.new
uuid_generator The UUID Generator used. Mainly useful for testing Sequent::Core::RandomUuidGenerator
versions_table_name The name of the table in which Sequent checks which migration version is currently active 'sequent_versions'
view_schema_name The name of the view_schema in which the projections are created. 'view_schema'
enable_autoregistration Enable autoregistration. This will autoregister Sequent::CommandHandlers, Sequent::Projectors and Sequent::Workflows false