# README
event-store-adapter-go
このライブラリは、DynamoDBをCQRS/Event Sourcing用のEvent Storeにするためのものです。
使い方
EventStoreを使えば、Event Sourcing対応リポジトリを簡単に実装できます。
type UserAccountRepository struct {
eventStore esag.EventStore
aggregateConverter esag.AggregateConverter
eventConverter esag.EventConverter
}
func (r *UserAccountRepository) StoreEvent(event esag.Event, version uint64) error {
return r.eventStore.PersistEvent(event, version)
}
func (r *UserAccountRepository) StoreEventAndSnapshot(event esag.Event, aggregate esag.Aggregate) error {
return r.eventStore.PersistEventAndSnapshot(event, aggregate)
}
func (r *UserAccountRepository) findById(id esag.AggregateId) (*userAccount, error) {
result, err := r.eventStore.GetLatestSnapshotById(id, r.aggregateConverter)
if err != nil {
return nil, err
}
if result.Empty() {
return nil, fmt.Errorf("not found")
} else {
events, err := r.eventStore.GetEventsByIdSinceSeqNr(id, result.Aggregate().GetSeqNr()+1, r.eventConverter)
if err != nil {
return nil, err
}
return replayUserAccount(events, result.Aggregate().(*userAccount)), nil
}
}
以下はリポジトリの使用例です。
eventStore, err := NewEventStoreOnDynamoDB(dynamodbClient, "journal", "snapshot", "journal-aid-index", "snapshot-aid-index", 1)
// eventStore := NewEventStoreOnMemory() // if use repository for on-memory
if err != nil {
return err
}
repository := NewUserAccountRepository(eventStore)
userAccount1, userAccountCreated := NewUserAccount(UserAccountId{Value: "1"}, "test")
// Store an aggregate with a create event
err = repository.StoreEvent(userAccountCreated, userAccount1.Version, userAccount1)
if err != nil {
return err
}
// Replay the aggregate from the event store
userAccount2, err := repository.FindById(&initial.Id)
if err != nil {
return err
}
// Execute a command on the aggregate
userAccountUpdated, userAccountRenamed := userAccount2.ChangeName("test2")
// Store the new event without a snapshot
err = repository.StoreEvent(userAccountRenamed, userAccountUpdated.Version)
// Store the new event with a snapshot
// err = repository.StoreEventAndSnapshot(userAccountRenamed, userAccountUpdated)
if err != nil {
return err
}
テーブル仕様
docs/DATABASE_SCHEMA.ja.mdを参照してください。
マイグレーションガイド
docs/MIGRATION_GUIDE.ja.mdを参照してください。
ライセンス
MITライセンスです。詳細はLICENSEを参照してください。