Categorygithub.com/j5ik2o/event-store-adapter-go

# README

event-store-adapter-go

CI Go project version Renovate License tokei

このライブラリは、DynamoDBをCQRS/Event Sourcing用のEvent Storeにするためのものです。

English

使い方

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を参照してください。

他の言語のための実装

# Packages

No description provided by the author
No description provided by the author