diff --git a/internal/admin/repository/eventsourcing/eventstore/features.go b/internal/admin/repository/eventsourcing/eventstore/features.go index 050b2e07ad..dccaf20176 100644 --- a/internal/admin/repository/eventsourcing/eventstore/features.go +++ b/internal/admin/repository/eventsourcing/eventstore/features.go @@ -33,7 +33,14 @@ func (repo *FeaturesRepo) GetDefaultFeatures(ctx context.Context) (*features_mod if errors.IsNotFound(viewErr) { features = new(model.FeaturesView) } - events, esErr := repo.getIAMEvents(ctx, features.Sequence) + + sequence := features.Sequence + currentSequence, err := repo.View.GetLatestFeaturesSequence() + if err == nil { + sequence = currentSequence.CurrentSequence + } + + events, esErr := repo.getIAMEvents(ctx, sequence) if errors.IsNotFound(viewErr) && len(events) == 0 { return nil, errors.ThrowNotFound(nil, "EVENT-Lsoj7", "Errors.Org.NotFound") } diff --git a/internal/admin/repository/eventsourcing/eventstore/iam.go b/internal/admin/repository/eventsourcing/eventstore/iam.go index e6446209b1..b5b0205611 100644 --- a/internal/admin/repository/eventsourcing/eventstore/iam.go +++ b/internal/admin/repository/eventsourcing/eventstore/iam.go @@ -5,7 +5,7 @@ import ( "strings" "github.com/caos/zitadel/internal/domain" - "github.com/caos/zitadel/internal/eventstore/v1" + v1 "github.com/caos/zitadel/internal/eventstore/v1" "github.com/caos/zitadel/internal/eventstore/v1/models" iam_view "github.com/caos/zitadel/internal/iam/repository/view" "github.com/caos/zitadel/internal/user/repository/view/model" @@ -138,7 +138,14 @@ func (repo *IAMRepository) GetDefaultLoginPolicy(ctx context.Context) (*iam_mode if caos_errs.IsNotFound(viewErr) { policy = new(iam_es_model.LoginPolicyView) } - events, esErr := repo.getIAMEvents(ctx, policy.Sequence) + + sequence := policy.Sequence + currentSequence, err := repo.View.GetLatestLoginPolicySequence() + if err == nil { + sequence = currentSequence.CurrentSequence + } + + events, esErr := repo.getIAMEvents(ctx, sequence) if caos_errs.IsNotFound(viewErr) && len(events) == 0 { return nil, caos_errs.ThrowNotFound(nil, "EVENT-cmO9s", "Errors.IAM.LoginPolicy.NotFound") } @@ -210,7 +217,14 @@ func (repo *IAMRepository) GetDefaultPasswordComplexityPolicy(ctx context.Contex if caos_errs.IsNotFound(viewErr) { policy = new(iam_es_model.PasswordComplexityPolicyView) } - events, esErr := repo.getIAMEvents(ctx, policy.Sequence) + + sequence := policy.Sequence + currentSequence, err := repo.View.GetLatestPasswordComplexityPolicySequence() + if err == nil { + sequence = currentSequence.CurrentSequence + } + + events, esErr := repo.getIAMEvents(ctx, sequence) if caos_errs.IsNotFound(viewErr) && len(events) == 0 { return nil, caos_errs.ThrowNotFound(nil, "EVENT-1Mc0s", "Errors.IAM.PasswordComplexityPolicy.NotFound") } @@ -235,7 +249,14 @@ func (repo *IAMRepository) GetDefaultPasswordAgePolicy(ctx context.Context) (*ia if caos_errs.IsNotFound(viewErr) { policy = new(iam_es_model.PasswordAgePolicyView) } - events, esErr := repo.getIAMEvents(ctx, policy.Sequence) + + sequence := policy.Sequence + currentSequence, err := repo.View.GetLatestPasswordAgePolicySequence() + if err == nil { + sequence = currentSequence.CurrentSequence + } + + events, esErr := repo.getIAMEvents(ctx, sequence) if caos_errs.IsNotFound(viewErr) && len(events) == 0 { return nil, caos_errs.ThrowNotFound(nil, "EVENT-vMyS3", "Errors.IAM.PasswordAgePolicy.NotFound") } @@ -260,7 +281,14 @@ func (repo *IAMRepository) GetDefaultPasswordLockoutPolicy(ctx context.Context) if caos_errs.IsNotFound(viewErr) { policy = new(iam_es_model.PasswordLockoutPolicyView) } - events, esErr := repo.getIAMEvents(ctx, policy.Sequence) + + sequence := policy.Sequence + currentSequence, err := repo.View.GetLatestPasswordLockoutPolicySequence() + if err == nil { + sequence = currentSequence.CurrentSequence + } + + events, esErr := repo.getIAMEvents(ctx, sequence) if caos_errs.IsNotFound(viewErr) && len(events) == 0 { return nil, caos_errs.ThrowNotFound(nil, "EVENT-2M9oP", "Errors.IAM.PasswordLockoutPolicy.NotFound") } @@ -285,7 +313,14 @@ func (repo *IAMRepository) GetOrgIAMPolicy(ctx context.Context) (*iam_model.OrgI if caos_errs.IsNotFound(viewErr) { policy = new(iam_es_model.OrgIAMPolicyView) } - events, esErr := repo.getIAMEvents(ctx, policy.Sequence) + + sequence := policy.Sequence + currentSequence, err := repo.View.GetLatestOrgIAMPolicySequence() + if err == nil { + sequence = currentSequence.CurrentSequence + } + + events, esErr := repo.getIAMEvents(ctx, sequence) if caos_errs.IsNotFound(viewErr) && len(events) == 0 { return nil, caos_errs.ThrowNotFound(nil, "EVENT-MkoL0", "Errors.IAM.OrgIAMPolicy.NotFound") } diff --git a/internal/admin/repository/eventsourcing/eventstore/org.go b/internal/admin/repository/eventsourcing/eventstore/org.go index 9bd22d7db0..432f19b6b3 100644 --- a/internal/admin/repository/eventsourcing/eventstore/org.go +++ b/internal/admin/repository/eventsourcing/eventstore/org.go @@ -2,8 +2,9 @@ package eventstore import ( "context" + "github.com/caos/zitadel/internal/errors" - "github.com/caos/zitadel/internal/eventstore/v1" + v1 "github.com/caos/zitadel/internal/eventstore/v1" "github.com/caos/zitadel/internal/eventstore/v1/models" es_sdk "github.com/caos/zitadel/internal/eventstore/v1/sdk" iam_model "github.com/caos/zitadel/internal/iam/model" @@ -36,7 +37,14 @@ func (repo *OrgRepo) OrgByID(ctx context.Context, id string) (*org_model.OrgView if errors.IsNotFound(viewErr) { org = new(model.OrgView) } - events, esErr := repo.getOrgEvents(ctx, id, org.Sequence) + + sequence := org.Sequence + currentSequence, err := repo.View.GetLatestOrgSequence() + if err == nil { + sequence = currentSequence.CurrentSequence + } + + events, esErr := repo.getOrgEvents(ctx, id, sequence) if errors.IsNotFound(viewErr) && len(events) == 0 { return nil, errors.ThrowNotFound(nil, "EVENT-Lsoj7", "Errors.Org.NotFound") } diff --git a/internal/auth/repository/eventsourcing/eventstore/refresh_token.go b/internal/auth/repository/eventsourcing/eventstore/refresh_token.go index 6c8d4907fc..ff63cec541 100644 --- a/internal/auth/repository/eventsourcing/eventstore/refresh_token.go +++ b/internal/auth/repository/eventsourcing/eventstore/refresh_token.go @@ -8,7 +8,7 @@ import ( "github.com/caos/zitadel/internal/crypto" "github.com/caos/zitadel/internal/domain" - "github.com/caos/zitadel/internal/eventstore/v1" + v1 "github.com/caos/zitadel/internal/eventstore/v1" "github.com/caos/zitadel/internal/eventstore/v1/models" usr_view "github.com/caos/zitadel/internal/user/repository/view" @@ -41,7 +41,13 @@ func (r *RefreshTokenRepo) RefreshTokenByID(ctx context.Context, refreshToken st tokenView.UserID = userID } - events, esErr := r.getUserEvents(ctx, userID, tokenView.Sequence) + sequence := tokenView.Sequence + currentSequence, err := r.View.GetLatestRefreshTokenSequence() + if err == nil { + sequence = currentSequence.CurrentSequence + } + + events, esErr := r.getUserEvents(ctx, userID, sequence) if errors.IsNotFound(viewErr) && len(events) == 0 { return nil, errors.ThrowNotFound(nil, "EVENT-BHB52", "Errors.User.RefreshToken.Invalid") } diff --git a/internal/authz/repository/eventsourcing/eventstore/token_verifier.go b/internal/authz/repository/eventsourcing/eventstore/token_verifier.go index 862e298678..376bd721ce 100644 --- a/internal/authz/repository/eventsourcing/eventstore/token_verifier.go +++ b/internal/authz/repository/eventsourcing/eventstore/token_verifier.go @@ -43,7 +43,13 @@ func (repo *TokenVerifierRepo) TokenByID(ctx context.Context, tokenID, userID st token.UserID = userID } - events, esErr := repo.getUserEvents(ctx, userID, token.Sequence) + sequence := token.Sequence + currentSequence, err := repo.View.GetLatestTokenSequence() + if err == nil { + sequence = currentSequence.CurrentSequence + } + + events, esErr := repo.getUserEvents(ctx, userID, sequence) if caos_errs.IsNotFound(viewErr) && len(events) == 0 { return nil, caos_errs.ThrowNotFound(nil, "EVENT-4T90g", "Errors.Token.NotFound") } diff --git a/internal/management/repository/eventsourcing/eventstore/project.go b/internal/management/repository/eventsourcing/eventstore/project.go index 439e8f2943..5b1e86e731 100644 --- a/internal/management/repository/eventsourcing/eventstore/project.go +++ b/internal/management/repository/eventsourcing/eventstore/project.go @@ -47,7 +47,13 @@ func (repo *ProjectRepo) ProjectByID(ctx context.Context, id string) (*proj_mode project = new(model.ProjectView) } - events, esErr := repo.getProjectEvents(ctx, id, project.Sequence) + sequence := project.Sequence + currentSequence, err := repo.View.GetLatestProjectSequence() + if err == nil { + sequence = currentSequence.CurrentSequence + } + + events, esErr := repo.getProjectEvents(ctx, id, sequence) if caos_errs.IsNotFound(viewErr) && len(events) == 0 { return nil, caos_errs.ThrowNotFound(nil, "EVENT-8yfKu", "Errors.Project.NotFound") } diff --git a/internal/management/repository/eventsourcing/eventstore/user.go b/internal/management/repository/eventsourcing/eventstore/user.go index 3126b9c82c..972c96f7c1 100644 --- a/internal/management/repository/eventsourcing/eventstore/user.go +++ b/internal/management/repository/eventsourcing/eventstore/user.go @@ -7,7 +7,7 @@ import ( "github.com/golang/protobuf/ptypes" "github.com/caos/zitadel/internal/domain" - "github.com/caos/zitadel/internal/eventstore/v1" + v1 "github.com/caos/zitadel/internal/eventstore/v1" "github.com/caos/zitadel/internal/eventstore/v1/models" usr_view "github.com/caos/zitadel/internal/user/repository/view" @@ -41,7 +41,14 @@ func (repo *UserRepo) UserByID(ctx context.Context, id string) (*usr_model.UserV if caos_errs.IsNotFound(viewErr) { user = new(model.UserView) } - events, esErr := repo.getUserEvents(ctx, id, user.Sequence) + + sequence := user.Sequence + currentSequence, err := repo.View.GetLatestUserSequence() + if err == nil { + sequence = currentSequence.CurrentSequence + } + + events, esErr := repo.getUserEvents(ctx, id, sequence) if caos_errs.IsNotFound(viewErr) && len(events) == 0 { return nil, caos_errs.ThrowNotFound(nil, "EVENT-Lsoj7", "Errors.User.NotFound") } diff --git a/migrations/cockroach/V1.50__changes_idx.sql b/migrations/cockroach/V1.50__changes_idx.sql new file mode 100644 index 0000000000..2b56eff40e --- /dev/null +++ b/migrations/cockroach/V1.50__changes_idx.sql @@ -0,0 +1 @@ +CREATE INDEX changes_idx ON eventstore.events (aggregate_type, aggregate_id, creation_date) USING HASH WITH BUCKET_COUNT = 10; \ No newline at end of file