diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 827165a5a3..330057b4e7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -23,10 +23,11 @@ We add the label "good first issue" for problems we think are a good starting po If you like to contribute fork the ZITADEL repository. After you implemented the new feature create a PullRequest in the ZITADEL reposiotry. -Make sure you use semantic release. -feat: New Feature -fix: Bug Fix -docs: Documentation +Make sure you use semantic release: + +* feat: New Feature +* fix: Bug Fix +* docs: Documentation ## Want to start ZITADEL? diff --git a/README.md b/README.md index f969466802..73fc4aa9b2 100644 --- a/README.md +++ b/README.md @@ -42,14 +42,15 @@ For example, **ZITADEL** is event sourced but it does not rely on a pub/sub syst ### Self-Managed You can run an automatically operated **ZITADEL** instance on a CNCF compliant Kubernetes cluster of your choice: -- [CRD Mode on an existing k8s cluster](https://docs.zitadel.ch/docs/guides/installation/crd) -- [GitOps Mode on an existing k8s cluster](https://docs.zitadel.ch/docs/guides/installation/gitops) -- [GitOps Mode on VM/bare-metal](https://docs.zitadel.ch/docs/guides/installation/managed-dedicated-instance) using [ORBOS](https://docs.zitadel.ch/docs/guides/installation/orbos) + +* [CRD Mode on an existing k8s cluster](https://docs.zitadel.ch/docs/guides/installation/crd) +* [GitOps Mode on an existing k8s cluster](https://docs.zitadel.ch/docs/guides/installation/gitops) +* [GitOps Mode on VM/bare-metal](https://docs.zitadel.ch/docs/guides/installation/managed-dedicated-instance) using [ORBOS](https://docs.zitadel.ch/docs/guides/installation/orbos) ### CAOS-Managed -- **ZITADEL Cloud:** [**ZITADEL.ch**](https://zitadel.ch) is our shared cloud service hosted in Switzerland. [Get started](https://docs.zitadel.ch/docs/guides/usage/get-started) and try the free tier, including already unlimited users and all necessary security features. -- **ZITADEL Enterprise:** We operate and support a private instance of **ZITADEL** for you. [Get in touch!](https://zitadel.ch/contact/) +* **ZITADEL Cloud:** [**ZITADEL.ch**](https://zitadel.ch) is our shared cloud service hosted in Switzerland. [Get started](https://docs.zitadel.ch/docs/guides/usage/get-started) and try the free tier, including already unlimited users and all necessary security features. +* **ZITADEL Enterprise:** We operate and support a private instance of **ZITADEL** for you. [Get in touch!](https://zitadel.ch/contact/) ## Start using ZITADEL @@ -58,6 +59,7 @@ You can run an automatically operated **ZITADEL** instance on a CNCF compliant K See our [Documentation](https://docs.zitadel.ch/docs/quickstarts/introduction) to get started with ZITADEL quickly. Let us know, if you are missing a language or framework in the [Q&A](https://github.com/caos/zitadel/discussions/1717). ### Client libraries + * [Go](https://github.com/caos/zitadel-go) client library * [.NET](https://github.com/caos/zitadel-net) client library * [Dart](https://github.com/caos/zitadel-dart) client library @@ -71,16 +73,19 @@ See our [Documentation](https://docs.zitadel.ch/docs/quickstarts/introduction) t ## Showcase ### Passwordless Login + Use our login widget to allow easy and sucure access to your applications and enjoy all the benefits of passwordless (FIDO 2 / WebAuthN): -- works on all modern platforms, devices, and browsers -- phishing resistant alternative -- requires only one gesture by the user -- easy [enrollment](https://docs.zitadel.ch/docs/manuals/user-factors) of the device during registration + +* works on all modern platforms, devices, and browsers +* phishing resistant alternative +* requires only one gesture by the user +* easy [enrollment](https://docs.zitadel.ch/docs/manuals/user-factors) of the device during registration ![passwordless-windows-hello](https://user-images.githubusercontent.com/1366906/118765435-5d419780-b87b-11eb-95bf-55140119c0d8.gif) ![passwordless-iphone](https://user-images.githubusercontent.com/1366906/118765439-5fa3f180-b87b-11eb-937b-b4acb7854086.gif) ### Admin Console + Use [Console](https://docs.zitadel.ch/docs/manuals/introduction) or our [APIs](https://docs.zitadel.ch/docs/apis/introduction) to setup organizations, projects and applications. Register new applications diff --git a/internal/command/existing_label_policies_model.go b/internal/command/existing_label_policies_model.go index c490a0fedf..000023afac 100644 --- a/internal/command/existing_label_policies_model.go +++ b/internal/command/existing_label_policies_model.go @@ -42,13 +42,14 @@ func (rm *ExistingLabelPoliciesReadModel) Reduce() error { } func (rm *ExistingLabelPoliciesReadModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder( - eventstore.ColumnsEvent, - iam.AggregateType, - org.AggregateType). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). + AddQuery(). + AggregateTypes(iam.AggregateType). + EventTypes(iam.LabelPolicyAddedEventType). + Or(). + AggregateTypes(org.AggregateType). EventTypes( - iam.LabelPolicyAddedEventType, org.LabelPolicyAddedEventType, - org.LabelPolicyRemovedEventType, - ) + org.LabelPolicyRemovedEventType). + Builder() } diff --git a/internal/command/iam_custom_login_text_model.go b/internal/command/iam_custom_login_text_model.go index 683df220a5..7e31c7d71c 100644 --- a/internal/command/iam_custom_login_text_model.go +++ b/internal/command/iam_custom_login_text_model.go @@ -40,10 +40,13 @@ func (wm *IAMCustomLoginTextReadModel) Reduce() error { } func (wm *IAMCustomLoginTextReadModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). - AggregateIDs(wm.CustomLoginTextReadModel.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateIDs(wm.CustomLoginTextReadModel.AggregateID). + AggregateTypes(iam.AggregateType). EventTypes( iam.CustomTextSetEventType, - iam.CustomTextRemovedEventType) + iam.CustomTextRemovedEventType). + Builder() } diff --git a/internal/command/iam_custom_message_text_model.go b/internal/command/iam_custom_message_text_model.go index dce661e3ce..d3b8700526 100644 --- a/internal/command/iam_custom_message_text_model.go +++ b/internal/command/iam_custom_message_text_model.go @@ -39,9 +39,11 @@ func (wm *IAMCustomMessageTextReadModel) Reduce() error { } func (wm *IAMCustomMessageTextReadModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). - AggregateIDs(wm.CustomMessageTextReadModel.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). - EventTypes( - iam.CustomTextSetEventType) + AddQuery(). + AggregateTypes(iam.AggregateType). + AggregateIDs(wm.CustomMessageTextReadModel.AggregateID). + EventTypes(iam.CustomTextSetEventType). + Builder() } diff --git a/internal/command/iam_custom_text_model.go b/internal/command/iam_custom_text_model.go index 9ff4c4a033..dc6a3e7906 100644 --- a/internal/command/iam_custom_text_model.go +++ b/internal/command/iam_custom_text_model.go @@ -39,9 +39,12 @@ func (wm *IAMCustomTextWriteModel) Reduce() error { } func (wm *IAMCustomTextWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). - AggregateIDs(wm.CustomTextWriteModel.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateIDs(wm.CustomTextWriteModel.AggregateID). + AggregateTypes(iam.AggregateType). EventTypes( - iam.CustomTextSetEventType) + iam.CustomTextSetEventType). + Builder() } diff --git a/internal/command/iam_features_model.go b/internal/command/iam_features_model.go index 11007bfbc1..7b79638248 100644 --- a/internal/command/iam_features_model.go +++ b/internal/command/iam_features_model.go @@ -43,10 +43,12 @@ func (wm *IAMFeaturesWriteModel) Reduce() error { } func (wm *IAMFeaturesWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). - AggregateIDs(wm.FeaturesWriteModel.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). - EventTypes(iam.FeaturesSetEventType) + AddQuery(). + EventTypes(iam.FeaturesSetEventType). + AggregateTypes(iam.AggregateType). + Builder() } func (wm *IAMFeaturesWriteModel) NewSetEvent( diff --git a/internal/command/iam_idp_config_model.go b/internal/command/iam_idp_config_model.go index f3aef0604b..ae4e72de14 100644 --- a/internal/command/iam_idp_config_model.go +++ b/internal/command/iam_idp_config_model.go @@ -2,6 +2,7 @@ package command import ( "context" + "github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/domain" @@ -26,9 +27,11 @@ func NewIAMIDPConfigWriteModel(configID string) *IAMIDPConfigWriteModel { } func (wm *IAMIDPConfigWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). - AggregateIDs(wm.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(iam.AggregateType). + AggregateIDs(wm.AggregateID). EventTypes( iam.IDPConfigAddedEventType, iam.IDPConfigChangedEventType, @@ -36,8 +39,8 @@ func (wm *IAMIDPConfigWriteModel) Query() *eventstore.SearchQueryBuilder { iam.IDPConfigReactivatedEventType, iam.IDPConfigRemovedEventType, iam.IDPOIDCConfigAddedEventType, - iam.IDPOIDCConfigChangedEventType, - ) + iam.IDPOIDCConfigChangedEventType). + Builder() } func (wm *IAMIDPConfigWriteModel) AppendEvents(events ...eventstore.EventReader) { diff --git a/internal/command/iam_idp_oidc_config_model.go b/internal/command/iam_idp_oidc_config_model.go index 5f2e2f1454..de91f25b7b 100644 --- a/internal/command/iam_idp_oidc_config_model.go +++ b/internal/command/iam_idp_oidc_config_model.go @@ -2,9 +2,10 @@ package command import ( "context" - "github.com/caos/zitadel/internal/eventstore" "reflect" + "github.com/caos/zitadel/internal/eventstore" + "github.com/caos/zitadel/internal/crypto" "github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/repository/iam" @@ -69,15 +70,18 @@ func (wm *IAMIDPOIDCConfigWriteModel) Reduce() error { } func (wm *IAMIDPOIDCConfigWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). - AggregateIDs(wm.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(iam.AggregateType). + AggregateIDs(wm.AggregateID). EventTypes( iam.IDPOIDCConfigAddedEventType, iam.IDPOIDCConfigChangedEventType, iam.IDPConfigReactivatedEventType, iam.IDPConfigDeactivatedEventType, - iam.IDPConfigRemovedEventType) + iam.IDPConfigRemovedEventType). + Builder() } func (wm *IAMIDPOIDCConfigWriteModel) NewChangedEvent( diff --git a/internal/command/iam_member_model.go b/internal/command/iam_member_model.go index c55c778673..3278347c99 100644 --- a/internal/command/iam_member_model.go +++ b/internal/command/iam_member_model.go @@ -54,12 +54,15 @@ func (wm *IAMMemberWriteModel) Reduce() error { } func (wm *IAMMemberWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). - AggregateIDs(wm.MemberWriteModel.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(iam.AggregateType). + AggregateIDs(wm.MemberWriteModel.AggregateID). EventTypes( iam.MemberAddedEventType, iam.MemberChangedEventType, iam.MemberRemovedEventType, - iam.MemberCascadeRemovedEventType) + iam.MemberCascadeRemovedEventType). + Builder() } diff --git a/internal/command/iam_model.go b/internal/command/iam_model.go index 8cac5f6235..855fd74e4d 100644 --- a/internal/command/iam_model.go +++ b/internal/command/iam_model.go @@ -44,14 +44,17 @@ func (wm *IAMWriteModel) Reduce() error { } func (wm *IAMWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). - AggregateIDs(wm.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(iam.AggregateType). + AggregateIDs(wm.AggregateID). EventTypes( iam.ProjectSetEventType, iam.GlobalOrgSetEventType, iam.SetupStartedEventType, - iam.SetupDoneEventType) + iam.SetupDoneEventType). + Builder() } func IAMAggregateFromWriteModel(wm *eventstore.WriteModel) *eventstore.Aggregate { diff --git a/internal/command/iam_policy_label_model.go b/internal/command/iam_policy_label_model.go index 133aca2178..1cd96d093b 100644 --- a/internal/command/iam_policy_label_model.go +++ b/internal/command/iam_policy_label_model.go @@ -62,9 +62,11 @@ func (wm *IAMLabelPolicyWriteModel) Reduce() error { } func (wm *IAMLabelPolicyWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). - AggregateIDs(wm.LabelPolicyWriteModel.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(iam.AggregateType). + AggregateIDs(wm.LabelPolicyWriteModel.AggregateID). EventTypes( iam.LabelPolicyAddedEventType, iam.LabelPolicyChangedEventType, @@ -77,8 +79,8 @@ func (wm *IAMLabelPolicyWriteModel) Query() *eventstore.SearchQueryBuilder { iam.LabelPolicyIconDarkAddedEventType, iam.LabelPolicyIconDarkRemovedEventType, iam.LabelPolicyFontAddedEventType, - iam.LabelPolicyFontRemovedEventType, - ) + iam.LabelPolicyFontRemovedEventType). + Builder() } func (wm *IAMLabelPolicyWriteModel) NewChangedEvent( diff --git a/internal/command/iam_policy_login_factors_model.go b/internal/command/iam_policy_login_factors_model.go index 711c7a52d2..c6df2b3a00 100644 --- a/internal/command/iam_policy_login_factors_model.go +++ b/internal/command/iam_policy_login_factors_model.go @@ -42,12 +42,15 @@ func (wm *IAMSecondFactorWriteModel) Reduce() error { } func (wm *IAMSecondFactorWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). - AggregateIDs(wm.WriteModel.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(iam.AggregateType). + AggregateIDs(wm.WriteModel.AggregateID). EventTypes( iam.LoginPolicySecondFactorAddedEventType, - iam.LoginPolicySecondFactorRemovedEventType) + iam.LoginPolicySecondFactorRemovedEventType). + Builder() } type IAMMultiFactorWriteModel struct { @@ -86,10 +89,13 @@ func (wm *IAMMultiFactorWriteModel) Reduce() error { } func (wm *IAMMultiFactorWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). - AggregateIDs(wm.WriteModel.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(iam.AggregateType). + AggregateIDs(wm.WriteModel.AggregateID). EventTypes( iam.LoginPolicyMultiFactorAddedEventType, - iam.LoginPolicyMultiFactorRemovedEventType) + iam.LoginPolicyMultiFactorRemovedEventType). + Builder() } diff --git a/internal/command/iam_policy_login_identity_provider_model.go b/internal/command/iam_policy_login_identity_provider_model.go index 89332c7b85..d144883021 100644 --- a/internal/command/iam_policy_login_identity_provider_model.go +++ b/internal/command/iam_policy_login_identity_provider_model.go @@ -44,7 +44,10 @@ func (wm *IAMIdentityProviderWriteModel) Reduce() error { } func (wm *IAMIdentityProviderWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). + ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(iam.AggregateType). AggregateIDs(wm.AggregateID). - ResourceOwner(wm.ResourceOwner) + Builder() } diff --git a/internal/command/iam_policy_login_model.go b/internal/command/iam_policy_login_model.go index 003566ad36..a87a670431 100644 --- a/internal/command/iam_policy_login_model.go +++ b/internal/command/iam_policy_login_model.go @@ -2,6 +2,7 @@ package command import ( "context" + "github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/domain" @@ -44,12 +45,15 @@ func (wm *IAMLoginPolicyWriteModel) Reduce() error { } func (wm *IAMLoginPolicyWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). - AggregateIDs(wm.LoginPolicyWriteModel.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(iam.AggregateType). + AggregateIDs(wm.LoginPolicyWriteModel.AggregateID). EventTypes( iam.LoginPolicyAddedEventType, - iam.LoginPolicyChangedEventType) + iam.LoginPolicyChangedEventType). + Builder() } func (wm *IAMLoginPolicyWriteModel) NewChangedEvent( diff --git a/internal/command/iam_policy_mail_template_model.go b/internal/command/iam_policy_mail_template_model.go index d35a09449c..3f3c02b375 100644 --- a/internal/command/iam_policy_mail_template_model.go +++ b/internal/command/iam_policy_mail_template_model.go @@ -2,9 +2,10 @@ package command import ( "context" - "github.com/caos/zitadel/internal/eventstore" "reflect" + "github.com/caos/zitadel/internal/eventstore" + "github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/repository/iam" "github.com/caos/zitadel/internal/repository/policy" @@ -41,12 +42,15 @@ func (wm *IAMMailTemplateWriteModel) Reduce() error { } func (wm *IAMMailTemplateWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). - AggregateIDs(wm.MailTemplateWriteModel.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(iam.AggregateType). + AggregateIDs(wm.MailTemplateWriteModel.AggregateID). EventTypes( iam.MailTemplateAddedEventType, - iam.MailTemplateChangedEventType) + iam.MailTemplateChangedEventType). + Builder() } func (wm *IAMMailTemplateWriteModel) NewChangedEvent( diff --git a/internal/command/iam_policy_org_iam_model.go b/internal/command/iam_policy_org_iam_model.go index ba474742a6..7188c9fa32 100644 --- a/internal/command/iam_policy_org_iam_model.go +++ b/internal/command/iam_policy_org_iam_model.go @@ -2,6 +2,7 @@ package command import ( "context" + "github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/domain" @@ -40,12 +41,15 @@ func (wm *IAMOrgIAMPolicyWriteModel) Reduce() error { } func (wm *IAMOrgIAMPolicyWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). - AggregateIDs(wm.PolicyOrgIAMWriteModel.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(iam.AggregateType). + AggregateIDs(wm.PolicyOrgIAMWriteModel.AggregateID). EventTypes( iam.OrgIAMPolicyAddedEventType, - iam.OrgIAMPolicyChangedEventType) + iam.OrgIAMPolicyChangedEventType). + Builder() } func (wm *IAMOrgIAMPolicyWriteModel) NewChangedEvent( diff --git a/internal/command/iam_policy_password_age_model.go b/internal/command/iam_policy_password_age_model.go index 125d728248..cd8d5acb79 100644 --- a/internal/command/iam_policy_password_age_model.go +++ b/internal/command/iam_policy_password_age_model.go @@ -2,6 +2,7 @@ package command import ( "context" + "github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/domain" @@ -40,12 +41,15 @@ func (wm *IAMPasswordAgePolicyWriteModel) Reduce() error { } func (wm *IAMPasswordAgePolicyWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). - AggregateIDs(wm.PasswordAgePolicyWriteModel.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(iam.AggregateType). + AggregateIDs(wm.PasswordAgePolicyWriteModel.AggregateID). EventTypes( iam.PasswordAgePolicyAddedEventType, - iam.PasswordAgePolicyChangedEventType) + iam.PasswordAgePolicyChangedEventType). + Builder() } func (wm *IAMPasswordAgePolicyWriteModel) NewChangedEvent( diff --git a/internal/command/iam_policy_password_complexity_model.go b/internal/command/iam_policy_password_complexity_model.go index 667309bb94..a5fc2ab2d4 100644 --- a/internal/command/iam_policy_password_complexity_model.go +++ b/internal/command/iam_policy_password_complexity_model.go @@ -2,6 +2,7 @@ package command import ( "context" + "github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/domain" @@ -40,12 +41,15 @@ func (wm *IAMPasswordComplexityPolicyWriteModel) Reduce() error { } func (wm *IAMPasswordComplexityPolicyWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). - AggregateIDs(wm.PasswordComplexityPolicyWriteModel.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(iam.AggregateType). + AggregateIDs(wm.PasswordComplexityPolicyWriteModel.AggregateID). EventTypes( iam.PasswordComplexityPolicyAddedEventType, - iam.PasswordComplexityPolicyChangedEventType) + iam.PasswordComplexityPolicyChangedEventType). + Builder() } func (wm *IAMPasswordComplexityPolicyWriteModel) NewChangedEvent( diff --git a/internal/command/iam_policy_password_lockout_model.go b/internal/command/iam_policy_password_lockout_model.go index 3896697b2d..782284dadf 100644 --- a/internal/command/iam_policy_password_lockout_model.go +++ b/internal/command/iam_policy_password_lockout_model.go @@ -2,6 +2,7 @@ package command import ( "context" + "github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/domain" @@ -40,12 +41,15 @@ func (wm *IAMPasswordLockoutPolicyWriteModel) Reduce() error { } func (wm *IAMPasswordLockoutPolicyWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). - AggregateIDs(wm.PasswordLockoutPolicyWriteModel.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(iam.AggregateType). + AggregateIDs(wm.PasswordLockoutPolicyWriteModel.AggregateID). EventTypes( iam.PasswordLockoutPolicyAddedEventType, - iam.PasswordLockoutPolicyChangedEventType) + iam.PasswordLockoutPolicyChangedEventType). + Builder() } func (wm *IAMPasswordLockoutPolicyWriteModel) NewChangedEvent( diff --git a/internal/command/iam_policy_privacy_model.go b/internal/command/iam_policy_privacy_model.go index ef3daadcbb..06b58546a3 100644 --- a/internal/command/iam_policy_privacy_model.go +++ b/internal/command/iam_policy_privacy_model.go @@ -2,6 +2,7 @@ package command import ( "context" + "github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/domain" @@ -40,12 +41,15 @@ func (wm *IAMPrivacyPolicyWriteModel) Reduce() error { } func (wm *IAMPrivacyPolicyWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). - AggregateIDs(wm.PrivacyPolicyWriteModel.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(iam.AggregateType). + AggregateIDs(wm.PrivacyPolicyWriteModel.AggregateID). EventTypes( iam.PrivacyPolicyAddedEventType, - iam.PrivacyPolicyChangedEventType) + iam.PrivacyPolicyChangedEventType). + Builder() } func (wm *IAMPrivacyPolicyWriteModel) NewChangedEvent( diff --git a/internal/command/key_pair_model.go b/internal/command/key_pair_model.go index 4275f1d9bd..d6fafb8e91 100644 --- a/internal/command/key_pair_model.go +++ b/internal/command/key_pair_model.go @@ -49,10 +49,13 @@ func (wm *KeyPairWriteModel) Reduce() error { } func (wm *KeyPairWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, project.AggregateType). - AggregateIDs(wm.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). - EventTypes(keypair.AddedEventType) + AddQuery(). + AggregateTypes(project.AggregateType). + AggregateIDs(wm.AggregateID). + EventTypes(keypair.AddedEventType). + Builder() } func KeyPairAggregateFromWriteModel(wm *eventstore.WriteModel) *eventstore.Aggregate { diff --git a/internal/command/main_test.go b/internal/command/main_test.go index 050530c968..72905b2b44 100644 --- a/internal/command/main_test.go +++ b/internal/command/main_test.go @@ -81,9 +81,11 @@ func (repo *testRepo) Filter(ctx context.Context, searchQuery *repository.Search events := make([]*repository.Event, 0, len(repo.events)) for _, event := range repo.events { for _, filter := range searchQuery.Filters { - if filter.Field == repository.FieldAggregateType { - if event.AggregateType != filter.Value { - continue + for _, f := range filter { + if f.Field == repository.FieldAggregateType { + if event.AggregateType != f.Value { + continue + } } } } diff --git a/internal/command/org_custom_login_text_model.go b/internal/command/org_custom_login_text_model.go index a28e33f0e1..a7fdc65160 100644 --- a/internal/command/org_custom_login_text_model.go +++ b/internal/command/org_custom_login_text_model.go @@ -41,11 +41,14 @@ func (wm *OrgCustomLoginTextReadModel) Reduce() error { } func (wm *OrgCustomLoginTextReadModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). - AggregateIDs(wm.CustomLoginTextReadModel.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateIDs(wm.CustomLoginTextReadModel.AggregateID). + AggregateTypes(org.AggregateType). EventTypes( org.CustomTextSetEventType, org.CustomTextRemovedEventType, - org.CustomTextTemplateRemovedEventType) + org.CustomTextTemplateRemovedEventType). + Builder() } diff --git a/internal/command/org_custom_message_model.go b/internal/command/org_custom_message_model.go index 2001c0a1a2..6ee0faa411 100644 --- a/internal/command/org_custom_message_model.go +++ b/internal/command/org_custom_message_model.go @@ -42,13 +42,16 @@ func (wm *OrgCustomMessageTextReadModel) Reduce() error { } func (wm *OrgCustomMessageTextReadModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). - AggregateIDs(wm.CustomMessageTextReadModel.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(org.AggregateType). + AggregateIDs(wm.CustomMessageTextReadModel.AggregateID). EventTypes( org.CustomTextSetEventType, org.CustomTextRemovedEventType, - org.CustomTextTemplateRemovedEventType) + org.CustomTextTemplateRemovedEventType). + Builder() } type OrgCustomMessageTemplatesReadModel struct { @@ -85,11 +88,14 @@ func (wm *OrgCustomMessageTemplatesReadModel) Reduce() error { } func (wm *OrgCustomMessageTemplatesReadModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). - AggregateIDs(wm.CustomMessageTemplatesReadModel.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(org.AggregateType). + AggregateIDs(wm.CustomMessageTemplatesReadModel.AggregateID). EventTypes( org.CustomTextSetEventType, org.CustomTextRemovedEventType, - org.CustomTextTemplateRemovedEventType) + org.CustomTextTemplateRemovedEventType). + Builder() } diff --git a/internal/command/org_domain_model.go b/internal/command/org_domain_model.go index 0667e80f9a..7772f5af7e 100644 --- a/internal/command/org_domain_model.go +++ b/internal/command/org_domain_model.go @@ -84,16 +84,19 @@ func (wm *OrgDomainWriteModel) Reduce() error { } func (wm *OrgDomainWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). - AggregateIDs(wm.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(org.AggregateType). + AggregateIDs(wm.AggregateID). EventTypes( org.OrgDomainAddedEventType, org.OrgDomainVerifiedEventType, org.OrgDomainVerificationAddedEventType, org.OrgDomainVerifiedEventType, org.OrgDomainPrimarySetEventType, - org.OrgDomainRemovedEventType) + org.OrgDomainRemovedEventType). + Builder() } type OrgDomainsWriteModel struct { @@ -151,9 +154,11 @@ func (wm *OrgDomainsWriteModel) Reduce() error { } func (wm *OrgDomainsWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). - AggregateIDs(wm.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(org.AggregateType). + AggregateIDs(wm.AggregateID). EventTypes( org.OrgAddedEventType, org.OrgChangedEventType, @@ -162,5 +167,6 @@ func (wm *OrgDomainsWriteModel) Query() *eventstore.SearchQueryBuilder { org.OrgDomainVerificationAddedEventType, org.OrgDomainVerifiedEventType, org.OrgDomainPrimarySetEventType, - org.OrgDomainRemovedEventType) + org.OrgDomainRemovedEventType). + Builder() } diff --git a/internal/command/org_features_model.go b/internal/command/org_features_model.go index 06f9145a0d..b72ff1f889 100644 --- a/internal/command/org_features_model.go +++ b/internal/command/org_features_model.go @@ -45,13 +45,15 @@ func (wm *OrgFeaturesWriteModel) Reduce() error { } func (wm *OrgFeaturesWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). - AggregateIDs(wm.FeaturesWriteModel.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(org.AggregateType). + AggregateIDs(wm.FeaturesWriteModel.AggregateID). EventTypes( org.FeaturesSetEventType, - org.FeaturesRemovedEventType, - ) + org.FeaturesRemovedEventType). + Builder() } func (wm *OrgFeaturesWriteModel) NewSetEvent( diff --git a/internal/command/org_idp_config_model.go b/internal/command/org_idp_config_model.go index a9a4ab755e..b3c466bfaa 100644 --- a/internal/command/org_idp_config_model.go +++ b/internal/command/org_idp_config_model.go @@ -2,6 +2,7 @@ package command import ( "context" + "github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/domain" @@ -26,9 +27,11 @@ func NewOrgIDPConfigWriteModel(configID, orgID string) *OrgIDPConfigWriteModel { } func (wm *OrgIDPConfigWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). - AggregateIDs(wm.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(org.AggregateType). + AggregateIDs(wm.AggregateID). EventTypes( org.IDPConfigAddedEventType, org.IDPConfigChangedEventType, @@ -36,7 +39,8 @@ func (wm *OrgIDPConfigWriteModel) Query() *eventstore.SearchQueryBuilder { org.IDPConfigReactivatedEventType, org.IDPConfigRemovedEventType, org.IDPOIDCConfigAddedEventType, - org.IDPOIDCConfigChangedEventType) + org.IDPOIDCConfigChangedEventType). + Builder() } func (wm *OrgIDPConfigWriteModel) AppendEvents(events ...eventstore.EventReader) { diff --git a/internal/command/org_idp_oidc_config_model.go b/internal/command/org_idp_oidc_config_model.go index 1f5f424d5a..a88719ffd6 100644 --- a/internal/command/org_idp_oidc_config_model.go +++ b/internal/command/org_idp_oidc_config_model.go @@ -2,9 +2,10 @@ package command import ( "context" - "github.com/caos/zitadel/internal/eventstore" "reflect" + "github.com/caos/zitadel/internal/eventstore" + "github.com/caos/zitadel/internal/crypto" "github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/repository/idpconfig" @@ -69,15 +70,18 @@ func (wm *IDPOIDCConfigWriteModel) Reduce() error { } func (wm *IDPOIDCConfigWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). - AggregateIDs(wm.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(org.AggregateType). + AggregateIDs(wm.AggregateID). EventTypes( org.IDPOIDCConfigAddedEventType, org.IDPOIDCConfigChangedEventType, org.IDPConfigReactivatedEventType, org.IDPConfigDeactivatedEventType, - org.IDPConfigRemovedEventType) + org.IDPConfigRemovedEventType). + Builder() } func (wm *IDPOIDCConfigWriteModel) NewChangedEvent( diff --git a/internal/command/org_member_model.go b/internal/command/org_member_model.go index e8455aa32d..8c96d7aee3 100644 --- a/internal/command/org_member_model.go +++ b/internal/command/org_member_model.go @@ -53,12 +53,15 @@ func (wm *OrgMemberWriteModel) Reduce() error { } func (wm *OrgMemberWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). - AggregateIDs(wm.MemberWriteModel.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(org.AggregateType). + AggregateIDs(wm.MemberWriteModel.AggregateID). EventTypes( org.MemberAddedEventType, org.MemberChangedEventType, org.MemberRemovedEventType, - org.MemberCascadeRemovedEventType) + org.MemberCascadeRemovedEventType). + Builder() } diff --git a/internal/command/org_model.go b/internal/command/org_model.go index 55bea74531..75ef94f98f 100644 --- a/internal/command/org_model.go +++ b/internal/command/org_model.go @@ -43,13 +43,16 @@ func (wm *OrgWriteModel) Reduce() error { } func (wm *OrgWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). - AggregateIDs(wm.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(org.AggregateType). + AggregateIDs(wm.AggregateID). EventTypes( org.OrgAddedEventType, org.OrgChangedEventType, - org.OrgDomainPrimarySetEventType) + org.OrgDomainPrimarySetEventType). + Builder() } func OrgAggregateFromWriteModel(wm *eventstore.WriteModel) *eventstore.Aggregate { diff --git a/internal/command/org_policy_label_model.go b/internal/command/org_policy_label_model.go index a6b82c8e98..b3405179c2 100644 --- a/internal/command/org_policy_label_model.go +++ b/internal/command/org_policy_label_model.go @@ -2,6 +2,7 @@ package command import ( "context" + "github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/repository/org" @@ -61,9 +62,11 @@ func (wm *OrgLabelPolicyWriteModel) Reduce() error { } func (wm *OrgLabelPolicyWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). - AggregateIDs(wm.LabelPolicyWriteModel.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(org.AggregateType). + AggregateIDs(wm.LabelPolicyWriteModel.AggregateID). EventTypes( org.LabelPolicyAddedEventType, org.LabelPolicyChangedEventType, @@ -77,8 +80,8 @@ func (wm *OrgLabelPolicyWriteModel) Query() *eventstore.SearchQueryBuilder { org.LabelPolicyIconDarkAddedEventType, org.LabelPolicyIconDarkRemovedEventType, org.LabelPolicyFontAddedEventType, - org.LabelPolicyFontRemovedEventType, - ) + org.LabelPolicyFontRemovedEventType). + Builder() } func (wm *OrgLabelPolicyWriteModel) NewChangedEvent( diff --git a/internal/command/org_policy_login_factors_model.go b/internal/command/org_policy_login_factors_model.go index f7b942d30d..b1db43ae2d 100644 --- a/internal/command/org_policy_login_factors_model.go +++ b/internal/command/org_policy_login_factors_model.go @@ -43,12 +43,15 @@ func (wm *OrgSecondFactorWriteModel) Reduce() error { } func (wm *OrgSecondFactorWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). - AggregateIDs(wm.WriteModel.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(org.AggregateType). + AggregateIDs(wm.WriteModel.AggregateID). EventTypes( org.LoginPolicySecondFactorAddedEventType, - org.LoginPolicySecondFactorRemovedEventType) + org.LoginPolicySecondFactorRemovedEventType). + Builder() } type OrgMultiFactorWriteModel struct { @@ -87,12 +90,15 @@ func (wm *OrgMultiFactorWriteModel) Reduce() error { } func (wm *OrgMultiFactorWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). - AggregateIDs(wm.WriteModel.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(org.AggregateType). + AggregateIDs(wm.WriteModel.AggregateID). EventTypes( org.LoginPolicyMultiFactorAddedEventType, - org.LoginPolicyMultiFactorRemovedEventType) + org.LoginPolicyMultiFactorRemovedEventType). + Builder() } func NewOrgAuthFactorsAllowedWriteModel(orgID string) *OrgAuthFactorsAllowedWriteModel { @@ -164,17 +170,26 @@ func (wm *OrgAuthFactorsAllowedWriteModel) ensureMultiFactor(multiFactor domain. } func (wm *OrgAuthFactorsAllowedWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType, org.AggregateType). - AggregateIDs(domain.IAMID, wm.WriteModel.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). + AddQuery(). + AggregateTypes(iam.AggregateType). + AggregateIDs(domain.IAMID). EventTypes( iam.LoginPolicySecondFactorAddedEventType, iam.LoginPolicySecondFactorRemovedEventType, iam.LoginPolicyMultiFactorAddedEventType, iam.LoginPolicyMultiFactorRemovedEventType, + ). + Or(). + AggregateTypes(org.AggregateType). + AggregateIDs(wm.WriteModel.AggregateID). + EventTypes( org.LoginPolicySecondFactorAddedEventType, org.LoginPolicySecondFactorRemovedEventType, org.LoginPolicyMultiFactorAddedEventType, - org.LoginPolicyMultiFactorRemovedEventType) + org.LoginPolicyMultiFactorRemovedEventType, + ). + Builder() } func (wm *OrgAuthFactorsAllowedWriteModel) ToSecondFactorWriteModel(factor domain.SecondFactorType) *OrgSecondFactorWriteModel { diff --git a/internal/command/org_policy_login_identity_provider_model.go b/internal/command/org_policy_login_identity_provider_model.go index c5c6fbe10d..bc01bc2f40 100644 --- a/internal/command/org_policy_login_identity_provider_model.go +++ b/internal/command/org_policy_login_identity_provider_model.go @@ -43,10 +43,13 @@ func (wm *OrgIdentityProviderWriteModel) Reduce() error { } func (wm *OrgIdentityProviderWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). - AggregateIDs(wm.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(org.AggregateType). + AggregateIDs(wm.AggregateID). EventTypes( org.LoginPolicyIDPProviderAddedEventType, - org.LoginPolicyIDPProviderRemovedEventType) + org.LoginPolicyIDPProviderRemovedEventType). + Builder() } diff --git a/internal/command/org_policy_login_model.go b/internal/command/org_policy_login_model.go index cc87572004..bc2574e9e4 100644 --- a/internal/command/org_policy_login_model.go +++ b/internal/command/org_policy_login_model.go @@ -2,6 +2,7 @@ package command import ( "context" + "github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/domain" @@ -46,13 +47,16 @@ func (wm *OrgLoginPolicyWriteModel) Reduce() error { } func (wm *OrgLoginPolicyWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). - AggregateIDs(wm.LoginPolicyWriteModel.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(org.AggregateType). + AggregateIDs(wm.LoginPolicyWriteModel.AggregateID). EventTypes( org.LoginPolicyAddedEventType, org.LoginPolicyChangedEventType, - org.LoginPolicyRemovedEventType) + org.LoginPolicyRemovedEventType). + Builder() } func (wm *OrgLoginPolicyWriteModel) NewChangedEvent( diff --git a/internal/command/org_policy_mail_template_model.go b/internal/command/org_policy_mail_template_model.go index 3545583f53..c1236ed802 100644 --- a/internal/command/org_policy_mail_template_model.go +++ b/internal/command/org_policy_mail_template_model.go @@ -2,9 +2,10 @@ package command import ( "context" - "github.com/caos/zitadel/internal/eventstore" "reflect" + "github.com/caos/zitadel/internal/eventstore" + "github.com/caos/zitadel/internal/repository/org" "github.com/caos/zitadel/internal/repository/policy" ) @@ -42,12 +43,15 @@ func (wm *OrgMailTemplateWriteModel) Reduce() error { } func (wm *OrgMailTemplateWriteModel) Query() *eventstore.SearchQueryBuilder { - query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). + query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). + AddQuery(). + AggregateTypes(org.AggregateType). AggregateIDs(wm.MailTemplateWriteModel.AggregateID). EventTypes( org.MailTemplateAddedEventType, org.MailTemplateChangedEventType, - org.MailTemplateRemovedEventType) + org.MailTemplateRemovedEventType). + Builder() if wm.ResourceOwner != "" { query.ResourceOwner(wm.ResourceOwner) diff --git a/internal/command/org_policy_org_iam_model.go b/internal/command/org_policy_org_iam_model.go index 6643772a1f..fb23959522 100644 --- a/internal/command/org_policy_org_iam_model.go +++ b/internal/command/org_policy_org_iam_model.go @@ -2,6 +2,7 @@ package command import ( "context" + "github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/repository/org" @@ -41,12 +42,15 @@ func (wm *ORGOrgIAMPolicyWriteModel) Reduce() error { } func (wm *ORGOrgIAMPolicyWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). - AggregateIDs(wm.PolicyOrgIAMWriteModel.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(org.AggregateType). + AggregateIDs(wm.PolicyOrgIAMWriteModel.AggregateID). EventTypes(org.OrgIAMPolicyAddedEventType, org.OrgIAMPolicyChangedEventType, - org.OrgIAMPolicyRemovedEventType) + org.OrgIAMPolicyRemovedEventType). + Builder() } func (wm *ORGOrgIAMPolicyWriteModel) NewChangedEvent( diff --git a/internal/command/org_policy_password_age_model.go b/internal/command/org_policy_password_age_model.go index fdb54b2d67..9845264f56 100644 --- a/internal/command/org_policy_password_age_model.go +++ b/internal/command/org_policy_password_age_model.go @@ -2,6 +2,7 @@ package command import ( "context" + "github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/repository/org" @@ -41,13 +42,16 @@ func (wm *OrgPasswordAgePolicyWriteModel) Reduce() error { } func (wm *OrgPasswordAgePolicyWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). - AggregateIDs(wm.PasswordAgePolicyWriteModel.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(org.AggregateType). + AggregateIDs(wm.PasswordAgePolicyWriteModel.AggregateID). EventTypes( org.PasswordAgePolicyAddedEventType, org.PasswordAgePolicyChangedEventType, - org.PasswordAgePolicyRemovedEventType) + org.PasswordAgePolicyRemovedEventType). + Builder() } func (wm *OrgPasswordAgePolicyWriteModel) NewChangedEvent( diff --git a/internal/command/org_policy_password_complexity_model.go b/internal/command/org_policy_password_complexity_model.go index 3191945884..5ef01e6b02 100644 --- a/internal/command/org_policy_password_complexity_model.go +++ b/internal/command/org_policy_password_complexity_model.go @@ -2,6 +2,7 @@ package command import ( "context" + "github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/repository/org" @@ -41,12 +42,15 @@ func (wm *OrgPasswordComplexityPolicyWriteModel) Reduce() error { } func (wm *OrgPasswordComplexityPolicyWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). - AggregateIDs(wm.PasswordComplexityPolicyWriteModel.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(org.AggregateType). + AggregateIDs(wm.PasswordComplexityPolicyWriteModel.AggregateID). EventTypes(org.PasswordComplexityPolicyAddedEventType, org.PasswordComplexityPolicyChangedEventType, - org.PasswordComplexityPolicyRemovedEventType) + org.PasswordComplexityPolicyRemovedEventType). + Builder() } func (wm *OrgPasswordComplexityPolicyWriteModel) NewChangedEvent( diff --git a/internal/command/org_policy_password_lockout_model.go b/internal/command/org_policy_password_lockout_model.go index 84af325c11..275c33e835 100644 --- a/internal/command/org_policy_password_lockout_model.go +++ b/internal/command/org_policy_password_lockout_model.go @@ -2,6 +2,7 @@ package command import ( "context" + "github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/repository/org" @@ -41,12 +42,15 @@ func (wm *OrgPasswordLockoutPolicyWriteModel) Reduce() error { } func (wm *OrgPasswordLockoutPolicyWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). - AggregateIDs(wm.PasswordLockoutPolicyWriteModel.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(org.AggregateType). + AggregateIDs(wm.PasswordLockoutPolicyWriteModel.AggregateID). EventTypes(org.PasswordLockoutPolicyAddedEventType, org.PasswordLockoutPolicyChangedEventType, - org.PasswordLockoutPolicyRemovedEventType) + org.PasswordLockoutPolicyRemovedEventType). + Builder() } func (wm *OrgPasswordLockoutPolicyWriteModel) NewChangedEvent( diff --git a/internal/command/org_policy_privacy_model.go b/internal/command/org_policy_privacy_model.go index d4a0384e17..46db23229e 100644 --- a/internal/command/org_policy_privacy_model.go +++ b/internal/command/org_policy_privacy_model.go @@ -2,6 +2,7 @@ package command import ( "context" + "github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/repository/org" @@ -41,12 +42,15 @@ func (wm *OrgPrivacyPolicyWriteModel) Reduce() error { } func (wm *OrgPrivacyPolicyWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). - AggregateIDs(wm.PrivacyPolicyWriteModel.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateIDs(wm.PrivacyPolicyWriteModel.AggregateID). + AggregateTypes(org.AggregateType). EventTypes(org.PrivacyPolicyAddedEventType, org.PrivacyPolicyChangedEventType, - org.PrivacyPolicyRemovedEventType) + org.PrivacyPolicyRemovedEventType). + Builder() } func (wm *OrgPrivacyPolicyWriteModel) NewChangedEvent( diff --git a/internal/command/project_application_api_model.go b/internal/command/project_application_api_model.go index 37ae2c8cb7..1fe355fe03 100644 --- a/internal/command/project_application_api_model.go +++ b/internal/command/project_application_api_model.go @@ -2,6 +2,7 @@ package command import ( "context" + "github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/crypto" @@ -136,9 +137,11 @@ func (wm *APIApplicationWriteModel) appendChangeAPIEvent(e *project.APIConfigCha } func (wm *APIApplicationWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, project.AggregateType). - AggregateIDs(wm.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(project.AggregateType). + AggregateIDs(wm.AggregateID). EventTypes( project.ApplicationAddedType, project.ApplicationChangedType, @@ -148,8 +151,8 @@ func (wm *APIApplicationWriteModel) Query() *eventstore.SearchQueryBuilder { project.APIConfigAddedType, project.APIConfigChangedType, project.APIConfigSecretChangedType, - project.ProjectRemovedType, - ) + project.ProjectRemovedType). + Builder() } func (wm *APIApplicationWriteModel) NewChangedEvent( diff --git a/internal/command/project_application_key_model.go b/internal/command/project_application_key_model.go index 2466a6e145..7c5bf705f8 100644 --- a/internal/command/project_application_key_model.go +++ b/internal/command/project_application_key_model.go @@ -1,9 +1,10 @@ package command import ( - "github.com/caos/zitadel/internal/eventstore" "time" + "github.com/caos/zitadel/internal/eventstore" + "github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/repository/project" ) @@ -126,9 +127,11 @@ func (wm *ApplicationKeyWriteModel) appendChangeAPIEvent(e *project.APIConfigCha } func (wm *ApplicationKeyWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, project.AggregateType). - AggregateIDs(wm.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(project.AggregateType). + AggregateIDs(wm.AggregateID). EventTypes( project.ApplicationRemovedType, project.OIDCConfigAddedType, @@ -137,6 +140,6 @@ func (wm *ApplicationKeyWriteModel) Query() *eventstore.SearchQueryBuilder { project.APIConfigChangedType, project.ApplicationKeyAddedEventType, project.ApplicationKeyRemovedEventType, - project.ProjectRemovedType, - ) + project.ProjectRemovedType). + Builder() } diff --git a/internal/command/project_application_model.go b/internal/command/project_application_model.go index f106bc2b96..2efae00111 100644 --- a/internal/command/project_application_model.go +++ b/internal/command/project_application_model.go @@ -94,15 +94,17 @@ func (wm *ApplicationWriteModel) Reduce() error { } func (wm *ApplicationWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, project.AggregateType). - AggregateIDs(wm.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(project.AggregateType). + AggregateIDs(wm.AggregateID). EventTypes( project.ApplicationAddedType, project.ApplicationChangedType, project.ApplicationDeactivatedType, project.ApplicationReactivatedType, project.ApplicationRemovedType, - project.ProjectRemovedType, - ) + project.ProjectRemovedType). + Builder() } diff --git a/internal/command/project_application_oidc_model.go b/internal/command/project_application_oidc_model.go index 343d379f8d..0c5bf4d030 100644 --- a/internal/command/project_application_oidc_model.go +++ b/internal/command/project_application_oidc_model.go @@ -2,12 +2,13 @@ package command import ( "context" + "reflect" + "time" + "github.com/caos/zitadel/internal/crypto" "github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/repository/project" - "reflect" - "time" ) type OIDCApplicationWriteModel struct { @@ -203,9 +204,11 @@ func (wm *OIDCApplicationWriteModel) appendChangeOIDCEvent(e *project.OIDCConfig } func (wm *OIDCApplicationWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, project.AggregateType). - AggregateIDs(wm.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(project.AggregateType). + AggregateIDs(wm.AggregateID). EventTypes( project.ApplicationAddedType, project.ApplicationChangedType, @@ -215,8 +218,8 @@ func (wm *OIDCApplicationWriteModel) Query() *eventstore.SearchQueryBuilder { project.OIDCConfigAddedType, project.OIDCConfigChangedType, project.OIDCConfigSecretChangedType, - project.ProjectRemovedType, - ) + project.ProjectRemovedType). + Builder() } func (wm *OIDCApplicationWriteModel) NewChangedEvent( diff --git a/internal/command/project_grant_member_model.go b/internal/command/project_grant_member_model.go index 367bcb241b..a53b7afdcf 100644 --- a/internal/command/project_grant_member_model.go +++ b/internal/command/project_grant_member_model.go @@ -80,7 +80,9 @@ func (wm *ProjectGrantMemberWriteModel) Reduce() error { } func (wm *ProjectGrantMemberWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, project.AggregateType). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). + AddQuery(). + AggregateTypes(project.AggregateType). AggregateIDs(wm.AggregateID). EventTypes( project.GrantMemberAddedType, @@ -88,5 +90,6 @@ func (wm *ProjectGrantMemberWriteModel) Query() *eventstore.SearchQueryBuilder { project.GrantMemberRemovedType, project.GrantMemberCascadeRemovedType, project.GrantRemovedType, - project.ProjectRemovedType) + project.ProjectRemovedType). + Builder() } diff --git a/internal/command/project_grant_model.go b/internal/command/project_grant_model.go index 3b3420bc07..adf24c7808 100644 --- a/internal/command/project_grant_model.go +++ b/internal/command/project_grant_model.go @@ -91,7 +91,9 @@ func (wm *ProjectGrantWriteModel) Reduce() error { } func (wm *ProjectGrantWriteModel) Query() *eventstore.SearchQueryBuilder { - query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, project.AggregateType). + query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). + AddQuery(). + AggregateTypes(project.AggregateType). AggregateIDs(wm.AggregateID). EventTypes( project.GrantAddedType, @@ -100,7 +102,9 @@ func (wm *ProjectGrantWriteModel) Query() *eventstore.SearchQueryBuilder { project.GrantDeactivatedType, project.GrantReactivatedType, project.GrantRemovedType, - project.ProjectRemovedType) + project.ProjectRemovedType). + Builder() + if wm.ResourceOwner != "" { query.ResourceOwner(wm.ResourceOwner) } @@ -152,14 +156,22 @@ func (wm *ProjectGrantPreConditionReadModel) Reduce() error { } func (wm *ProjectGrantPreConditionReadModel) Query() *eventstore.SearchQueryBuilder { - query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType, project.AggregateType). - AggregateIDs(wm.ProjectID, wm.GrantedOrgID). + query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). + AddQuery(). + AggregateTypes(org.AggregateType). + AggregateIDs(wm.GrantedOrgID). EventTypes( org.OrgAddedEventType, - org.OrgRemovedEventType, + org.OrgRemovedEventType). + Or(). + AggregateTypes(project.AggregateType). + AggregateIDs(wm.ProjectID). + EventTypes( project.ProjectAddedType, project.ProjectRemovedType, project.RoleAddedType, - project.RoleRemovedType) + project.RoleRemovedType). + Builder() + return query } diff --git a/internal/command/project_member_model.go b/internal/command/project_member_model.go index 27fbaeab12..686e255459 100644 --- a/internal/command/project_member_model.go +++ b/internal/command/project_member_model.go @@ -53,11 +53,14 @@ func (wm *ProjectMemberWriteModel) Reduce() error { } func (wm *ProjectMemberWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, project.AggregateType). - AggregateIDs(wm.MemberWriteModel.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(project.AggregateType). + AggregateIDs(wm.MemberWriteModel.AggregateID). EventTypes(project.MemberAddedType, project.MemberChangedType, project.MemberRemovedType, - project.MemberCascadeRemovedType) + project.MemberCascadeRemovedType). + Builder() } diff --git a/internal/command/project_model.go b/internal/command/project_model.go index 32cfe1dfdd..9e5cc439c6 100644 --- a/internal/command/project_model.go +++ b/internal/command/project_model.go @@ -2,6 +2,7 @@ package command import ( "context" + "github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/repository/project" @@ -61,14 +62,17 @@ func (wm *ProjectWriteModel) Reduce() error { } func (wm *ProjectWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, project.AggregateType). - AggregateIDs(wm.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(project.AggregateType). + AggregateIDs(wm.AggregateID). EventTypes(project.ProjectAddedType, project.ProjectChangedType, project.ProjectDeactivatedType, project.ProjectReactivatedType, - project.ProjectRemovedType) + project.ProjectRemovedType). + Builder() } func (wm *ProjectWriteModel) NewChangedEvent( diff --git a/internal/command/project_role_model.go b/internal/command/project_role_model.go index 021b67e563..7ed6231f9e 100644 --- a/internal/command/project_role_model.go +++ b/internal/command/project_role_model.go @@ -2,6 +2,7 @@ package command import ( "context" + "github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/repository/project" @@ -82,14 +83,17 @@ func (wm *ProjectRoleWriteModel) Reduce() error { } func (wm *ProjectRoleWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, project.AggregateType). - AggregateIDs(wm.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(project.AggregateType). + AggregateIDs(wm.AggregateID). EventTypes( project.RoleAddedType, project.RoleChangedType, project.RoleRemovedType, - project.ProjectRemovedType) + project.ProjectRemovedType). + Builder() } func (wm *ProjectRoleWriteModel) NewProjectRoleChangedEvent( diff --git a/internal/command/unique_constraints_model.go b/internal/command/unique_constraints_model.go index d10429a638..0dd5dcd515 100644 --- a/internal/command/unique_constraints_model.go +++ b/internal/command/unique_constraints_model.go @@ -2,6 +2,7 @@ package command import ( "context" + "github.com/caos/logging" "github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/eventstore" @@ -181,8 +182,8 @@ func (rm *UniqueConstraintReadModel) Reduce() error { } func (rm *UniqueConstraintReadModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder( - eventstore.ColumnsEvent, + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). + AddQuery().AggregateTypes( iam.AggregateType, org.AggregateType, project.AggregateType, @@ -237,8 +238,8 @@ func (rm *UniqueConstraintReadModel) Query() *eventstore.SearchQueryBuilder { org.MemberCascadeRemovedEventType, project.MemberAddedType, project.MemberRemovedType, - project.MemberCascadeRemovedType, - ) + project.MemberCascadeRemovedType). + Builder() } func (rm *UniqueConstraintReadModel) getUniqueConstraint(aggregateID, objectID, constraintType string) *domain.UniqueConstraintMigration { diff --git a/internal/command/user_grant_model.go b/internal/command/user_grant_model.go index e5a8171364..af3f847c66 100644 --- a/internal/command/user_grant_model.go +++ b/internal/command/user_grant_model.go @@ -60,7 +60,9 @@ func (wm *UserGrantWriteModel) Reduce() error { } func (wm *UserGrantWriteModel) Query() *eventstore.SearchQueryBuilder { - query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, usergrant.AggregateType). + query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). + AddQuery(). + AggregateTypes(usergrant.AggregateType). AggregateIDs(wm.AggregateID). EventTypes(usergrant.UserGrantAddedType, usergrant.UserGrantChangedType, @@ -68,7 +70,9 @@ func (wm *UserGrantWriteModel) Query() *eventstore.SearchQueryBuilder { usergrant.UserGrantDeactivatedType, usergrant.UserGrantReactivatedType, usergrant.UserGrantRemovedType, - usergrant.UserGrantCascadeRemovedType) + usergrant.UserGrantCascadeRemovedType). + Builder() + if wm.ResourceOwner != "" { query.ResourceOwner(wm.ResourceOwner) } @@ -152,20 +156,28 @@ func (wm *UserGrantPreConditionReadModel) Reduce() error { } func (wm *UserGrantPreConditionReadModel) Query() *eventstore.SearchQueryBuilder { - query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType, project.AggregateType). - AggregateIDs(wm.UserID, wm.ProjectID). - EventTypes(user.UserV1AddedType, + query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). + AddQuery(). + AggregateTypes(user.AggregateType). + AggregateIDs(wm.UserID). + EventTypes( + user.UserV1AddedType, user.HumanAddedType, user.UserV1RegisteredType, user.HumanRegisteredType, user.MachineAddedEventType, - user.UserRemovedType, + user.UserRemovedType). + Or(). + AggregateTypes(project.AggregateType). + AggregateIDs(wm.ProjectID). + EventTypes( project.ProjectAddedType, project.ProjectRemovedType, project.GrantAddedType, project.GrantChangedType, project.GrantRemovedType, project.RoleAddedType, - project.RoleRemovedType) + project.RoleRemovedType). + Builder() return query } diff --git a/internal/command/user_human_address_model.go b/internal/command/user_human_address_model.go index dca7e6607e..0c7a51536c 100644 --- a/internal/command/user_human_address_model.go +++ b/internal/command/user_human_address_model.go @@ -70,16 +70,19 @@ func (wm *HumanAddressWriteModel) Reduce() error { } func (wm *HumanAddressWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType). - AggregateIDs(wm.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(user.AggregateType). + AggregateIDs(wm.AggregateID). EventTypes(user.UserV1AddedType, user.UserV1RegisteredType, user.UserV1AddressChangedType, user.HumanAddedType, user.HumanRegisteredType, user.HumanAddressChangedType, - user.UserRemovedType) + user.UserRemovedType). + Builder() } func (wm *HumanAddressWriteModel) NewChangedEvent( diff --git a/internal/command/user_human_email_model.go b/internal/command/user_human_email_model.go index ce4dffc8fc..2b6980312e 100644 --- a/internal/command/user_human_email_model.go +++ b/internal/command/user_human_email_model.go @@ -65,7 +65,9 @@ func (wm *HumanEmailWriteModel) Reduce() error { } func (wm *HumanEmailWriteModel) Query() *eventstore.SearchQueryBuilder { - query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType). + query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). + AddQuery(). + AggregateTypes(user.AggregateType). AggregateIDs(wm.AggregateID). EventTypes(user.UserV1AddedType, user.HumanAddedType, @@ -81,7 +83,9 @@ func (wm *HumanEmailWriteModel) Query() *eventstore.SearchQueryBuilder { user.HumanEmailCodeAddedType, user.UserV1EmailVerifiedType, user.HumanEmailVerifiedType, - user.UserRemovedType) + user.UserRemovedType). + Builder() + if wm.ResourceOwner != "" { query.ResourceOwner(wm.ResourceOwner) } diff --git a/internal/command/user_human_externalidp_model.go b/internal/command/user_human_externalidp_model.go index 7952910cbe..2cd7845d04 100644 --- a/internal/command/user_human_externalidp_model.go +++ b/internal/command/user_human_externalidp_model.go @@ -47,11 +47,14 @@ func (wm *HumanExternalIDPWriteModel) Reduce() error { } func (wm *HumanExternalIDPWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType). - AggregateIDs(wm.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(user.AggregateType). + AggregateIDs(wm.AggregateID). EventTypes(user.HumanExternalIDPAddedType, user.HumanExternalIDPRemovedType, user.HumanExternalIDPCascadeRemovedType, - user.UserRemovedType) + user.UserRemovedType). + Builder() } diff --git a/internal/command/user_human_init_model.go b/internal/command/user_human_init_model.go index b37d202eae..1b48e19216 100644 --- a/internal/command/user_human_init_model.go +++ b/internal/command/user_human_init_model.go @@ -2,9 +2,10 @@ package command import ( "context" - "github.com/caos/zitadel/internal/eventstore" "time" + "github.com/caos/zitadel/internal/eventstore" + "github.com/caos/zitadel/internal/crypto" "github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/repository/user" @@ -66,7 +67,9 @@ func (wm *HumanInitCodeWriteModel) Reduce() error { } func (wm *HumanInitCodeWriteModel) Query() *eventstore.SearchQueryBuilder { - query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType). + query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). + AddQuery(). + AggregateTypes(user.AggregateType). AggregateIDs(wm.AggregateID). EventTypes(user.UserV1AddedType, user.HumanAddedType, @@ -80,7 +83,9 @@ func (wm *HumanInitCodeWriteModel) Query() *eventstore.SearchQueryBuilder { user.HumanInitialCodeAddedType, user.UserV1InitializedCheckSucceededType, user.HumanInitializedCheckSucceededType, - user.UserRemovedType) + user.UserRemovedType). + Builder() + if wm.ResourceOwner != "" { query.ResourceOwner(wm.ResourceOwner) } diff --git a/internal/command/user_human_model.go b/internal/command/user_human_model.go index 4b4456a222..05ba4a771f 100644 --- a/internal/command/user_human_model.go +++ b/internal/command/user_human_model.go @@ -104,9 +104,11 @@ func (wm *HumanWriteModel) Reduce() error { } func (wm *HumanWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType). - AggregateIDs(wm.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(user.AggregateType). + AggregateIDs(wm.AggregateID). EventTypes(user.HumanAddedType, user.HumanRegisteredType, user.HumanInitialCodeAddedType, @@ -136,7 +138,8 @@ func (wm *HumanWriteModel) Query() *eventstore.SearchQueryBuilder { user.UserV1PhoneChangedType, user.UserV1PhoneVerifiedType, user.UserV1PhoneRemovedType, - user.UserV1PasswordChangedType) + user.UserV1PasswordChangedType). + Builder() } func (wm *HumanWriteModel) reduceHumanAddedEvent(e *user.HumanAddedEvent) { diff --git a/internal/command/user_human_otp_model.go b/internal/command/user_human_otp_model.go index 70fbec6859..346291f719 100644 --- a/internal/command/user_human_otp_model.go +++ b/internal/command/user_human_otp_model.go @@ -41,7 +41,9 @@ func (wm *HumanOTPWriteModel) Reduce() error { } func (wm *HumanOTPWriteModel) Query() *eventstore.SearchQueryBuilder { - query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType). + query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). + AddQuery(). + AggregateTypes(user.AggregateType). AggregateIDs(wm.AggregateID). EventTypes(user.HumanMFAOTPAddedType, user.HumanMFAOTPVerifiedType, @@ -49,7 +51,9 @@ func (wm *HumanOTPWriteModel) Query() *eventstore.SearchQueryBuilder { user.UserRemovedType, user.UserV1MFAOTPAddedType, user.UserV1MFAOTPVerifiedType, - user.UserV1MFAOTPRemovedType) + user.UserV1MFAOTPRemovedType). + Builder() + if wm.ResourceOwner != "" { query.ResourceOwner(wm.ResourceOwner) } diff --git a/internal/command/user_human_password_model.go b/internal/command/user_human_password_model.go index 26d18347c0..1efbaa877f 100644 --- a/internal/command/user_human_password_model.go +++ b/internal/command/user_human_password_model.go @@ -1,9 +1,10 @@ package command import ( - "github.com/caos/zitadel/internal/eventstore" "time" + "github.com/caos/zitadel/internal/eventstore" + "github.com/caos/zitadel/internal/crypto" "github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/repository/user" @@ -66,7 +67,9 @@ func (wm *HumanPasswordWriteModel) Reduce() error { } func (wm *HumanPasswordWriteModel) Query() *eventstore.SearchQueryBuilder { - query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType). + query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). + AddQuery(). + AggregateTypes(user.AggregateType). AggregateIDs(wm.AggregateID). EventTypes(user.HumanAddedType, user.HumanRegisteredType, @@ -82,7 +85,9 @@ func (wm *HumanPasswordWriteModel) Query() *eventstore.SearchQueryBuilder { user.UserV1InitializedCheckSucceededType, user.UserV1PasswordChangedType, user.UserV1PasswordCodeAddedType, - user.UserV1EmailVerifiedType) + user.UserV1EmailVerifiedType). + Builder() + if wm.ResourceOwner != "" { query.ResourceOwner(wm.ResourceOwner) } diff --git a/internal/command/user_human_phone_model.go b/internal/command/user_human_phone_model.go index 3757ca8bae..fe3c58be7a 100644 --- a/internal/command/user_human_phone_model.go +++ b/internal/command/user_human_phone_model.go @@ -2,9 +2,10 @@ package command import ( "context" - "github.com/caos/zitadel/internal/eventstore" "time" + "github.com/caos/zitadel/internal/eventstore" + "github.com/caos/zitadel/internal/crypto" "github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/repository/user" @@ -74,9 +75,11 @@ func (wm *HumanPhoneWriteModel) Reduce() error { } func (wm *HumanPhoneWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType). - AggregateIDs(wm.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(user.AggregateType). + AggregateIDs(wm.AggregateID). EventTypes(user.HumanAddedType, user.HumanRegisteredType, user.HumanInitialCodeAddedType, @@ -93,7 +96,8 @@ func (wm *HumanPhoneWriteModel) Query() *eventstore.SearchQueryBuilder { user.UserV1PhoneCodeAddedType, user.UserV1PhoneChangedType, user.UserV1PhoneVerifiedType, - user.UserV1PhoneRemovedType) + user.UserV1PhoneRemovedType). + Builder() } func (wm *HumanPhoneWriteModel) NewChangedEvent( diff --git a/internal/command/user_human_profile_model.go b/internal/command/user_human_profile_model.go index ab7896c165..04028245c2 100644 --- a/internal/command/user_human_profile_model.go +++ b/internal/command/user_human_profile_model.go @@ -2,6 +2,7 @@ package command import ( "context" + "github.com/caos/zitadel/internal/eventstore" "golang.org/x/text/language" @@ -78,16 +79,19 @@ func (wm *HumanProfileWriteModel) Reduce() error { } func (wm *HumanProfileWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType). - AggregateIDs(wm.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(user.AggregateType). + AggregateIDs(wm.AggregateID). EventTypes(user.HumanAddedType, user.HumanRegisteredType, user.HumanProfileChangedType, user.UserRemovedType, user.UserV1AddedType, user.UserV1RegisteredType, - user.UserV1ProfileChangedType) + user.UserV1ProfileChangedType). + Builder() } func (wm *HumanProfileWriteModel) NewChangedEvent( diff --git a/internal/command/user_human_refresh_token_model.go b/internal/command/user_human_refresh_token_model.go index 4992977a85..e3138a02e5 100644 --- a/internal/command/user_human_refresh_token_model.go +++ b/internal/command/user_human_refresh_token_model.go @@ -75,13 +75,17 @@ func (wm *HumanRefreshTokenWriteModel) Reduce() error { } func (wm *HumanRefreshTokenWriteModel) Query() *eventstore.SearchQueryBuilder { - query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType). + query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). + AddQuery(). + AggregateTypes(user.AggregateType). AggregateIDs(wm.AggregateID). EventTypes( user.HumanRefreshTokenAddedType, user.HumanRefreshTokenRenewedType, user.HumanRefreshTokenRemovedType, - user.UserRemovedType) + user.UserRemovedType). + Builder() + if wm.ResourceOwner != "" { query.ResourceOwner(wm.ResourceOwner) } diff --git a/internal/command/user_human_webauthn_model.go b/internal/command/user_human_webauthn_model.go index 26686008e7..472ee0a5f4 100644 --- a/internal/command/user_human_webauthn_model.go +++ b/internal/command/user_human_webauthn_model.go @@ -124,9 +124,11 @@ func (wm *HumanWebAuthNWriteModel) appendVerifiedEvent(e *user.HumanWebAuthNVeri } func (wm *HumanWebAuthNWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType). - AggregateIDs(wm.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(user.AggregateType). + AggregateIDs(wm.AggregateID). EventTypes(user.HumanU2FTokenAddedType, user.HumanPasswordlessTokenAddedType, user.HumanU2FTokenAddedType, @@ -135,7 +137,8 @@ func (wm *HumanWebAuthNWriteModel) Query() *eventstore.SearchQueryBuilder { user.HumanPasswordlessTokenSignCountChangedType, user.HumanU2FTokenRemovedType, user.HumanPasswordlessTokenRemovedType, - user.UserRemovedType) + user.UserRemovedType). + Builder() } type HumanU2FTokensReadModel struct { @@ -199,13 +202,16 @@ func (wm *HumanU2FTokensReadModel) Reduce() error { } func (rm *HumanU2FTokensReadModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType). - AggregateIDs(rm.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(rm.ResourceOwner). + AddQuery(). + AggregateTypes(user.AggregateType). + AggregateIDs(rm.AggregateID). EventTypes( user.HumanU2FTokenAddedType, user.HumanU2FTokenVerifiedType, - user.HumanU2FTokenRemovedType) + user.HumanU2FTokenRemovedType). + Builder() } @@ -279,13 +285,16 @@ func (wm *HumanPasswordlessTokensReadModel) Reduce() error { } func (rm *HumanPasswordlessTokensReadModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType). - AggregateIDs(rm.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(rm.ResourceOwner). + AddQuery(). + AggregateTypes(user.AggregateType). + AggregateIDs(rm.AggregateID). EventTypes( user.HumanPasswordlessTokenAddedType, user.HumanPasswordlessTokenVerifiedType, - user.HumanPasswordlessTokenRemovedType) + user.HumanPasswordlessTokenRemovedType). + Builder() } @@ -349,13 +358,15 @@ func (wm *HumanU2FLoginReadModel) Reduce() error { } func (rm *HumanU2FLoginReadModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType). - AggregateIDs(rm.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(rm.ResourceOwner). + AddQuery(). + AggregateTypes(user.AggregateType). + AggregateIDs(rm.AggregateID). EventTypes( user.HumanU2FTokenBeginLoginType, - user.UserRemovedType, - ) + user.UserRemovedType). + Builder() } type HumanPasswordlessLoginReadModel struct { @@ -408,12 +419,14 @@ func (wm *HumanPasswordlessLoginReadModel) Reduce() error { } func (rm *HumanPasswordlessLoginReadModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType). - AggregateIDs(rm.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(rm.ResourceOwner). + AddQuery(). + AggregateTypes(user.AggregateType). + AggregateIDs(rm.AggregateID). EventTypes( user.HumanPasswordlessTokenBeginLoginType, - user.UserRemovedType, - ) + user.UserRemovedType). + Builder() } diff --git a/internal/command/user_machine_key_model.go b/internal/command/user_machine_key_model.go index de6968096b..c71e4f26f7 100644 --- a/internal/command/user_machine_key_model.go +++ b/internal/command/user_machine_key_model.go @@ -1,9 +1,10 @@ package command import ( - "github.com/caos/zitadel/internal/eventstore" "time" + "github.com/caos/zitadel/internal/eventstore" + "github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/repository/user" ) @@ -65,13 +66,16 @@ func (wm *MachineKeyWriteModel) Reduce() error { } func (wm *MachineKeyWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType). - AggregateIDs(wm.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(user.AggregateType). + AggregateIDs(wm.AggregateID). EventTypes( user.MachineKeyAddedEventType, user.MachineKeyRemovedEventType, - user.UserRemovedType) + user.UserRemovedType). + Builder() } func (wm *MachineKeyWriteModel) Exists() bool { diff --git a/internal/command/user_machine_model.go b/internal/command/user_machine_model.go index 5bc46c029c..b73287f43a 100644 --- a/internal/command/user_machine_model.go +++ b/internal/command/user_machine_model.go @@ -2,6 +2,7 @@ package command import ( "context" + "github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/domain" @@ -68,9 +69,11 @@ func (wm *MachineWriteModel) Reduce() error { } func (wm *MachineWriteModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType). - AggregateIDs(wm.AggregateID). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). ResourceOwner(wm.ResourceOwner). + AddQuery(). + AggregateTypes(user.AggregateType). + AggregateIDs(wm.AggregateID). EventTypes(user.MachineAddedEventType, user.UserUserNameChangedType, user.MachineChangedEventType, @@ -78,7 +81,8 @@ func (wm *MachineWriteModel) Query() *eventstore.SearchQueryBuilder { user.UserUnlockedType, user.UserDeactivatedType, user.UserReactivatedType, - user.UserRemovedType) + user.UserRemovedType). + Builder() } func (wm *MachineWriteModel) NewChangedEvent( diff --git a/internal/command/user_model.go b/internal/command/user_model.go index 7038d0d7b5..1caae847f3 100644 --- a/internal/command/user_model.go +++ b/internal/command/user_model.go @@ -1,9 +1,10 @@ package command import ( - "github.com/caos/zitadel/internal/eventstore" "strings" + "github.com/caos/zitadel/internal/eventstore" + "github.com/caos/zitadel/internal/domain" caos_errors "github.com/caos/zitadel/internal/errors" "github.com/caos/zitadel/internal/repository/user" @@ -67,7 +68,9 @@ func (wm *UserWriteModel) Reduce() error { } func (wm *UserWriteModel) Query() *eventstore.SearchQueryBuilder { - query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType). + query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). + AddQuery(). + AggregateTypes(user.AggregateType). AggregateIDs(wm.AggregateID). EventTypes( user.HumanAddedType, @@ -83,7 +86,9 @@ func (wm *UserWriteModel) Query() *eventstore.SearchQueryBuilder { user.UserRemovedType, user.UserV1AddedType, user.UserV1RegisteredType, - user.UserV1InitializedCheckSucceededType) + user.UserV1InitializedCheckSucceededType). + Builder() + if wm.ResourceOwner != "" { query.ResourceOwner(wm.ResourceOwner) } diff --git a/internal/eventstore/asset.go b/internal/eventstore/asset.go index 2b8bde7727..0d61030395 100644 --- a/internal/eventstore/asset.go +++ b/internal/eventstore/asset.go @@ -14,8 +14,6 @@ type AssetAction int32 const ( AssetAdd AssetAction = iota AssetRemove - - assetActionCount ) func NewAddAsset( diff --git a/internal/eventstore/eventstore.go b/internal/eventstore/eventstore.go index c95a663e42..ca1ec312bf 100644 --- a/internal/eventstore/eventstore.go +++ b/internal/eventstore/eventstore.go @@ -95,18 +95,6 @@ func uniqueConstraintsToRepository(constraints []*EventUniqueConstraint) (unique return uniqueConstraints } -func assetsToRepository(assets []*Asset) (result []*repository.Asset) { - result = make([]*repository.Asset, len(assets)) - for i, asset := range assets { - result[i] = &repository.Asset{ - ID: asset.ID, - Asset: asset.Asset, - Action: assetActionToRepository(asset.Action), - } - } - return result -} - //FilterEvents filters the stored events based on the searchQuery // and maps the events to the defined event structs func (es *Eventstore) FilterEvents(ctx context.Context, queryFactory *SearchQueryBuilder) ([]EventReader, error) { @@ -241,14 +229,3 @@ func uniqueConstraintActionToRepository(action UniqueConstraintAction) repositor return repository.UniqueConstraintAdd } } - -func assetActionToRepository(action AssetAction) repository.AssetAction { - switch action { - case AssetAdd: - return repository.AssetAdded - case AssetRemove: - return repository.AssetRemoved - default: - return repository.AssetAdded - } -} diff --git a/internal/eventstore/eventstore_test.go b/internal/eventstore/eventstore_test.go index cbd539e3e4..19a5a9e8cb 100644 --- a/internal/eventstore/eventstore_test.go +++ b/internal/eventstore/eventstore_test.go @@ -13,31 +13,6 @@ import ( "github.com/caos/zitadel/internal/eventstore/repository" ) -type testAggregate struct { - id string - events []EventPusher -} - -func (a *testAggregate) ID() string { - return a.id -} - -func (a *testAggregate) Type() AggregateType { - return "test.aggregate" -} - -func (a *testAggregate) Events() []EventPusher { - return a.events -} - -func (a *testAggregate) ResourceOwner() string { - return "caos" -} - -func (a *testAggregate) Version() Version { - return "v1" -} - // testEvent implements the Event interface type testEvent struct { BaseEvent @@ -368,8 +343,7 @@ func Test_eventData(t *testing.T) { func TestEventstore_aggregatesToEvents(t *testing.T) { type args struct { - aggregates []Aggregate - events []EventPusher + events []EventPusher } type res struct { wantErr bool @@ -892,8 +866,13 @@ func TestEventstore_FilterEvents(t *testing.T) { name: "no events", args: args{ query: &SearchQueryBuilder{ - aggregateTypes: []AggregateType{"no.aggregates"}, - columns: repository.ColumnsEvent, + columns: repository.ColumnsEvent, + queries: []*SearchQuery{ + { + builder: &SearchQueryBuilder{}, + aggregateTypes: []AggregateType{"no.aggregates"}, + }, + }, }, }, fields: fields{ @@ -915,8 +894,13 @@ func TestEventstore_FilterEvents(t *testing.T) { name: "repo error", args: args{ query: &SearchQueryBuilder{ - aggregateTypes: []AggregateType{"no.aggregates"}, - columns: repository.ColumnsEvent, + columns: repository.ColumnsEvent, + queries: []*SearchQuery{ + { + builder: &SearchQueryBuilder{}, + aggregateTypes: []AggregateType{"no.aggregates"}, + }, + }, }, }, fields: fields{ @@ -938,8 +922,13 @@ func TestEventstore_FilterEvents(t *testing.T) { name: "found events", args: args{ query: &SearchQueryBuilder{ - aggregateTypes: []AggregateType{"test.aggregate"}, - columns: repository.ColumnsEvent, + columns: repository.ColumnsEvent, + queries: []*SearchQuery{ + { + builder: &SearchQueryBuilder{}, + aggregateTypes: []AggregateType{"test.aggregate"}, + }, + }, }, }, fields: fields{ @@ -1016,8 +1005,13 @@ func TestEventstore_LatestSequence(t *testing.T) { name: "no events", args: args{ query: &SearchQueryBuilder{ - aggregateTypes: []AggregateType{"no.aggregates"}, - columns: repository.ColumnsMaxSequence, + columns: repository.ColumnsMaxSequence, + queries: []*SearchQuery{ + { + builder: &SearchQueryBuilder{}, + aggregateTypes: []AggregateType{"no.aggregates"}, + }, + }, }, }, fields: fields{ @@ -1034,8 +1028,13 @@ func TestEventstore_LatestSequence(t *testing.T) { name: "repo error", args: args{ query: &SearchQueryBuilder{ - aggregateTypes: []AggregateType{"no.aggregates"}, - columns: repository.ColumnsMaxSequence, + columns: repository.ColumnsMaxSequence, + queries: []*SearchQuery{ + { + builder: &SearchQueryBuilder{}, + aggregateTypes: []AggregateType{"no.aggregates"}, + }, + }, }, }, fields: fields{ @@ -1052,8 +1051,13 @@ func TestEventstore_LatestSequence(t *testing.T) { name: "found events", args: args{ query: &SearchQueryBuilder{ - aggregateTypes: []AggregateType{"test.aggregate"}, - columns: repository.ColumnsMaxSequence, + columns: repository.ColumnsMaxSequence, + queries: []*SearchQuery{ + { + builder: &SearchQueryBuilder{}, + aggregateTypes: []AggregateType{"test.aggregate"}, + }, + }, }, }, fields: fields{ @@ -1134,8 +1138,13 @@ func TestEventstore_FilterToReducer(t *testing.T) { name: "no events", args: args{ query: &SearchQueryBuilder{ - aggregateTypes: []AggregateType{"no.aggregates"}, - columns: repository.ColumnsEvent, + columns: repository.ColumnsEvent, + queries: []*SearchQuery{ + { + builder: &SearchQueryBuilder{}, + aggregateTypes: []AggregateType{"no.aggregates"}, + }, + }, }, readModel: &testReducer{ t: t, @@ -1161,8 +1170,13 @@ func TestEventstore_FilterToReducer(t *testing.T) { name: "repo error", args: args{ query: &SearchQueryBuilder{ - aggregateTypes: []AggregateType{"no.aggregates"}, - columns: repository.ColumnsEvent, + columns: repository.ColumnsEvent, + queries: []*SearchQuery{ + { + builder: &SearchQueryBuilder{}, + aggregateTypes: []AggregateType{"no.aggregates"}, + }, + }, }, readModel: &testReducer{ t: t, @@ -1187,7 +1201,15 @@ func TestEventstore_FilterToReducer(t *testing.T) { { name: "found events", args: args{ - query: NewSearchQueryBuilder(repository.ColumnsEvent, "test.aggregate"), + query: &SearchQueryBuilder{ + columns: repository.ColumnsEvent, + queries: []*SearchQuery{ + { + builder: &SearchQueryBuilder{}, + aggregateTypes: []AggregateType{"test.aggregate"}, + }, + }, + }, readModel: &testReducer{ t: t, expectedLength: 1, @@ -1214,8 +1236,13 @@ func TestEventstore_FilterToReducer(t *testing.T) { name: "append in reducer fails", args: args{ query: &SearchQueryBuilder{ - aggregateTypes: []AggregateType{"test.aggregate"}, - columns: repository.ColumnsEvent, + columns: repository.ColumnsEvent, + queries: []*SearchQuery{ + { + builder: &SearchQueryBuilder{}, + aggregateTypes: []AggregateType{"test.aggregate"}, + }, + }, }, readModel: &testReducer{ t: t, @@ -1275,13 +1302,6 @@ func combineEventLists(lists ...[]*repository.Event) []*repository.Event { return events } -func linkEvents(events ...*repository.Event) []*repository.Event { - for i := 1; i < len(events); i++ { - // events[i].PreviousEvent = events[i-1] - } - return events -} - func compareEvents(t *testing.T, want, got *repository.Event) { t.Helper() diff --git a/internal/eventstore/example_test.go b/internal/eventstore/example_test.go index 4d9bc3ebaf..bffe57d5e9 100644 --- a/internal/eventstore/example_test.go +++ b/internal/eventstore/example_test.go @@ -311,7 +311,8 @@ func TestUserReadModel(t *testing.T) { fmt.Printf("%+v\n", events) users := UsersReadModel{} - err = es.FilterToReducer(context.Background(), eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, "test.user"), &users) + + err = es.FilterToReducer(context.Background(), eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).AddQuery().AggregateTypes("test.user").Builder(), &users) if err != nil { t.Errorf("unexpected error on filter to reducer: %v", err) } diff --git a/internal/eventstore/repository/search_query.go b/internal/eventstore/repository/search_query.go index 927eb37c9a..b62bac3987 100644 --- a/internal/eventstore/repository/search_query.go +++ b/internal/eventstore/repository/search_query.go @@ -7,7 +7,7 @@ type SearchQuery struct { Columns Columns Limit uint64 Desc bool - Filters []*Filter + Filters [][]*Filter } //Columns defines which fields of the event are needed for the query diff --git a/internal/eventstore/repository/sql/crdb.go b/internal/eventstore/repository/sql/crdb.go index 2655d779fe..78d1f66a7f 100644 --- a/internal/eventstore/repository/sql/crdb.go +++ b/internal/eventstore/repository/sql/crdb.go @@ -13,9 +13,6 @@ import ( "github.com/caos/zitadel/internal/eventstore/repository" "github.com/cockroachdb/cockroach-go/v2/crdb" "github.com/lib/pq" - - //sql import for cockroach - _ "github.com/lib/pq" ) const ( @@ -163,7 +160,7 @@ func (db *CRDB) Push(ctx context.Context, events []*repository.Event, uniqueCons // handleUniqueConstraints adds or removes unique constraints func (db *CRDB) handleUniqueConstraints(ctx context.Context, tx *sql.Tx, uniqueConstraints ...*repository.UniqueConstraint) (err error) { - if uniqueConstraints == nil || len(uniqueConstraints) == 0 || (len(uniqueConstraints) == 1 && uniqueConstraints[0] == nil) { + if len(uniqueConstraints) == 0 || (len(uniqueConstraints) == 1 && uniqueConstraints[0] == nil) { return nil } diff --git a/internal/eventstore/repository/sql/crdb_test.go b/internal/eventstore/repository/sql/crdb_test.go index a5ff2ac5e3..e45ad208fc 100644 --- a/internal/eventstore/repository/sql/crdb_test.go +++ b/internal/eventstore/repository/sql/crdb_test.go @@ -5,10 +5,8 @@ import ( "sync" "testing" - "github.com/lib/pq" - _ "github.com/lib/pq" - "github.com/caos/zitadel/internal/eventstore/repository" + "github.com/lib/pq" ) func TestCRDB_placeholder(t *testing.T) { @@ -749,8 +747,10 @@ func TestCRDB_Filter(t *testing.T) { args: args{ searchQuery: &repository.SearchQuery{ Columns: repository.ColumnsEvent, - Filters: []*repository.Filter{ - repository.NewFilter(repository.FieldAggregateType, "not found", repository.OperationEquals), + Filters: [][]*repository.Filter{ + { + repository.NewFilter(repository.FieldAggregateType, "not found", repository.OperationEquals), + }, }, }, }, @@ -771,9 +771,11 @@ func TestCRDB_Filter(t *testing.T) { args: args{ searchQuery: &repository.SearchQuery{ Columns: repository.ColumnsEvent, - Filters: []*repository.Filter{ - repository.NewFilter(repository.FieldAggregateType, t.Name(), repository.OperationEquals), - repository.NewFilter(repository.FieldAggregateID, "303", repository.OperationEquals), + Filters: [][]*repository.Filter{ + { + repository.NewFilter(repository.FieldAggregateType, t.Name(), repository.OperationEquals), + repository.NewFilter(repository.FieldAggregateID, "303", repository.OperationEquals), + }, }, }, }, @@ -837,8 +839,10 @@ func TestCRDB_LatestSequence(t *testing.T) { args: args{ searchQuery: &repository.SearchQuery{ Columns: repository.ColumnsMaxSequence, - Filters: []*repository.Filter{ - repository.NewFilter(repository.FieldAggregateType, "not found", repository.OperationEquals), + Filters: [][]*repository.Filter{ + { + repository.NewFilter(repository.FieldAggregateType, "not found", repository.OperationEquals), + }, }, }, }, @@ -859,8 +863,10 @@ func TestCRDB_LatestSequence(t *testing.T) { args: args{ searchQuery: &repository.SearchQuery{ Columns: repository.ColumnsMaxSequence, - Filters: []*repository.Filter{ - repository.NewFilter(repository.FieldAggregateType, t.Name(), repository.OperationEquals), + Filters: [][]*repository.Filter{ + { + repository.NewFilter(repository.FieldAggregateType, t.Name(), repository.OperationEquals), + }, }, }, }, @@ -1093,20 +1099,6 @@ func generateEvent(t *testing.T, aggregateID string, opts ...func(*repository.Ev return e } -func generateEventWithData(t *testing.T, aggregateID string, data []byte) *repository.Event { - t.Helper() - return &repository.Event{ - AggregateID: aggregateID, - AggregateType: repository.AggregateType(t.Name()), - EditorService: "svc", - EditorUser: "user", - ResourceOwner: "ro", - Type: "test.created", - Version: "v1", - Data: data, - } -} - func generateAddUniqueConstraint(t *testing.T, table, uniqueField string) *repository.UniqueConstraint { t.Helper() e := &repository.UniqueConstraint{ @@ -1128,22 +1120,3 @@ func generateRemoveUniqueConstraint(t *testing.T, table, uniqueField string) *re return e } - -func generateAddAsset(t *testing.T, id string, asset []byte) *repository.Asset { - t.Helper() - e := &repository.Asset{ - ID: id, - Asset: asset, - Action: repository.AssetAdded, - } - return e -} - -func generateRemoveAsset(t *testing.T, id string) *repository.Asset { - t.Helper() - e := &repository.Asset{ - ID: id, - Action: repository.AssetRemoved, - } - return e -} diff --git a/internal/eventstore/repository/sql/local_crdb_test.go b/internal/eventstore/repository/sql/local_crdb_test.go index a06147eeed..e67c314c4a 100644 --- a/internal/eventstore/repository/sql/local_crdb_test.go +++ b/internal/eventstore/repository/sql/local_crdb_test.go @@ -100,11 +100,6 @@ func fillUniqueData(unique_type, field string) error { return err } -func fillAssets(id string, asset []byte) error { - _, err := testCRDBClient.Exec("INSERT INTO eventstore.assets (id, asset) VALUES ($1, $2)", id, asset) - return err -} - type migrationPaths []string type version struct { diff --git a/internal/eventstore/repository/sql/query.go b/internal/eventstore/repository/sql/query.go index ca9120d4e3..cabc547219 100644 --- a/internal/eventstore/repository/sql/query.go +++ b/internal/eventstore/repository/sql/query.go @@ -9,7 +9,6 @@ import ( "strings" "github.com/caos/logging" - caos_errs "github.com/caos/zitadel/internal/errors" z_errors "github.com/caos/zitadel/internal/errors" "github.com/caos/zitadel/internal/eventstore/repository" "github.com/lib/pq" @@ -26,14 +25,13 @@ type querier interface { orderByEventSequence(desc bool) string } -type rowScan func(scan, interface{}) error type scan func(dest ...interface{}) error func query(ctx context.Context, criteria querier, searchQuery *repository.SearchQuery, dest interface{}) error { query, rowScanner := prepareColumns(criteria, searchQuery.Columns) where, values := prepareCondition(criteria, searchQuery.Filters) if where == "" || query == "" { - return caos_errs.ThrowInvalidArgument(nil, "SQL-rWeBw", "invalid query factory") + return z_errors.ThrowInvalidArgument(nil, "SQL-rWeBw", "invalid query factory") } query += where @@ -51,7 +49,7 @@ func query(ctx context.Context, criteria querier, searchQuery *repository.Search rows, err := criteria.db().QueryContext(ctx, query, values...) if err != nil { logging.Log("SQL-HP3Uk").WithError(err).Info("query failed") - return caos_errs.ThrowInternal(err, "SQL-IJuyR", "unable to filter events") + return z_errors.ThrowInternal(err, "SQL-IJuyR", "unable to filter events") } defer rows.Close() @@ -125,31 +123,37 @@ func eventsScanner(scanner scan, dest interface{}) (err error) { return nil } -func prepareCondition(criteria querier, filters []*repository.Filter) (clause string, values []interface{}) { - values = make([]interface{}, len(filters)) - clauses := make([]string, len(filters)) +func prepareCondition(criteria querier, filters [][]*repository.Filter) (clause string, values []interface{}) { + values = make([]interface{}, 0, len(filters)) if len(filters) == 0 { return clause, values } - for i, filter := range filters { - value := filter.Value - switch value.(type) { - case []bool, []float64, []int64, []string, []repository.AggregateType, []repository.EventType, *[]bool, *[]float64, *[]int64, *[]string, *[]repository.AggregateType, *[]repository.EventType: - value = pq.Array(value) - case map[string]interface{}: - var err error - value, err = json.Marshal(value) - logging.Log("SQL-BSsNy").OnError(err).Warn("unable to marshal search value") - } - clauses[i] = getCondition(criteria, filter) - if clauses[i] == "" { - return "", nil + clauses := make([]string, len(filters)) + for idx, filter := range filters { + subClauses := make([]string, 0, len(filter)) + for _, f := range filter { + value := f.Value + switch value.(type) { + case []bool, []float64, []int64, []string, []repository.AggregateType, []repository.EventType, *[]bool, *[]float64, *[]int64, *[]string, *[]repository.AggregateType, *[]repository.EventType: + value = pq.Array(value) + case map[string]interface{}: + var err error + value, err = json.Marshal(value) + logging.Log("SQL-BSsNy").OnError(err).Warn("unable to marshal search value") + continue + } + + subClauses = append(subClauses, getCondition(criteria, f)) + if subClauses[len(subClauses)-1] == "" { + return "", nil + } + values = append(values, value) } - values[i] = value + clauses[idx] = "( " + strings.Join(subClauses, " AND ") + " )" } - return " WHERE " + strings.Join(clauses, " AND "), values + return " WHERE " + strings.Join(clauses, " OR "), values } func getCondition(cond querier, filter *repository.Filter) (condition string) { diff --git a/internal/eventstore/repository/sql/query_test.go b/internal/eventstore/repository/sql/query_test.go index c27ca97328..442c424b11 100644 --- a/internal/eventstore/repository/sql/query_test.go +++ b/internal/eventstore/repository/sql/query_test.go @@ -208,7 +208,7 @@ func prepareTestScan(err error, res []interface{}) scan { func Test_prepareCondition(t *testing.T) { type args struct { - filters []*repository.Filter + filters [][]*repository.Filter } type res struct { clause string @@ -232,7 +232,7 @@ func Test_prepareCondition(t *testing.T) { { name: "empty filters", args: args{ - filters: []*repository.Filter{}, + filters: [][]*repository.Filter{}, }, res: res{ clause: "", @@ -242,8 +242,10 @@ func Test_prepareCondition(t *testing.T) { { name: "invalid condition", args: args{ - filters: []*repository.Filter{ - repository.NewFilter(repository.FieldAggregateID, "wrong", repository.Operation(-1)), + filters: [][]*repository.Filter{ + { + repository.NewFilter(repository.FieldAggregateID, "wrong", repository.Operation(-1)), + }, }, }, res: res{ @@ -254,26 +256,30 @@ func Test_prepareCondition(t *testing.T) { { name: "array as condition value", args: args{ - filters: []*repository.Filter{ - repository.NewFilter(repository.FieldAggregateType, []repository.AggregateType{"user", "org"}, repository.OperationIn), + filters: [][]*repository.Filter{ + { + repository.NewFilter(repository.FieldAggregateType, []repository.AggregateType{"user", "org"}, repository.OperationIn), + }, }, }, res: res{ - clause: " WHERE aggregate_type = ANY(?)", + clause: " WHERE ( aggregate_type = ANY(?) )", values: []interface{}{pq.Array([]repository.AggregateType{"user", "org"})}, }, }, { name: "multiple filters", args: args{ - filters: []*repository.Filter{ - repository.NewFilter(repository.FieldAggregateType, []repository.AggregateType{"user", "org"}, repository.OperationIn), - repository.NewFilter(repository.FieldAggregateID, "1234", repository.OperationEquals), - repository.NewFilter(repository.FieldEventType, []repository.EventType{"user.created", "org.created"}, repository.OperationIn), + filters: [][]*repository.Filter{ + { + repository.NewFilter(repository.FieldAggregateType, []repository.AggregateType{"user", "org"}, repository.OperationIn), + repository.NewFilter(repository.FieldAggregateID, "1234", repository.OperationEquals), + repository.NewFilter(repository.FieldEventType, []repository.EventType{"user.created", "org.created"}, repository.OperationIn), + }, }, }, res: res{ - clause: " WHERE aggregate_type = ANY(?) AND aggregate_id = ? AND event_type = ANY(?)", + clause: " WHERE ( aggregate_type = ANY(?) AND aggregate_id = ? AND event_type = ANY(?) )", values: []interface{}{pq.Array([]repository.AggregateType{"user", "org"}), "1234", pq.Array([]repository.EventType{"user.created", "org.created"})}, }, }, @@ -304,7 +310,6 @@ func Test_query_events_with_crdb(t *testing.T) { } type fields struct { existingEvents []*repository.Event - existingAssets []*repository.Asset client *sql.DB } type res struct { @@ -322,8 +327,10 @@ func Test_query_events_with_crdb(t *testing.T) { args: args{ searchQuery: &repository.SearchQuery{ Columns: repository.ColumnsEvent, - Filters: []*repository.Filter{ - repository.NewFilter(repository.FieldAggregateType, "not found", repository.OperationEquals), + Filters: [][]*repository.Filter{ + { + repository.NewFilter(repository.FieldAggregateType, "not found", repository.OperationEquals), + }, }, }, }, @@ -345,8 +352,10 @@ func Test_query_events_with_crdb(t *testing.T) { args: args{ searchQuery: &repository.SearchQuery{ Columns: repository.ColumnsEvent, - Filters: []*repository.Filter{ - repository.NewFilter(repository.FieldAggregateType, t.Name(), repository.OperationEquals), + Filters: [][]*repository.Filter{ + { + repository.NewFilter(repository.FieldAggregateType, t.Name(), repository.OperationEquals), + }, }, }, }, @@ -369,9 +378,11 @@ func Test_query_events_with_crdb(t *testing.T) { args: args{ searchQuery: &repository.SearchQuery{ Columns: repository.ColumnsEvent, - Filters: []*repository.Filter{ - repository.NewFilter(repository.FieldAggregateType, t.Name(), repository.OperationEquals), - repository.NewFilter(repository.FieldAggregateID, "303", repository.OperationEquals), + Filters: [][]*repository.Filter{ + { + repository.NewFilter(repository.FieldAggregateType, t.Name(), repository.OperationEquals), + repository.NewFilter(repository.FieldAggregateID, "303", repository.OperationEquals), + }, }, }, }, @@ -395,8 +406,10 @@ func Test_query_events_with_crdb(t *testing.T) { args: args{ searchQuery: &repository.SearchQuery{ Columns: repository.ColumnsEvent, - Filters: []*repository.Filter{ - repository.NewFilter(repository.FieldResourceOwner, "caos", repository.OperationEquals), + Filters: [][]*repository.Filter{ + { + repository.NewFilter(repository.FieldResourceOwner, "caos", repository.OperationEquals), + }, }, }, }, @@ -420,9 +433,11 @@ func Test_query_events_with_crdb(t *testing.T) { args: args{ searchQuery: &repository.SearchQuery{ Columns: repository.ColumnsEvent, - Filters: []*repository.Filter{ - repository.NewFilter(repository.FieldEditorService, "MANAGEMENT-API", repository.OperationEquals), - repository.NewFilter(repository.FieldEditorService, "ADMIN-API", repository.OperationEquals), + Filters: [][]*repository.Filter{ + { + repository.NewFilter(repository.FieldEditorService, "MANAGEMENT-API", repository.OperationEquals), + repository.NewFilter(repository.FieldEditorService, "ADMIN-API", repository.OperationEquals), + }, }, }, }, @@ -446,10 +461,12 @@ func Test_query_events_with_crdb(t *testing.T) { args: args{ searchQuery: &repository.SearchQuery{ Columns: repository.ColumnsEvent, - Filters: []*repository.Filter{ - repository.NewFilter(repository.FieldEditorUser, "adlerhurst", repository.OperationEquals), - repository.NewFilter(repository.FieldEditorUser, "nobody", repository.OperationEquals), - repository.NewFilter(repository.FieldEditorUser, "", repository.OperationEquals), + Filters: [][]*repository.Filter{ + { + repository.NewFilter(repository.FieldEditorUser, "adlerhurst", repository.OperationEquals), + repository.NewFilter(repository.FieldEditorUser, "nobody", repository.OperationEquals), + repository.NewFilter(repository.FieldEditorUser, "", repository.OperationEquals), + }, }, }, }, @@ -475,9 +492,11 @@ func Test_query_events_with_crdb(t *testing.T) { args: args{ searchQuery: &repository.SearchQuery{ Columns: repository.ColumnsEvent, - Filters: []*repository.Filter{ - repository.NewFilter(repository.FieldEventType, repository.EventType("user.created"), repository.OperationEquals), - repository.NewFilter(repository.FieldEventType, repository.EventType("user.updated"), repository.OperationEquals), + Filters: [][]*repository.Filter{ + { + repository.NewFilter(repository.FieldEventType, repository.EventType("user.created"), repository.OperationEquals), + repository.NewFilter(repository.FieldEventType, repository.EventType("user.updated"), repository.OperationEquals), + }, }, }, }, @@ -559,18 +578,20 @@ func Test_query_events_mocked(t *testing.T) { query: &repository.SearchQuery{ Columns: repository.ColumnsEvent, Desc: true, - Filters: []*repository.Filter{ + Filters: [][]*repository.Filter{ { - Field: repository.FieldAggregateType, - Value: repository.AggregateType("user"), - Operation: repository.OperationEquals, + { + Field: repository.FieldAggregateType, + Value: repository.AggregateType("user"), + Operation: repository.OperationEquals, + }, }, }, }, }, fields: fields{ mock: newMockClient(t).expectQuery(t, - `SELECT creation_date, event_type, event_sequence, previous_sequence, event_data, editor_service, editor_user, resource_owner, aggregate_type, aggregate_id, aggregate_version FROM eventstore.events WHERE aggregate_type = \$1 ORDER BY event_sequence DESC`, + `SELECT creation_date, event_type, event_sequence, previous_sequence, event_data, editor_service, editor_user, resource_owner, aggregate_type, aggregate_id, aggregate_version FROM eventstore.events WHERE \( aggregate_type = \$1 \) ORDER BY event_sequence DESC`, []driver.Value{repository.AggregateType("user")}, ), }, @@ -586,18 +607,20 @@ func Test_query_events_mocked(t *testing.T) { Columns: repository.ColumnsEvent, Desc: false, Limit: 5, - Filters: []*repository.Filter{ + Filters: [][]*repository.Filter{ { - Field: repository.FieldAggregateType, - Value: repository.AggregateType("user"), - Operation: repository.OperationEquals, + { + Field: repository.FieldAggregateType, + Value: repository.AggregateType("user"), + Operation: repository.OperationEquals, + }, }, }, }, }, fields: fields{ mock: newMockClient(t).expectQuery(t, - `SELECT creation_date, event_type, event_sequence, previous_sequence, event_data, editor_service, editor_user, resource_owner, aggregate_type, aggregate_id, aggregate_version FROM eventstore.events WHERE aggregate_type = \$1 ORDER BY event_sequence LIMIT \$2`, + `SELECT creation_date, event_type, event_sequence, previous_sequence, event_data, editor_service, editor_user, resource_owner, aggregate_type, aggregate_id, aggregate_version FROM eventstore.events WHERE \( aggregate_type = \$1 \) ORDER BY event_sequence LIMIT \$2`, []driver.Value{repository.AggregateType("user"), uint64(5)}, ), }, @@ -613,18 +636,20 @@ func Test_query_events_mocked(t *testing.T) { Columns: repository.ColumnsEvent, Desc: true, Limit: 5, - Filters: []*repository.Filter{ + Filters: [][]*repository.Filter{ { - Field: repository.FieldAggregateType, - Value: repository.AggregateType("user"), - Operation: repository.OperationEquals, + { + Field: repository.FieldAggregateType, + Value: repository.AggregateType("user"), + Operation: repository.OperationEquals, + }, }, }, }, }, fields: fields{ mock: newMockClient(t).expectQuery(t, - `SELECT creation_date, event_type, event_sequence, previous_sequence, event_data, editor_service, editor_user, resource_owner, aggregate_type, aggregate_id, aggregate_version FROM eventstore.events WHERE aggregate_type = \$1 ORDER BY event_sequence DESC LIMIT \$2`, + `SELECT creation_date, event_type, event_sequence, previous_sequence, event_data, editor_service, editor_user, resource_owner, aggregate_type, aggregate_id, aggregate_version FROM eventstore.events WHERE \( aggregate_type = \$1 \) ORDER BY event_sequence DESC LIMIT \$2`, []driver.Value{repository.AggregateType("user"), uint64(5)}, ), }, @@ -640,18 +665,20 @@ func Test_query_events_mocked(t *testing.T) { Columns: repository.ColumnsEvent, Desc: true, Limit: 0, - Filters: []*repository.Filter{ + Filters: [][]*repository.Filter{ { - Field: repository.FieldAggregateType, - Value: repository.AggregateType("user"), - Operation: repository.OperationEquals, + { + Field: repository.FieldAggregateType, + Value: repository.AggregateType("user"), + Operation: repository.OperationEquals, + }, }, }, }, }, fields: fields{ mock: newMockClient(t).expectQueryErr(t, - `SELECT creation_date, event_type, event_sequence, previous_sequence, event_data, editor_service, editor_user, resource_owner, aggregate_type, aggregate_id, aggregate_version FROM eventstore.events WHERE aggregate_type = \$1 ORDER BY event_sequence DESC`, + `SELECT creation_date, event_type, event_sequence, previous_sequence, event_data, editor_service, editor_user, resource_owner, aggregate_type, aggregate_id, aggregate_version FROM eventstore.events WHERE \( aggregate_type = \$1 \) ORDER BY event_sequence DESC`, []driver.Value{repository.AggregateType("user")}, sql.ErrConnDone), }, @@ -667,18 +694,20 @@ func Test_query_events_mocked(t *testing.T) { Columns: repository.ColumnsEvent, Desc: true, Limit: 0, - Filters: []*repository.Filter{ + Filters: [][]*repository.Filter{ { - Field: repository.FieldAggregateType, - Value: repository.AggregateType("user"), - Operation: repository.OperationEquals, + { + Field: repository.FieldAggregateType, + Value: repository.AggregateType("user"), + Operation: repository.OperationEquals, + }, }, }, }, }, fields: fields{ mock: newMockClient(t).expectQuery(t, - `SELECT creation_date, event_type, event_sequence, previous_sequence, event_data, editor_service, editor_user, resource_owner, aggregate_type, aggregate_id, aggregate_version FROM eventstore.events WHERE aggregate_type = \$1 ORDER BY event_sequence DESC`, + `SELECT creation_date, event_type, event_sequence, previous_sequence, event_data, editor_service, editor_user, resource_owner, aggregate_type, aggregate_id, aggregate_version FROM eventstore.events WHERE \( aggregate_type = \$1 \) ORDER BY event_sequence DESC`, []driver.Value{repository.AggregateType("user")}, &repository.Event{Sequence: 100}), }, @@ -702,8 +731,10 @@ func Test_query_events_mocked(t *testing.T) { args: args{ query: &repository.SearchQuery{ Columns: repository.ColumnsEvent, - Filters: []*repository.Filter{ - {}, + Filters: [][]*repository.Filter{ + { + {}, + }, }, }, }, @@ -711,6 +742,47 @@ func Test_query_events_mocked(t *testing.T) { wantErr: true, }, }, + { + name: "with subqueries", + args: args{ + dest: &[]*repository.Event{}, + query: &repository.SearchQuery{ + Columns: repository.ColumnsEvent, + Desc: true, + Limit: 5, + Filters: [][]*repository.Filter{ + { + { + Field: repository.FieldAggregateType, + Value: repository.AggregateType("user"), + Operation: repository.OperationEquals, + }, + }, + { + { + Field: repository.FieldAggregateType, + Value: repository.AggregateType("org"), + Operation: repository.OperationEquals, + }, + { + Field: repository.FieldAggregateID, + Value: "asdf42", + Operation: repository.OperationEquals, + }, + }, + }, + }, + }, + fields: fields{ + mock: newMockClient(t).expectQuery(t, + `SELECT creation_date, event_type, event_sequence, previous_sequence, event_data, editor_service, editor_user, resource_owner, aggregate_type, aggregate_id, aggregate_version FROM eventstore.events WHERE \( aggregate_type = \$1 \) OR \( aggregate_type = \$2 AND aggregate_id = \$3 \) ORDER BY event_sequence DESC LIMIT \$4`, + []driver.Value{repository.AggregateType("user"), repository.AggregateType("org"), "asdf42", uint64(5)}, + ), + }, + res: res{ + wantErr: false, + }, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/internal/eventstore/search_query.go b/internal/eventstore/search_query.go index 94d5e2f05c..6c45498815 100644 --- a/internal/eventstore/search_query.go +++ b/internal/eventstore/search_query.go @@ -8,15 +8,20 @@ import ( //SearchQueryBuilder represents the builder for your filter // if invalid data are set the filter will fail type SearchQueryBuilder struct { - columns repository.Columns - limit uint64 - desc bool + columns repository.Columns + limit uint64 + desc bool + resourceOwner string + queries []*SearchQuery +} + +type SearchQuery struct { + builder *SearchQueryBuilder aggregateTypes []AggregateType aggregateIDs []string eventSequence uint64 eventTypes []EventType eventData map[string]interface{} - resourceOwner string } // Columns defines which fields of the event are needed for the query @@ -37,81 +42,120 @@ type EventType repository.EventType // NewSearchQueryBuilder creates a new factory for event filters // aggregateTypes must contain at least one aggregate type -func NewSearchQueryBuilder(columns Columns, aggregateTypes ...AggregateType) *SearchQueryBuilder { +func NewSearchQueryBuilder(columns Columns) *SearchQueryBuilder { return &SearchQueryBuilder{ - columns: repository.Columns(columns), - aggregateTypes: aggregateTypes, + columns: repository.Columns(columns), } } +//Columns defines which fields are set func (factory *SearchQueryBuilder) Columns(columns Columns) *SearchQueryBuilder { factory.columns = repository.Columns(columns) return factory } +//Limit defines how many events are returned maximally. func (factory *SearchQueryBuilder) Limit(limit uint64) *SearchQueryBuilder { factory.limit = limit return factory } -func (factory *SearchQueryBuilder) SequenceGreater(sequence uint64) *SearchQueryBuilder { - factory.eventSequence = sequence - return factory -} - -func (factory *SearchQueryBuilder) AggregateIDs(ids ...string) *SearchQueryBuilder { - factory.aggregateIDs = ids - return factory -} - -func (factory *SearchQueryBuilder) EventTypes(types ...EventType) *SearchQueryBuilder { - factory.eventTypes = types - return factory -} - +//ResourceOwner defines the resource owner (org) of the events func (factory *SearchQueryBuilder) ResourceOwner(resourceOwner string) *SearchQueryBuilder { factory.resourceOwner = resourceOwner return factory } +//OrderDesc changes the sorting order of the returned events to descending func (factory *SearchQueryBuilder) OrderDesc() *SearchQueryBuilder { factory.desc = true return factory } +//OrderAsc changes the sorting order of the returned events to ascending func (factory *SearchQueryBuilder) OrderAsc() *SearchQueryBuilder { factory.desc = false return factory } -func (factory *SearchQueryBuilder) EventData(query map[string]interface{}) *SearchQueryBuilder { - factory.eventData = query - return factory +//AddQuery creates a new sub query. +//All fields in the sub query are AND-connected in the storage request. +//Multiple sub queries are OR-connected in the storage request. +func (factory *SearchQueryBuilder) AddQuery() *SearchQuery { + query := &SearchQuery{ + builder: factory, + } + factory.queries = append(factory.queries, query) + + return query +} + +//Or creates a new sub query on the search query builder +func (query SearchQuery) Or() *SearchQuery { + return query.builder.AddQuery() +} + +//AggregateTypes filters for events with the given aggregate types +func (query *SearchQuery) AggregateTypes(types ...AggregateType) *SearchQuery { + query.aggregateTypes = types + return query +} + +//SequenceGreater filters for events with sequence greater the requested sequence +func (query *SearchQuery) SequenceGreater(sequence uint64) *SearchQuery { + query.eventSequence = sequence + return query +} + +//AggregateIDs filters for events with the given aggregate id's +func (query *SearchQuery) AggregateIDs(ids ...string) *SearchQuery { + query.aggregateIDs = ids + return query +} + +//EventTypes filters for events with the given event types +func (query *SearchQuery) EventTypes(types ...EventType) *SearchQuery { + query.eventTypes = types + return query +} + +//EventData filters for events with the given event data. +//Use this call with care as it will be slower than the other filters. +func (query *SearchQuery) EventData(data map[string]interface{}) *SearchQuery { + query.eventData = data + return query +} + +//Builder returns the SearchQueryBuilder of the sub query +func (query *SearchQuery) Builder() *SearchQueryBuilder { + return query.builder } func (factory *SearchQueryBuilder) build() (*repository.SearchQuery, error) { if factory == nil || - len(factory.aggregateTypes) < 1 || + len(factory.queries) < 1 || factory.columns.Validate() != nil { return nil, errors.ThrowPreconditionFailed(nil, "MODEL-4m9gs", "factory invalid") } - filters := []*repository.Filter{ - factory.aggregateTypeFilter(), - } + filters := make([][]*repository.Filter, len(factory.queries)) - for _, f := range []func() *repository.Filter{ - factory.aggregateIDFilter, - factory.eventSequenceFilter, - factory.eventTypeFilter, - factory.resourceOwnerFilter, - factory.eventDataFilter, - } { - if filter := f(); filter != nil { - if err := filter.Validate(); err != nil { - return nil, err + for i, query := range factory.queries { + for _, f := range []func() *repository.Filter{ + query.aggregateTypeFilter, + query.aggregateIDFilter, + query.eventSequenceFilter, + query.eventTypeFilter, + query.eventDataFilter, + query.builder.resourceOwnerFilter, + } { + if filter := f(); filter != nil { + if err := filter.Validate(); err != nil { + return nil, err + } + filters[i] = append(filters[i], filter) } - filters = append(filters, filter) } + } return &repository.SearchQuery{ @@ -122,50 +166,50 @@ func (factory *SearchQueryBuilder) build() (*repository.SearchQuery, error) { }, nil } -func (factory *SearchQueryBuilder) aggregateIDFilter() *repository.Filter { - if len(factory.aggregateIDs) < 1 { +func (query *SearchQuery) aggregateIDFilter() *repository.Filter { + if len(query.aggregateIDs) < 1 { return nil } - if len(factory.aggregateIDs) == 1 { - return repository.NewFilter(repository.FieldAggregateID, factory.aggregateIDs[0], repository.OperationEquals) + if len(query.aggregateIDs) == 1 { + return repository.NewFilter(repository.FieldAggregateID, query.aggregateIDs[0], repository.OperationEquals) } - return repository.NewFilter(repository.FieldAggregateID, factory.aggregateIDs, repository.OperationIn) + return repository.NewFilter(repository.FieldAggregateID, query.aggregateIDs, repository.OperationIn) } -func (factory *SearchQueryBuilder) eventTypeFilter() *repository.Filter { - if len(factory.eventTypes) < 1 { +func (query *SearchQuery) eventTypeFilter() *repository.Filter { + if len(query.eventTypes) < 1 { return nil } - if len(factory.eventTypes) == 1 { - return repository.NewFilter(repository.FieldEventType, repository.EventType(factory.eventTypes[0]), repository.OperationEquals) + if len(query.eventTypes) == 1 { + return repository.NewFilter(repository.FieldEventType, repository.EventType(query.eventTypes[0]), repository.OperationEquals) } - eventTypes := make([]repository.EventType, len(factory.eventTypes)) - for i, eventType := range factory.eventTypes { + eventTypes := make([]repository.EventType, len(query.eventTypes)) + for i, eventType := range query.eventTypes { eventTypes[i] = repository.EventType(eventType) } return repository.NewFilter(repository.FieldEventType, eventTypes, repository.OperationIn) } -func (factory *SearchQueryBuilder) aggregateTypeFilter() *repository.Filter { - if len(factory.aggregateTypes) == 1 { - return repository.NewFilter(repository.FieldAggregateType, repository.AggregateType(factory.aggregateTypes[0]), repository.OperationEquals) +func (query *SearchQuery) aggregateTypeFilter() *repository.Filter { + if len(query.aggregateTypes) == 1 { + return repository.NewFilter(repository.FieldAggregateType, repository.AggregateType(query.aggregateTypes[0]), repository.OperationEquals) } - aggregateTypes := make([]repository.AggregateType, len(factory.aggregateTypes)) - for i, aggregateType := range factory.aggregateTypes { + aggregateTypes := make([]repository.AggregateType, len(query.aggregateTypes)) + for i, aggregateType := range query.aggregateTypes { aggregateTypes[i] = repository.AggregateType(aggregateType) } return repository.NewFilter(repository.FieldAggregateType, aggregateTypes, repository.OperationIn) } -func (factory *SearchQueryBuilder) eventSequenceFilter() *repository.Filter { - if factory.eventSequence == 0 { +func (query *SearchQuery) eventSequenceFilter() *repository.Filter { + if query.eventSequence == 0 { return nil } sortOrder := repository.OperationGreater - if factory.desc { + if query.builder.desc { sortOrder = repository.OperationLess } - return repository.NewFilter(repository.FieldSequence, factory.eventSequence, sortOrder) + return repository.NewFilter(repository.FieldSequence, query.eventSequence, sortOrder) } func (factory *SearchQueryBuilder) resourceOwnerFilter() *repository.Filter { @@ -175,9 +219,9 @@ func (factory *SearchQueryBuilder) resourceOwnerFilter() *repository.Filter { return repository.NewFilter(repository.FieldResourceOwner, factory.resourceOwner, repository.OperationEquals) } -func (factory *SearchQueryBuilder) eventDataFilter() *repository.Filter { - if len(factory.eventData) == 0 { +func (query *SearchQuery) eventDataFilter() *repository.Filter { + if len(query.eventData) == 0 { return nil } - return repository.NewFilter(repository.FieldEventData, factory.eventData, repository.OperationJSONContains) + return repository.NewFilter(repository.FieldEventData, query.eventData, repository.OperationJSONContains) } diff --git a/internal/eventstore/search_query_test.go b/internal/eventstore/search_query_test.go index 88d425da38..ba6b214013 100644 --- a/internal/eventstore/search_query_test.go +++ b/internal/eventstore/search_query_test.go @@ -9,6 +9,16 @@ import ( "github.com/caos/zitadel/internal/eventstore/repository" ) +func testAddQuery(queryFuncs ...func(*SearchQuery) *SearchQuery) func(*SearchQueryBuilder) *SearchQueryBuilder { + return func(builder *SearchQueryBuilder) *SearchQueryBuilder { + query := builder.AddQuery() + for _, queryFunc := range queryFuncs { + queryFunc(query) + } + return query.Builder() + } +} + func testSetColumns(columns Columns) func(factory *SearchQueryBuilder) *SearchQueryBuilder { return func(factory *SearchQueryBuilder) *SearchQueryBuilder { factory = factory.Columns(columns) @@ -23,50 +33,66 @@ func testSetLimit(limit uint64) func(factory *SearchQueryBuilder) *SearchQueryBu } } -func testSetSequence(sequence uint64) func(factory *SearchQueryBuilder) *SearchQueryBuilder { - return func(factory *SearchQueryBuilder) *SearchQueryBuilder { - factory = factory.SequenceGreater(sequence) - return factory - } -} - -func testSetAggregateIDs(aggregateIDs ...string) func(factory *SearchQueryBuilder) *SearchQueryBuilder { - return func(factory *SearchQueryBuilder) *SearchQueryBuilder { - factory = factory.AggregateIDs(aggregateIDs...) - return factory - } -} - -func testSetEventTypes(eventTypes ...EventType) func(factory *SearchQueryBuilder) *SearchQueryBuilder { - return func(factory *SearchQueryBuilder) *SearchQueryBuilder { - factory = factory.EventTypes(eventTypes...) - return factory - } -} - -func testSetResourceOwner(resourceOwner string) func(factory *SearchQueryBuilder) *SearchQueryBuilder { - return func(factory *SearchQueryBuilder) *SearchQueryBuilder { - factory = factory.ResourceOwner(resourceOwner) - return factory - } -} - -func testSetSortOrder(asc bool) func(factory *SearchQueryBuilder) *SearchQueryBuilder { - return func(factory *SearchQueryBuilder) *SearchQueryBuilder { - if asc { - factory = factory.OrderAsc() - } else { - factory = factory.OrderDesc() +func testOr(queryFuncs ...func(*SearchQuery) *SearchQuery) func(*SearchQuery) *SearchQuery { + return func(query *SearchQuery) *SearchQuery { + subQuery := query.Or() + for _, queryFunc := range queryFuncs { + queryFunc(subQuery) } - return factory + return subQuery + } +} + +func testSetAggregateTypes(types ...AggregateType) func(*SearchQuery) *SearchQuery { + return func(query *SearchQuery) *SearchQuery { + query = query.AggregateTypes(types...) + return query + } +} + +func testSetSequence(sequence uint64) func(*SearchQuery) *SearchQuery { + return func(query *SearchQuery) *SearchQuery { + query = query.SequenceGreater(sequence) + return query + } +} + +func testSetAggregateIDs(aggregateIDs ...string) func(*SearchQuery) *SearchQuery { + return func(query *SearchQuery) *SearchQuery { + query = query.AggregateIDs(aggregateIDs...) + return query + } +} + +func testSetEventTypes(eventTypes ...EventType) func(*SearchQuery) *SearchQuery { + return func(query *SearchQuery) *SearchQuery { + query = query.EventTypes(eventTypes...) + return query + } +} + +func testSetResourceOwner(resourceOwner string) func(*SearchQueryBuilder) *SearchQueryBuilder { + return func(builder *SearchQueryBuilder) *SearchQueryBuilder { + builder = builder.ResourceOwner(resourceOwner) + return builder + } +} + +func testSetSortOrder(asc bool) func(*SearchQueryBuilder) *SearchQueryBuilder { + return func(query *SearchQueryBuilder) *SearchQueryBuilder { + if asc { + query = query.OrderAsc() + } else { + query = query.OrderDesc() + } + return query } } func TestSearchQueryFactorySetters(t *testing.T) { type args struct { - columns Columns - aggregateTypes []AggregateType - setters []func(*SearchQueryBuilder) *SearchQueryBuilder + columns Columns + setters []func(*SearchQueryBuilder) *SearchQueryBuilder } tests := []struct { name string @@ -76,12 +102,10 @@ func TestSearchQueryFactorySetters(t *testing.T) { { name: "New factory", args: args{ - columns: ColumnsEvent, - aggregateTypes: []AggregateType{"user", "org"}, + columns: ColumnsEvent, }, res: &SearchQueryBuilder{ - columns: repository.Columns(ColumnsEvent), - aggregateTypes: []AggregateType{"user", "org"}, + columns: repository.Columns(ColumnsEvent), }, }, { @@ -105,28 +129,40 @@ func TestSearchQueryFactorySetters(t *testing.T) { { name: "set sequence", args: args{ - setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{testSetSequence(90)}, + setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{testAddQuery(testSetSequence(90))}, }, res: &SearchQueryBuilder{ - eventSequence: 90, + queries: []*SearchQuery{ + { + eventSequence: 90, + }, + }, }, }, { name: "set aggregateIDs", args: args{ - setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{testSetAggregateIDs("1235", "09824")}, + setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{testAddQuery(testSetAggregateIDs("1235", "09824"))}, }, res: &SearchQueryBuilder{ - aggregateIDs: []string{"1235", "09824"}, + queries: []*SearchQuery{ + { + aggregateIDs: []string{"1235", "09824"}, + }, + }, }, }, { name: "set eventTypes", args: args{ - setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{testSetEventTypes("user.created", "user.updated")}, + setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{testAddQuery(testSetEventTypes("user.created", "user.updated"))}, }, res: &SearchQueryBuilder{ - eventTypes: []EventType{"user.created", "user.updated"}, + queries: []*SearchQuery{ + { + eventTypes: []EventType{"user.created", "user.updated"}, + }, + }, }, }, { @@ -141,34 +177,35 @@ func TestSearchQueryFactorySetters(t *testing.T) { { name: "default search query", args: args{ - aggregateTypes: []AggregateType{"user"}, - setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{testSetAggregateIDs("1235", "024"), testSetSortOrder(false)}, + setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{testAddQuery(testSetAggregateTypes("user"), testSetAggregateIDs("1235", "024")), testSetSortOrder(false)}, }, res: &SearchQueryBuilder{ - aggregateTypes: []AggregateType{"user"}, - aggregateIDs: []string{"1235", "024"}, - desc: true, + desc: true, + queries: []*SearchQuery{ + { + aggregateTypes: []AggregateType{"user"}, + aggregateIDs: []string{"1235", "024"}, + }, + }, }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - factory := NewSearchQueryBuilder(tt.args.columns, tt.args.aggregateTypes...) + builder := NewSearchQueryBuilder(tt.args.columns) for _, setter := range tt.args.setters { - factory = setter(factory) - } - if !reflect.DeepEqual(factory, tt.res) { - t.Errorf("NewSearchQueryFactory() = %v, want %v", factory, tt.res) + builder = setter(builder) } + + assertBuilder(t, tt.res, builder) }) } } func TestSearchQueryFactoryBuild(t *testing.T) { type args struct { - columns Columns - aggregateTypes []AggregateType - setters []func(*SearchQueryBuilder) *SearchQueryBuilder + columns Columns + setters []func(*SearchQueryBuilder) *SearchQueryBuilder } type res struct { isErr func(err error) bool @@ -182,9 +219,8 @@ func TestSearchQueryFactoryBuild(t *testing.T) { { name: "no aggregate types", args: args{ - columns: ColumnsEvent, - aggregateTypes: []AggregateType{}, - setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{}, + columns: ColumnsEvent, + setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{}, }, res: res{ isErr: errors.IsPreconditionFailed, @@ -194,10 +230,10 @@ func TestSearchQueryFactoryBuild(t *testing.T) { { name: "invalid column (too low)", args: args{ - columns: ColumnsEvent, - aggregateTypes: []AggregateType{"user"}, + columns: ColumnsEvent, setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{ testSetColumns(Columns(-1)), + testAddQuery(testSetAggregateTypes("user")), }, }, res: res{ @@ -207,10 +243,10 @@ func TestSearchQueryFactoryBuild(t *testing.T) { { name: "invalid column (too high)", args: args{ - columns: ColumnsEvent, - aggregateTypes: []AggregateType{"user"}, + columns: ColumnsEvent, setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{ testSetColumns(math.MaxInt32), + testAddQuery(testSetAggregateTypes("uesr")), }, }, res: res{ @@ -220,9 +256,10 @@ func TestSearchQueryFactoryBuild(t *testing.T) { { name: "filter aggregate type", args: args{ - columns: ColumnsEvent, - aggregateTypes: []AggregateType{"user"}, - setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{}, + columns: ColumnsEvent, + setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{ + testAddQuery(testSetAggregateTypes("user")), + }, }, res: res{ isErr: nil, @@ -230,8 +267,10 @@ func TestSearchQueryFactoryBuild(t *testing.T) { Columns: repository.ColumnsEvent, Desc: false, Limit: 0, - Filters: []*repository.Filter{ - repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals), + Filters: [][]*repository.Filter{ + { + repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals), + }, }, }, }, @@ -239,9 +278,10 @@ func TestSearchQueryFactoryBuild(t *testing.T) { { name: "filter aggregate types", args: args{ - columns: ColumnsEvent, - aggregateTypes: []AggregateType{"user", "org"}, - setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{}, + columns: ColumnsEvent, + setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{ + testAddQuery(testSetAggregateTypes("user", "org")), + }, }, res: res{ isErr: nil, @@ -249,8 +289,10 @@ func TestSearchQueryFactoryBuild(t *testing.T) { Columns: repository.ColumnsEvent, Desc: false, Limit: 0, - Filters: []*repository.Filter{ - repository.NewFilter(repository.FieldAggregateType, []repository.AggregateType{"user", "org"}, repository.OperationIn), + Filters: [][]*repository.Filter{ + { + repository.NewFilter(repository.FieldAggregateType, []repository.AggregateType{"user", "org"}, repository.OperationIn), + }, }, }, }, @@ -258,12 +300,14 @@ func TestSearchQueryFactoryBuild(t *testing.T) { { name: "filter aggregate type, limit, desc", args: args{ - columns: ColumnsEvent, - aggregateTypes: []AggregateType{"user"}, + columns: ColumnsEvent, setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{ testSetLimit(5), testSetSortOrder(false), - testSetSequence(100), + testAddQuery( + testSetSequence(100), + testSetAggregateTypes("user"), + ), }, }, res: res{ @@ -272,9 +316,11 @@ func TestSearchQueryFactoryBuild(t *testing.T) { Columns: repository.ColumnsEvent, Desc: true, Limit: 5, - Filters: []*repository.Filter{ - repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals), - repository.NewFilter(repository.FieldSequence, uint64(100), repository.OperationLess), + Filters: [][]*repository.Filter{ + { + repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals), + repository.NewFilter(repository.FieldSequence, uint64(100), repository.OperationLess), + }, }, }, }, @@ -282,12 +328,14 @@ func TestSearchQueryFactoryBuild(t *testing.T) { { name: "filter aggregate type, limit, asc", args: args{ - columns: ColumnsEvent, - aggregateTypes: []AggregateType{"user"}, + columns: ColumnsEvent, setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{ testSetLimit(5), testSetSortOrder(true), - testSetSequence(100), + testAddQuery( + testSetSequence(100), + testSetAggregateTypes("user"), + ), }, }, res: res{ @@ -296,9 +344,11 @@ func TestSearchQueryFactoryBuild(t *testing.T) { Columns: repository.ColumnsEvent, Desc: false, Limit: 5, - Filters: []*repository.Filter{ - repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals), - repository.NewFilter(repository.FieldSequence, uint64(100), repository.OperationGreater), + Filters: [][]*repository.Filter{ + { + repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals), + repository.NewFilter(repository.FieldSequence, uint64(100), repository.OperationGreater), + }, }, }, }, @@ -306,13 +356,15 @@ func TestSearchQueryFactoryBuild(t *testing.T) { { name: "filter aggregate type, limit, desc, max event sequence cols", args: args{ - columns: ColumnsEvent, - aggregateTypes: []AggregateType{"user"}, + columns: ColumnsEvent, setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{ testSetLimit(5), testSetSortOrder(false), - testSetSequence(100), testSetColumns(repository.ColumnsMaxSequence), + testAddQuery( + testSetSequence(100), + testSetAggregateTypes("user"), + ), }, }, res: res{ @@ -321,9 +373,11 @@ func TestSearchQueryFactoryBuild(t *testing.T) { Columns: repository.ColumnsMaxSequence, Desc: true, Limit: 5, - Filters: []*repository.Filter{ - repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals), - repository.NewFilter(repository.FieldSequence, uint64(100), repository.OperationLess), + Filters: [][]*repository.Filter{ + { + repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals), + repository.NewFilter(repository.FieldSequence, uint64(100), repository.OperationLess), + }, }, }, }, @@ -331,10 +385,12 @@ func TestSearchQueryFactoryBuild(t *testing.T) { { name: "filter aggregate type and aggregate id", args: args{ - columns: ColumnsEvent, - aggregateTypes: []AggregateType{"user"}, + columns: ColumnsEvent, setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{ - testSetAggregateIDs("1234"), + testAddQuery( + testSetAggregateTypes("user"), + testSetAggregateIDs("1234"), + ), }, }, res: res{ @@ -343,9 +399,45 @@ func TestSearchQueryFactoryBuild(t *testing.T) { Columns: repository.ColumnsEvent, Desc: false, Limit: 0, - Filters: []*repository.Filter{ - repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals), - repository.NewFilter(repository.FieldAggregateID, "1234", repository.OperationEquals), + Filters: [][]*repository.Filter{ + { + repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals), + repository.NewFilter(repository.FieldAggregateID, "1234", repository.OperationEquals), + }, + }, + }, + }, + }, + { + name: "filter multiple aggregate type and aggregate id", + args: args{ + columns: ColumnsEvent, + setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{ + testAddQuery( + testSetAggregateTypes("user"), + testSetAggregateIDs("1234"), + testOr( + testSetAggregateTypes("org"), + testSetAggregateIDs("izu"), + ), + ), + }, + }, + res: res{ + isErr: nil, + query: &repository.SearchQuery{ + Columns: repository.ColumnsEvent, + Desc: false, + Limit: 0, + Filters: [][]*repository.Filter{ + { + repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals), + repository.NewFilter(repository.FieldAggregateID, "1234", repository.OperationEquals), + }, + { + repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("org"), repository.OperationEquals), + repository.NewFilter(repository.FieldAggregateID, "izu", repository.OperationEquals), + }, }, }, }, @@ -353,10 +445,12 @@ func TestSearchQueryFactoryBuild(t *testing.T) { { name: "filter aggregate type and aggregate ids", args: args{ - columns: ColumnsEvent, - aggregateTypes: []AggregateType{"user"}, + columns: ColumnsEvent, setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{ - testSetAggregateIDs("1234", "0815"), + testAddQuery( + testSetAggregateTypes("user"), + testSetAggregateIDs("1234", "0815"), + ), }, }, res: res{ @@ -365,9 +459,11 @@ func TestSearchQueryFactoryBuild(t *testing.T) { Columns: repository.ColumnsEvent, Desc: false, Limit: 0, - Filters: []*repository.Filter{ - repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals), - repository.NewFilter(repository.FieldAggregateID, []string{"1234", "0815"}, repository.OperationIn), + Filters: [][]*repository.Filter{ + { + repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals), + repository.NewFilter(repository.FieldAggregateID, []string{"1234", "0815"}, repository.OperationIn), + }, }, }, }, @@ -375,10 +471,12 @@ func TestSearchQueryFactoryBuild(t *testing.T) { { name: "filter aggregate type and sequence greater", args: args{ - columns: ColumnsEvent, - aggregateTypes: []AggregateType{"user"}, + columns: ColumnsEvent, setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{ - testSetSequence(8), + testAddQuery( + testSetAggregateTypes("user"), + testSetSequence(8), + ), }, }, res: res{ @@ -387,9 +485,11 @@ func TestSearchQueryFactoryBuild(t *testing.T) { Columns: repository.ColumnsEvent, Desc: false, Limit: 0, - Filters: []*repository.Filter{ - repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals), - repository.NewFilter(repository.FieldSequence, uint64(8), repository.OperationGreater), + Filters: [][]*repository.Filter{ + { + repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals), + repository.NewFilter(repository.FieldSequence, uint64(8), repository.OperationGreater), + }, }, }, }, @@ -397,10 +497,12 @@ func TestSearchQueryFactoryBuild(t *testing.T) { { name: "filter aggregate type and event type", args: args{ - columns: ColumnsEvent, - aggregateTypes: []AggregateType{"user"}, + columns: ColumnsEvent, setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{ - testSetEventTypes("user.created"), + testAddQuery( + testSetAggregateTypes("user"), + testSetEventTypes("user.created"), + ), }, }, res: res{ @@ -409,9 +511,11 @@ func TestSearchQueryFactoryBuild(t *testing.T) { Columns: repository.ColumnsEvent, Desc: false, Limit: 0, - Filters: []*repository.Filter{ - repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals), - repository.NewFilter(repository.FieldEventType, repository.EventType("user.created"), repository.OperationEquals), + Filters: [][]*repository.Filter{ + { + repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals), + repository.NewFilter(repository.FieldEventType, repository.EventType("user.created"), repository.OperationEquals), + }, }, }, }, @@ -419,10 +523,12 @@ func TestSearchQueryFactoryBuild(t *testing.T) { { name: "filter aggregate type and event types", args: args{ - columns: ColumnsEvent, - aggregateTypes: []AggregateType{"user"}, + columns: ColumnsEvent, setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{ - testSetEventTypes("user.created", "user.changed"), + testAddQuery( + testSetAggregateTypes("user"), + testSetEventTypes("user.created", "user.changed"), + ), }, }, res: res{ @@ -431,9 +537,11 @@ func TestSearchQueryFactoryBuild(t *testing.T) { Columns: repository.ColumnsEvent, Desc: false, Limit: 0, - Filters: []*repository.Filter{ - repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals), - repository.NewFilter(repository.FieldEventType, []repository.EventType{"user.created", "user.changed"}, repository.OperationIn), + Filters: [][]*repository.Filter{ + { + repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals), + repository.NewFilter(repository.FieldEventType, []repository.EventType{"user.created", "user.changed"}, repository.OperationIn), + }, }, }, }, @@ -441,10 +549,12 @@ func TestSearchQueryFactoryBuild(t *testing.T) { { name: "filter aggregate type resource owner", args: args{ - columns: ColumnsEvent, - aggregateTypes: []AggregateType{"user"}, + columns: ColumnsEvent, setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{ testSetResourceOwner("hodor"), + testAddQuery( + testSetAggregateTypes("user"), + ), }, }, res: res{ @@ -453,9 +563,11 @@ func TestSearchQueryFactoryBuild(t *testing.T) { Columns: repository.ColumnsEvent, Desc: false, Limit: 0, - Filters: []*repository.Filter{ - repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals), - repository.NewFilter(repository.FieldResourceOwner, "hodor", repository.OperationEquals), + Filters: [][]*repository.Filter{ + { + repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals), + repository.NewFilter(repository.FieldResourceOwner, "hodor", repository.OperationEquals), + }, }, }, }, @@ -463,8 +575,12 @@ func TestSearchQueryFactoryBuild(t *testing.T) { { name: "column invalid", args: args{ - columns: Columns(-1), - aggregateTypes: []AggregateType{"user"}, + columns: Columns(-1), + setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{ + testAddQuery( + testSetAggregateTypes("user"), + ), + }, }, res: res{ isErr: errors.IsPreconditionFailed, @@ -473,7 +589,7 @@ func TestSearchQueryFactoryBuild(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - factory := NewSearchQueryBuilder(tt.args.columns, tt.args.aggregateTypes...) + factory := NewSearchQueryBuilder(tt.args.columns) for _, f := range tt.args.setters { factory = f(factory) } @@ -487,9 +603,96 @@ func TestSearchQueryFactoryBuild(t *testing.T) { return } - if !reflect.DeepEqual(query, tt.res.query) { - t.Errorf("NewSearchQueryFactory() = %+v, want %+v", factory, tt.res.query) - } + assertRepoQuery(t, tt.res.query, query) }) } } + +func assertBuilder(t *testing.T, want, got *SearchQueryBuilder) { + t.Helper() + + if got.columns != want.columns { + t.Errorf("wrong column: got: %v want: %v", got.columns, want.columns) + } + if got.desc != want.desc { + t.Errorf("wrong desc: got: %v want: %v", got.desc, want.desc) + } + if got.limit != want.limit { + t.Errorf("wrong limit: got: %v want: %v", got.limit, want.limit) + } + if got.resourceOwner != want.resourceOwner { + t.Errorf("wrong : got: %v want: %v", got.resourceOwner, want.resourceOwner) + } + if len(got.queries) != len(want.queries) { + t.Errorf("wrong length of queries: got: %v want: %v", len(got.queries), len(want.queries)) + } + + for i, query := range got.queries { + assertQuery(t, i, want.queries[i], query) + } +} + +func assertQuery(t *testing.T, i int, want, got *SearchQuery) { + t.Helper() + + if !reflect.DeepEqual(got.aggregateIDs, want.aggregateIDs) { + t.Errorf("wrong aggregateIDs in query %d : got: %v want: %v", i, got.aggregateIDs, want.aggregateIDs) + } + if !reflect.DeepEqual(got.aggregateTypes, want.aggregateTypes) { + t.Errorf("wrong aggregateTypes in query %d : got: %v want: %v", i, got.aggregateTypes, want.aggregateTypes) + } + if !reflect.DeepEqual(got.eventData, want.eventData) { + t.Errorf("wrong eventData in query %d : got: %v want: %v", i, got.eventData, want.eventData) + } + if got.eventSequence != want.eventSequence { + t.Errorf("wrong eventSequence in query %d : got: %v want: %v", i, got.eventSequence, want.eventSequence) + } + if !reflect.DeepEqual(got.eventTypes, want.eventTypes) { + t.Errorf("wrong eventTypes in query %d : got: %v want: %v", i, got.eventTypes, want.eventTypes) + } +} + +func assertRepoQuery(t *testing.T, want, got *repository.SearchQuery) { + t.Helper() + + if want == nil && got == nil { + return + } + + if !reflect.DeepEqual(got.Columns, want.Columns) { + t.Errorf("wrong columns in query: got: %v want: %v", got.Columns, want.Columns) + } + if !reflect.DeepEqual(got.Desc, want.Desc) { + t.Errorf("wrong desc in query: got: %v want: %v", got.Desc, want.Desc) + } + if !reflect.DeepEqual(got.Limit, want.Limit) { + t.Errorf("wrong limit in query: got: %v want: %v", got.Limit, want.Limit) + } + + if len(got.Filters) != len(want.Filters) { + t.Errorf("wrong length of filters: got: %v want: %v", len(got.Filters), len(want.Filters)) + } + + for filterIdx, filter := range got.Filters { + if len(got.Filters) != len(want.Filters) { + t.Errorf("wrong length of subfilters: got: %v want: %v", len(filter), len(want.Filters[filterIdx])) + } + for subFilterIdx, f := range filter { + assertFilters(t, subFilterIdx, want.Filters[filterIdx][subFilterIdx], f) + } + } +} + +func assertFilters(t *testing.T, i int, want, got *repository.Filter) { + t.Helper() + + if want.Field != got.Field { + t.Errorf("wrong field in filter %d : got: %v want: %v", i, got.Field, want.Field) + } + if want.Operation != got.Operation { + t.Errorf("wrong operation in filter %d : got: %v want: %v", i, got.Operation, want.Operation) + } + if !reflect.DeepEqual(want.Value, got.Value) { + t.Errorf("wrong value in filter %d : got: %v want: %v", i, got.Value, want.Value) + } +} diff --git a/internal/eventstore/subscription.go b/internal/eventstore/subscription.go index 91d6d0b6be..13d26cb023 100644 --- a/internal/eventstore/subscription.go +++ b/internal/eventstore/subscription.go @@ -1,9 +1,10 @@ package eventstore import ( + "sync" + v1 "github.com/caos/zitadel/internal/eventstore/v1" "github.com/caos/zitadel/internal/eventstore/v1/models" - "sync" ) var ( diff --git a/internal/eventstore/unique_constraint.go b/internal/eventstore/unique_constraint.go index 54ce5d8302..d7593923db 100644 --- a/internal/eventstore/unique_constraint.go +++ b/internal/eventstore/unique_constraint.go @@ -16,8 +16,6 @@ type UniqueConstraintAction int32 const ( UniqueConstraintAdd UniqueConstraintAction = iota UniqueConstraintRemove - - uniqueConstraintActionCount ) func NewAddEventUniqueConstraint( diff --git a/internal/key/repository/view/query.go b/internal/key/repository/view/query.go index c066484186..435c276a3e 100644 --- a/internal/key/repository/view/query.go +++ b/internal/key/repository/view/query.go @@ -7,7 +7,10 @@ import ( ) func KeyPairQuery(latestSequence uint64) *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). + AddQuery(). + AggregateTypes(iam.AggregateType). SequenceGreater(latestSequence). - EventTypes(keypair.AddedEventType) + EventTypes(keypair.AddedEventType). + Builder() } diff --git a/internal/query/iam_idp_config_model.go b/internal/query/iam_idp_config_model.go index c9a80c01ec..fa4b75ad89 100644 --- a/internal/query/iam_idp_config_model.go +++ b/internal/query/iam_idp_config_model.go @@ -41,9 +41,11 @@ func (rm *IAMIDPConfigReadModel) AppendEvents(events ...eventstore.EventReader) } func (rm *IAMIDPConfigReadModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). + AddQuery(). + AggregateTypes(iam.AggregateType). AggregateIDs(rm.iamID). EventData(map[string]interface{}{ "idpConfigId": rm.configID, - }) + }).Builder() } diff --git a/internal/query/iam_member_model.go b/internal/query/iam_member_model.go index bf59ab4a1f..22aaa5d9d1 100644 --- a/internal/query/iam_member_model.go +++ b/internal/query/iam_member_model.go @@ -35,9 +35,11 @@ func (rm *IAMMemberReadModel) AppendEvents(events ...eventstore.EventReader) { } func (rm *IAMMemberReadModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). + AddQuery(). + AggregateTypes(iam.AggregateType). AggregateIDs(rm.iamID). EventData(map[string]interface{}{ "userId": rm.userID, - }) + }).Builder() } diff --git a/internal/query/iam_model.go b/internal/query/iam_model.go index ab5af737fc..ced701c2c4 100644 --- a/internal/query/iam_model.go +++ b/internal/query/iam_model.go @@ -128,5 +128,9 @@ func (rm *ReadModel) AppendAndReduce(events ...eventstore.EventReader) error { } func (rm *ReadModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType).AggregateIDs(rm.AggregateID) + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). + AddQuery(). + AggregateTypes(iam.AggregateType). + AggregateIDs(rm.AggregateID). + Builder() } diff --git a/internal/query/user_model.go b/internal/query/user_model.go index fd66096d9e..d3e91f55d1 100644 --- a/internal/query/user_model.go +++ b/internal/query/user_model.go @@ -49,10 +49,19 @@ func (rm *UserReadModel) AppendAndReduce(events ...eventstore.EventReader) error } func (rm *UserReadModel) Query() *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType).AggregateIDs(rm.AggregateID) + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). + AddQuery(). + AggregateTypes(user.AggregateType). + AggregateIDs(rm.AggregateID). + Builder() } func NewUserEventSearchQuery(userID, orgID string, sequence uint64) *eventstore.SearchQueryBuilder { - return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType). - AggregateIDs(userID).ResourceOwner(orgID).SequenceGreater(sequence) + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). + ResourceOwner(orgID). + AddQuery(). + AggregateTypes(user.AggregateType). + AggregateIDs(userID). + SequenceGreater(sequence). + Builder() }