mirror of
https://github.com/zitadel/zitadel.git
synced 2025-10-16 07:34:27 +00:00
85 lines
1.8 KiB
Go
85 lines
1.8 KiB
Go
![]() |
package member
|
||
|
|
||
|
import "github.com/caos/zitadel/internal/eventstore/v2"
|
||
|
|
||
|
type MemberReadModel struct {
|
||
|
eventstore.ReadModel
|
||
|
|
||
|
UserID string
|
||
|
Roles []string
|
||
|
}
|
||
|
|
||
|
func NewMemberReadModel(userID string) *MemberReadModel {
|
||
|
return &MemberReadModel{
|
||
|
ReadModel: *eventstore.NewReadModel(),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (rm *MemberReadModel) Reduce() error {
|
||
|
for _, event := range rm.Events {
|
||
|
switch e := event.(type) {
|
||
|
case *MemberAddedEvent:
|
||
|
rm.UserID = e.UserID
|
||
|
rm.Roles = e.Roles
|
||
|
case *MemberChangedEvent:
|
||
|
rm.UserID = e.UserID
|
||
|
rm.Roles = e.Roles
|
||
|
}
|
||
|
}
|
||
|
return rm.ReadModel.Reduce()
|
||
|
}
|
||
|
|
||
|
type MembersReadModel struct {
|
||
|
eventstore.ReadModel
|
||
|
Members []*MemberReadModel
|
||
|
}
|
||
|
|
||
|
func NewMembersReadModel() *MembersReadModel {
|
||
|
return &MembersReadModel{
|
||
|
ReadModel: *eventstore.NewReadModel(),
|
||
|
Members: []*MemberReadModel{},
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (rm *MembersReadModel) MemberByUserID(id string) (idx int, member *MemberReadModel) {
|
||
|
for idx, member = range rm.Members {
|
||
|
if member.UserID == id {
|
||
|
return idx, member
|
||
|
}
|
||
|
}
|
||
|
return -1, nil
|
||
|
}
|
||
|
|
||
|
func (rm *MembersReadModel) AppendEvents(events ...eventstore.EventReader) (err error) {
|
||
|
for _, event := range events {
|
||
|
switch e := event.(type) {
|
||
|
case *MemberAddedEvent:
|
||
|
member := NewMemberReadModel(e.UserID)
|
||
|
rm.Members = append(rm.Members, member)
|
||
|
member.AppendEvents(e)
|
||
|
case *MemberChangedEvent:
|
||
|
_, member := rm.MemberByUserID(e.UserID)
|
||
|
member.AppendEvents(e)
|
||
|
case *MemberRemovedEvent:
|
||
|
idx, _ := rm.MemberByUserID(e.UserID)
|
||
|
if idx < 0 {
|
||
|
return nil
|
||
|
}
|
||
|
copy(rm.Members[idx:], rm.Members[idx+1:])
|
||
|
rm.Members[len(rm.Members)-1] = nil
|
||
|
rm.Members = rm.Members[:len(rm.Members)-1]
|
||
|
}
|
||
|
}
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
func (rm *MembersReadModel) Reduce() (err error) {
|
||
|
for _, member := range rm.Members {
|
||
|
err = member.Reduce()
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
return rm.ReadModel.Reduce()
|
||
|
}
|