modernice / goes

goes is an event-sourcing framework for Go.
https://goes.modernice.dev
Apache License 2.0
134 stars 12 forks source link

Automated lookups #17

Closed bounoable closed 2 years ago

bounoable commented 2 years ago
package user

const Aggregate = "user"
const NameLookup = "name"
const EmailLookup = "email"

const CreatedEvent = "user.created"

type CreatedData struct {
  Name string
  Email string
}

func (evt Created) ProvideLookup(p lookup.Provider)  {
  p.Provide(Aggregate, NameLookup, evt.Name)
  p.Provide(Aggregate, EmailLookup, evt.Email)
}

// somewhere else

var ctx context.Context

var store event.Store
l := lookup.New(store, Created) // create lookup from events in event store

errs, err := l.Run(ctx) // run the lookup projection

var aggregateID uuid.UUID

userID, err := l.Lookup(ctx, Aggregate, EmailLookup, "bob@example.com")
bounoable commented 2 years ago

Events

package user

type CreatedData struct {
  Name  string
  Email string
}

func (data CreatedData) Lookup(p lookup.Provider) {
  // provide the "email" lookup for the user of this event
  p.Provide("email", data.Email)
}

type DeletedData struct {}

func (DeletedData) Lookup(p lookup.Provider) {
  // remove the "email" lookup for the user of this event
  p.Remove("email", "foo", "bar", "...")
}

Usage

var store event.Store
var bus event.Bus

l := lookup.New(store, bus, []string{"user.created", "user.deleted"})

errs, err := l.Run(context.TODO())
<-l.Ready() // wait for lookup to be ready

var userID uuid.UUID

email, err := l.Lookup(context.TODO(), "user", "email", userID) // return the email of the last 
bounoable commented 2 years ago

closed by 38c8f33755fc531c236381fe539a1d7e76d21ef8