diff --git a/internal/eventstore/v2/write_model.go b/internal/eventstore/v2/write_model.go new file mode 100644 index 000000000..7d43d46a1 --- /dev/null +++ b/internal/eventstore/v2/write_model.go @@ -0,0 +1,45 @@ +package eventstore + +func NewReadModel() *ReadModel { + return &ReadModel{ + Events: []EventReader{}, + } +} + +//WriteModel is the minimum representation of a command side view model. +// It implements a basic reducer +// it's purpose is to reduce events to create new ones +type WriteModel struct { + AggregateID string `json:"-"` + ProcessedSequence uint64 `json:"-"` + Events []EventReader `json:"-"` +} + +//AppendEvents adds all the events to the read model. +// The function doesn't compute the new state of the read model +func (rm *WriteModel) AppendEvents(events ...EventReader) *WriteModel { + rm.Events = append(rm.Events, events...) + return rm +} + +//Reduce is the basic implementaion of reducer +// If this function is extended the extending function should be the last step +func (rm *WriteModel) Reduce() error { + if len(rm.Events) == 0 { + return nil + } + + if rm.AggregateID == "" { + rm.AggregateID = rm.Events[0].AggregateID() + } + if rm.ResourceOwner == "" { + rm.ResourceOwner = rm.Events[0].ResourceOwner() + } + + rm.ProcessedSequence = rm.Events[len(rm.Events)-1].Sequence() + + // all events processed and not needed anymore + rm.Events = nil + rm.Events = []EventReader{} + return nil +} diff --git a/internal/v2/business/iam/member.go b/internal/v2/business/iam/member.go index b51fb2b4b..8b7aff98a 100644 --- a/internal/v2/business/iam/member.go +++ b/internal/v2/business/iam/member.go @@ -26,7 +26,6 @@ func (r *Repository) AddIAMMember(ctx context.Context, member *iam_model.IAMMemb iamAgg := iam_repo.AggregateFromReadModel(iam). PushMemberAdded(ctx, member.UserID, member.Roles...) - // PushEvents(iam_repo.NewMemberAddedEvent(ctx, member.UserID, member.Roles...)) events, err := r.eventstore.PushAggregates(ctx, iamAgg) if err != nil { diff --git a/internal/v2/repository/iam/aggregate.go b/internal/v2/repository/iam/aggregate.go index 7913555da..f44978c0f 100644 --- a/internal/v2/repository/iam/aggregate.go +++ b/internal/v2/repository/iam/aggregate.go @@ -21,6 +21,8 @@ type Aggregate struct { SetUpStarted Step SetUpDone Step + + Members MembersAggregate } func NewAggregate( diff --git a/internal/v2/repository/iam/member.go b/internal/v2/repository/iam/member.go index 0e4a03db3..ad4fce148 100644 --- a/internal/v2/repository/iam/member.go +++ b/internal/v2/repository/iam/member.go @@ -13,10 +13,6 @@ var ( MemberRemovedEventType = iamEventTypePrefix + member.RemovedEventType ) -type MemberWriteModel struct { - member.WriteModel -} - type MemberReadModel struct { member.ReadModel } @@ -67,7 +63,7 @@ func NewMemberAddedEvent( func NewMemberChangedEvent( ctx context.Context, current, - changed *MemberWriteModel, + changed *MemberAggregate, ) (*MemberChangedEvent, error) { m, err := member.NewChangedEvent( diff --git a/internal/v2/repository/iam/members.go b/internal/v2/repository/iam/members.go index fe9d6c6e0..2cc912f22 100644 --- a/internal/v2/repository/iam/members.go +++ b/internal/v2/repository/iam/members.go @@ -6,6 +6,10 @@ import ( "github.com/caos/zitadel/internal/v2/repository/members" ) +type MembersAggregate struct { + members.Aggregate +} + type MembersReadModel struct { members.ReadModel } diff --git a/internal/v2/repository/idp/config.go b/internal/v2/repository/idp/config.go index 667a9c586..372bd5b86 100644 --- a/internal/v2/repository/idp/config.go +++ b/internal/v2/repository/idp/config.go @@ -13,7 +13,7 @@ type ConfigAggregate struct { Name string StylingType StylingType State ConfigState - OIDCConfig *oidc.ConfigReadModel + // OIDCConfig *oidc.ConfigReadModel } type ConfigReadModel struct { diff --git a/internal/v2/repository/idp/event_added.go b/internal/v2/repository/idp/event_config_added.go similarity index 100% rename from internal/v2/repository/idp/event_added.go rename to internal/v2/repository/idp/event_config_added.go diff --git a/internal/v2/repository/idp/event_changed.go b/internal/v2/repository/idp/event_config_changed.go similarity index 97% rename from internal/v2/repository/idp/event_changed.go rename to internal/v2/repository/idp/event_config_changed.go index b807b87fe..32d63cd15 100644 --- a/internal/v2/repository/idp/event_changed.go +++ b/internal/v2/repository/idp/event_config_changed.go @@ -16,7 +16,7 @@ type ConfigChangedEvent struct { func NewConfigChangedEvent( base *eventstore.BaseEvent, - current *ConfigAggregate, + current, changed *ConfigAggregate, ) (*ConfigChangedEvent, error) { diff --git a/internal/v2/repository/idp/event_deactivated.go b/internal/v2/repository/idp/event_config_deactivated.go similarity index 100% rename from internal/v2/repository/idp/event_deactivated.go rename to internal/v2/repository/idp/event_config_deactivated.go diff --git a/internal/v2/repository/member/event_changed.go b/internal/v2/repository/member/event_changed.go index 23c299bbe..c38b0bfb3 100644 --- a/internal/v2/repository/member/event_changed.go +++ b/internal/v2/repository/member/event_changed.go @@ -34,7 +34,7 @@ func (e *ChangedEvent) Data() interface{} { func NewChangedEvent( base *eventstore.BaseEvent, current, - changed *WriteModel, + changed *Aggregate, ) (*ChangedEvent, error) { change := &ChangedEvent{ diff --git a/internal/v2/repository/member/read_model.go b/internal/v2/repository/member/read_model.go index 2aa61bf7c..97614fd3e 100644 --- a/internal/v2/repository/member/read_model.go +++ b/internal/v2/repository/member/read_model.go @@ -33,7 +33,3 @@ func (rm *ReadModel) Reduce() error { } return rm.ReadModel.Reduce() } - -//WriteModel is used to create events -// It has no computed fields and represents the data -type WriteModel ReadModel diff --git a/internal/v2/repository/member/write_model.go b/internal/v2/repository/member/write_model.go new file mode 100644 index 000000000..f17c91f5d --- /dev/null +++ b/internal/v2/repository/member/write_model.go @@ -0,0 +1,28 @@ +package member + +import "github.com/caos/zitadel/internal/eventstore/v2" + +//WriteModel is used to create events +// It has no computed fields and represents the data +// which can be changed +type WriteModel struct { + eventstore.WriteModel + + UserID string + Roles []string +} + +//Reduce extends eventstore.ReadModel +func (rm *WriteModel) Reduce() error { + for _, event := range rm.Events { + switch e := event.(type) { + case *AddedEvent: + rm.UserID = e.UserID + rm.Roles = e.Roles + case *ChangedEvent: + rm.UserID = e.UserID + rm.Roles = e.Roles + } + } + return rm.ReadModel.Reduce() +}