mirror of
https://github.com/zitadel/zitadel.git
synced 2024-12-15 20:38:00 +00:00
931a6c7cce
# Which Problems Are Solved Access token checks make sure that there have not been any termination events (user locked, deactivated, signed out, ...) in the meantime. This events were filtered based on the creation date of the last session event, which might cause latency issues in the database. # How the Problems Are Solved - Changed the query to use `position` instead of `created_at`. - removed `AwaitOpenTransactions` # Additional Changes Added the `position` field to the `ReadModel`. # Additional Context - relates to #8088 - part of #7639 - backport to 2.53.x
52 lines
1.5 KiB
Go
52 lines
1.5 KiB
Go
package eventstore
|
|
|
|
import "time"
|
|
|
|
// ReadModel is the minimum representation of a read model.
|
|
// It implements a basic reducer
|
|
// it might be saved in a database or in memory
|
|
type ReadModel struct {
|
|
AggregateID string `json:"-"`
|
|
ProcessedSequence uint64 `json:"-"`
|
|
CreationDate time.Time `json:"-"`
|
|
ChangeDate time.Time `json:"-"`
|
|
Events []Event `json:"-"`
|
|
ResourceOwner string `json:"-"`
|
|
InstanceID string `json:"-"`
|
|
Position float64 `json:"-"`
|
|
}
|
|
|
|
// AppendEvents adds all the events to the read model.
|
|
// The function doesn't compute the new state of the read model
|
|
func (rm *ReadModel) AppendEvents(events ...Event) {
|
|
rm.Events = append(rm.Events, events...)
|
|
}
|
|
|
|
// Reduce is the basic implementation of reducer
|
|
// If this function is extended the extending function should be the last step
|
|
func (rm *ReadModel) Reduce() error {
|
|
if len(rm.Events) == 0 {
|
|
return nil
|
|
}
|
|
|
|
if rm.AggregateID == "" {
|
|
rm.AggregateID = rm.Events[0].Aggregate().ID
|
|
}
|
|
if rm.ResourceOwner == "" {
|
|
rm.ResourceOwner = rm.Events[0].Aggregate().ResourceOwner
|
|
}
|
|
if rm.InstanceID == "" {
|
|
rm.InstanceID = rm.Events[0].Aggregate().InstanceID
|
|
}
|
|
|
|
if rm.CreationDate.IsZero() {
|
|
rm.CreationDate = rm.Events[0].CreatedAt()
|
|
}
|
|
rm.ChangeDate = rm.Events[len(rm.Events)-1].CreatedAt()
|
|
rm.ProcessedSequence = rm.Events[len(rm.Events)-1].Sequence()
|
|
rm.Position = rm.Events[len(rm.Events)-1].Position()
|
|
// all events processed and not needed anymore
|
|
rm.Events = rm.Events[0:0]
|
|
return nil
|
|
}
|