fix(eventstore): sub queries (#1805)

* sub queries

* fix: tests

* add builder to tests

* new search query

* rename searchquerybuilder to builder

* remove comment from code

* test with multiple queries

* add filters test

* fix(contibute): listing

* add validate module

* fix: search queries

* remove unused event type in query

* ignore query if error in marshal

* go mod tidy

* update privacy policy query

* update queries

Co-authored-by: Livio Amstutz <livio.a@gmail.com>
This commit is contained in:
Silvan 2021-07-06 13:55:57 +02:00 committed by GitHub
parent 0e472a347f
commit 5349d96ce4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
85 changed files with 1258 additions and 686 deletions

View File

@ -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. 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. Make sure you use semantic release:
feat: New Feature
fix: Bug Fix * feat: New Feature
docs: Documentation * fix: Bug Fix
* docs: Documentation
## Want to start ZITADEL? ## Want to start ZITADEL?

View File

@ -42,14 +42,15 @@ For example, **ZITADEL** is event sourced but it does not rely on a pub/sub syst
### Self-Managed ### Self-Managed
You can run an automatically operated **ZITADEL** instance on a CNCF compliant Kubernetes cluster of your choice: 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) * [CRD Mode on an existing k8s cluster](https://docs.zitadel.ch/docs/guides/installation/crd)
- [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) * [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 ### 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 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 Enterprise:** We operate and support a private instance of **ZITADEL** for you. [Get in touch!](https://zitadel.ch/contact/)
## Start using ZITADEL ## 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). 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 ### Client libraries
* [Go](https://github.com/caos/zitadel-go) client library * [Go](https://github.com/caos/zitadel-go) client library
* [.NET](https://github.com/caos/zitadel-net) client library * [.NET](https://github.com/caos/zitadel-net) client library
* [Dart](https://github.com/caos/zitadel-dart) 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 ## Showcase
### Passwordless Login ### 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): 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 * works on all modern platforms, devices, and browsers
- requires only one gesture by the user * phishing resistant alternative
- easy [enrollment](https://docs.zitadel.ch/docs/manuals/user-factors) of the device during registration * 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-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) ![passwordless-iphone](https://user-images.githubusercontent.com/1366906/118765439-5fa3f180-b87b-11eb-937b-b4acb7854086.gif)
### Admin Console ### 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. 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 Register new applications

View File

@ -42,13 +42,14 @@ func (rm *ExistingLabelPoliciesReadModel) Reduce() error {
} }
func (rm *ExistingLabelPoliciesReadModel) Query() *eventstore.SearchQueryBuilder { func (rm *ExistingLabelPoliciesReadModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder( return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
eventstore.ColumnsEvent, AddQuery().
iam.AggregateType, AggregateTypes(iam.AggregateType).
org.AggregateType). EventTypes(iam.LabelPolicyAddedEventType).
Or().
AggregateTypes(org.AggregateType).
EventTypes( EventTypes(
iam.LabelPolicyAddedEventType,
org.LabelPolicyAddedEventType, org.LabelPolicyAddedEventType,
org.LabelPolicyRemovedEventType, org.LabelPolicyRemovedEventType).
) Builder()
} }

View File

@ -40,10 +40,13 @@ func (wm *IAMCustomLoginTextReadModel) Reduce() error {
} }
func (wm *IAMCustomLoginTextReadModel) Query() *eventstore.SearchQueryBuilder { func (wm *IAMCustomLoginTextReadModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.CustomLoginTextReadModel.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateIDs(wm.CustomLoginTextReadModel.AggregateID).
AggregateTypes(iam.AggregateType).
EventTypes( EventTypes(
iam.CustomTextSetEventType, iam.CustomTextSetEventType,
iam.CustomTextRemovedEventType) iam.CustomTextRemovedEventType).
Builder()
} }

View File

@ -39,9 +39,11 @@ func (wm *IAMCustomMessageTextReadModel) Reduce() error {
} }
func (wm *IAMCustomMessageTextReadModel) Query() *eventstore.SearchQueryBuilder { func (wm *IAMCustomMessageTextReadModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.CustomMessageTextReadModel.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
EventTypes( AddQuery().
iam.CustomTextSetEventType) AggregateTypes(iam.AggregateType).
AggregateIDs(wm.CustomMessageTextReadModel.AggregateID).
EventTypes(iam.CustomTextSetEventType).
Builder()
} }

View File

@ -39,9 +39,12 @@ func (wm *IAMCustomTextWriteModel) Reduce() error {
} }
func (wm *IAMCustomTextWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *IAMCustomTextWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.CustomTextWriteModel.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateIDs(wm.CustomTextWriteModel.AggregateID).
AggregateTypes(iam.AggregateType).
EventTypes( EventTypes(
iam.CustomTextSetEventType) iam.CustomTextSetEventType).
Builder()
} }

View File

@ -43,10 +43,12 @@ func (wm *IAMFeaturesWriteModel) Reduce() error {
} }
func (wm *IAMFeaturesWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *IAMFeaturesWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.FeaturesWriteModel.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
EventTypes(iam.FeaturesSetEventType) AddQuery().
EventTypes(iam.FeaturesSetEventType).
AggregateTypes(iam.AggregateType).
Builder()
} }
func (wm *IAMFeaturesWriteModel) NewSetEvent( func (wm *IAMFeaturesWriteModel) NewSetEvent(

View File

@ -2,6 +2,7 @@ package command
import ( import (
"context" "context"
"github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/eventstore"
"github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/domain"
@ -26,9 +27,11 @@ func NewIAMIDPConfigWriteModel(configID string) *IAMIDPConfigWriteModel {
} }
func (wm *IAMIDPConfigWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *IAMIDPConfigWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(iam.AggregateType).
AggregateIDs(wm.AggregateID).
EventTypes( EventTypes(
iam.IDPConfigAddedEventType, iam.IDPConfigAddedEventType,
iam.IDPConfigChangedEventType, iam.IDPConfigChangedEventType,
@ -36,8 +39,8 @@ func (wm *IAMIDPConfigWriteModel) Query() *eventstore.SearchQueryBuilder {
iam.IDPConfigReactivatedEventType, iam.IDPConfigReactivatedEventType,
iam.IDPConfigRemovedEventType, iam.IDPConfigRemovedEventType,
iam.IDPOIDCConfigAddedEventType, iam.IDPOIDCConfigAddedEventType,
iam.IDPOIDCConfigChangedEventType, iam.IDPOIDCConfigChangedEventType).
) Builder()
} }
func (wm *IAMIDPConfigWriteModel) AppendEvents(events ...eventstore.EventReader) { func (wm *IAMIDPConfigWriteModel) AppendEvents(events ...eventstore.EventReader) {

View File

@ -2,9 +2,10 @@ package command
import ( import (
"context" "context"
"github.com/caos/zitadel/internal/eventstore"
"reflect" "reflect"
"github.com/caos/zitadel/internal/eventstore"
"github.com/caos/zitadel/internal/crypto" "github.com/caos/zitadel/internal/crypto"
"github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/domain"
"github.com/caos/zitadel/internal/repository/iam" "github.com/caos/zitadel/internal/repository/iam"
@ -69,15 +70,18 @@ func (wm *IAMIDPOIDCConfigWriteModel) Reduce() error {
} }
func (wm *IAMIDPOIDCConfigWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *IAMIDPOIDCConfigWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(iam.AggregateType).
AggregateIDs(wm.AggregateID).
EventTypes( EventTypes(
iam.IDPOIDCConfigAddedEventType, iam.IDPOIDCConfigAddedEventType,
iam.IDPOIDCConfigChangedEventType, iam.IDPOIDCConfigChangedEventType,
iam.IDPConfigReactivatedEventType, iam.IDPConfigReactivatedEventType,
iam.IDPConfigDeactivatedEventType, iam.IDPConfigDeactivatedEventType,
iam.IDPConfigRemovedEventType) iam.IDPConfigRemovedEventType).
Builder()
} }
func (wm *IAMIDPOIDCConfigWriteModel) NewChangedEvent( func (wm *IAMIDPOIDCConfigWriteModel) NewChangedEvent(

View File

@ -54,12 +54,15 @@ func (wm *IAMMemberWriteModel) Reduce() error {
} }
func (wm *IAMMemberWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *IAMMemberWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.MemberWriteModel.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(iam.AggregateType).
AggregateIDs(wm.MemberWriteModel.AggregateID).
EventTypes( EventTypes(
iam.MemberAddedEventType, iam.MemberAddedEventType,
iam.MemberChangedEventType, iam.MemberChangedEventType,
iam.MemberRemovedEventType, iam.MemberRemovedEventType,
iam.MemberCascadeRemovedEventType) iam.MemberCascadeRemovedEventType).
Builder()
} }

View File

@ -44,14 +44,17 @@ func (wm *IAMWriteModel) Reduce() error {
} }
func (wm *IAMWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *IAMWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(iam.AggregateType).
AggregateIDs(wm.AggregateID).
EventTypes( EventTypes(
iam.ProjectSetEventType, iam.ProjectSetEventType,
iam.GlobalOrgSetEventType, iam.GlobalOrgSetEventType,
iam.SetupStartedEventType, iam.SetupStartedEventType,
iam.SetupDoneEventType) iam.SetupDoneEventType).
Builder()
} }
func IAMAggregateFromWriteModel(wm *eventstore.WriteModel) *eventstore.Aggregate { func IAMAggregateFromWriteModel(wm *eventstore.WriteModel) *eventstore.Aggregate {

View File

@ -62,9 +62,11 @@ func (wm *IAMLabelPolicyWriteModel) Reduce() error {
} }
func (wm *IAMLabelPolicyWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *IAMLabelPolicyWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.LabelPolicyWriteModel.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(iam.AggregateType).
AggregateIDs(wm.LabelPolicyWriteModel.AggregateID).
EventTypes( EventTypes(
iam.LabelPolicyAddedEventType, iam.LabelPolicyAddedEventType,
iam.LabelPolicyChangedEventType, iam.LabelPolicyChangedEventType,
@ -77,8 +79,8 @@ func (wm *IAMLabelPolicyWriteModel) Query() *eventstore.SearchQueryBuilder {
iam.LabelPolicyIconDarkAddedEventType, iam.LabelPolicyIconDarkAddedEventType,
iam.LabelPolicyIconDarkRemovedEventType, iam.LabelPolicyIconDarkRemovedEventType,
iam.LabelPolicyFontAddedEventType, iam.LabelPolicyFontAddedEventType,
iam.LabelPolicyFontRemovedEventType, iam.LabelPolicyFontRemovedEventType).
) Builder()
} }
func (wm *IAMLabelPolicyWriteModel) NewChangedEvent( func (wm *IAMLabelPolicyWriteModel) NewChangedEvent(

View File

@ -42,12 +42,15 @@ func (wm *IAMSecondFactorWriteModel) Reduce() error {
} }
func (wm *IAMSecondFactorWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *IAMSecondFactorWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.WriteModel.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(iam.AggregateType).
AggregateIDs(wm.WriteModel.AggregateID).
EventTypes( EventTypes(
iam.LoginPolicySecondFactorAddedEventType, iam.LoginPolicySecondFactorAddedEventType,
iam.LoginPolicySecondFactorRemovedEventType) iam.LoginPolicySecondFactorRemovedEventType).
Builder()
} }
type IAMMultiFactorWriteModel struct { type IAMMultiFactorWriteModel struct {
@ -86,10 +89,13 @@ func (wm *IAMMultiFactorWriteModel) Reduce() error {
} }
func (wm *IAMMultiFactorWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *IAMMultiFactorWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.WriteModel.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(iam.AggregateType).
AggregateIDs(wm.WriteModel.AggregateID).
EventTypes( EventTypes(
iam.LoginPolicyMultiFactorAddedEventType, iam.LoginPolicyMultiFactorAddedEventType,
iam.LoginPolicyMultiFactorRemovedEventType) iam.LoginPolicyMultiFactorRemovedEventType).
Builder()
} }

View File

@ -44,7 +44,10 @@ func (wm *IAMIdentityProviderWriteModel) Reduce() error {
} }
func (wm *IAMIdentityProviderWriteModel) Query() *eventstore.SearchQueryBuilder { 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). AggregateIDs(wm.AggregateID).
ResourceOwner(wm.ResourceOwner) Builder()
} }

View File

@ -2,6 +2,7 @@ package command
import ( import (
"context" "context"
"github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/eventstore"
"github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/domain"
@ -44,12 +45,15 @@ func (wm *IAMLoginPolicyWriteModel) Reduce() error {
} }
func (wm *IAMLoginPolicyWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *IAMLoginPolicyWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.LoginPolicyWriteModel.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(iam.AggregateType).
AggregateIDs(wm.LoginPolicyWriteModel.AggregateID).
EventTypes( EventTypes(
iam.LoginPolicyAddedEventType, iam.LoginPolicyAddedEventType,
iam.LoginPolicyChangedEventType) iam.LoginPolicyChangedEventType).
Builder()
} }
func (wm *IAMLoginPolicyWriteModel) NewChangedEvent( func (wm *IAMLoginPolicyWriteModel) NewChangedEvent(

View File

@ -2,9 +2,10 @@ package command
import ( import (
"context" "context"
"github.com/caos/zitadel/internal/eventstore"
"reflect" "reflect"
"github.com/caos/zitadel/internal/eventstore"
"github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/domain"
"github.com/caos/zitadel/internal/repository/iam" "github.com/caos/zitadel/internal/repository/iam"
"github.com/caos/zitadel/internal/repository/policy" "github.com/caos/zitadel/internal/repository/policy"
@ -41,12 +42,15 @@ func (wm *IAMMailTemplateWriteModel) Reduce() error {
} }
func (wm *IAMMailTemplateWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *IAMMailTemplateWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.MailTemplateWriteModel.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(iam.AggregateType).
AggregateIDs(wm.MailTemplateWriteModel.AggregateID).
EventTypes( EventTypes(
iam.MailTemplateAddedEventType, iam.MailTemplateAddedEventType,
iam.MailTemplateChangedEventType) iam.MailTemplateChangedEventType).
Builder()
} }
func (wm *IAMMailTemplateWriteModel) NewChangedEvent( func (wm *IAMMailTemplateWriteModel) NewChangedEvent(

View File

@ -2,6 +2,7 @@ package command
import ( import (
"context" "context"
"github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/eventstore"
"github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/domain"
@ -40,12 +41,15 @@ func (wm *IAMOrgIAMPolicyWriteModel) Reduce() error {
} }
func (wm *IAMOrgIAMPolicyWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *IAMOrgIAMPolicyWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.PolicyOrgIAMWriteModel.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(iam.AggregateType).
AggregateIDs(wm.PolicyOrgIAMWriteModel.AggregateID).
EventTypes( EventTypes(
iam.OrgIAMPolicyAddedEventType, iam.OrgIAMPolicyAddedEventType,
iam.OrgIAMPolicyChangedEventType) iam.OrgIAMPolicyChangedEventType).
Builder()
} }
func (wm *IAMOrgIAMPolicyWriteModel) NewChangedEvent( func (wm *IAMOrgIAMPolicyWriteModel) NewChangedEvent(

View File

@ -2,6 +2,7 @@ package command
import ( import (
"context" "context"
"github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/eventstore"
"github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/domain"
@ -40,12 +41,15 @@ func (wm *IAMPasswordAgePolicyWriteModel) Reduce() error {
} }
func (wm *IAMPasswordAgePolicyWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *IAMPasswordAgePolicyWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.PasswordAgePolicyWriteModel.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(iam.AggregateType).
AggregateIDs(wm.PasswordAgePolicyWriteModel.AggregateID).
EventTypes( EventTypes(
iam.PasswordAgePolicyAddedEventType, iam.PasswordAgePolicyAddedEventType,
iam.PasswordAgePolicyChangedEventType) iam.PasswordAgePolicyChangedEventType).
Builder()
} }
func (wm *IAMPasswordAgePolicyWriteModel) NewChangedEvent( func (wm *IAMPasswordAgePolicyWriteModel) NewChangedEvent(

View File

@ -2,6 +2,7 @@ package command
import ( import (
"context" "context"
"github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/eventstore"
"github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/domain"
@ -40,12 +41,15 @@ func (wm *IAMPasswordComplexityPolicyWriteModel) Reduce() error {
} }
func (wm *IAMPasswordComplexityPolicyWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *IAMPasswordComplexityPolicyWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.PasswordComplexityPolicyWriteModel.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(iam.AggregateType).
AggregateIDs(wm.PasswordComplexityPolicyWriteModel.AggregateID).
EventTypes( EventTypes(
iam.PasswordComplexityPolicyAddedEventType, iam.PasswordComplexityPolicyAddedEventType,
iam.PasswordComplexityPolicyChangedEventType) iam.PasswordComplexityPolicyChangedEventType).
Builder()
} }
func (wm *IAMPasswordComplexityPolicyWriteModel) NewChangedEvent( func (wm *IAMPasswordComplexityPolicyWriteModel) NewChangedEvent(

View File

@ -2,6 +2,7 @@ package command
import ( import (
"context" "context"
"github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/eventstore"
"github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/domain"
@ -40,12 +41,15 @@ func (wm *IAMPasswordLockoutPolicyWriteModel) Reduce() error {
} }
func (wm *IAMPasswordLockoutPolicyWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *IAMPasswordLockoutPolicyWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.PasswordLockoutPolicyWriteModel.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(iam.AggregateType).
AggregateIDs(wm.PasswordLockoutPolicyWriteModel.AggregateID).
EventTypes( EventTypes(
iam.PasswordLockoutPolicyAddedEventType, iam.PasswordLockoutPolicyAddedEventType,
iam.PasswordLockoutPolicyChangedEventType) iam.PasswordLockoutPolicyChangedEventType).
Builder()
} }
func (wm *IAMPasswordLockoutPolicyWriteModel) NewChangedEvent( func (wm *IAMPasswordLockoutPolicyWriteModel) NewChangedEvent(

View File

@ -2,6 +2,7 @@ package command
import ( import (
"context" "context"
"github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/eventstore"
"github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/domain"
@ -40,12 +41,15 @@ func (wm *IAMPrivacyPolicyWriteModel) Reduce() error {
} }
func (wm *IAMPrivacyPolicyWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *IAMPrivacyPolicyWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.PrivacyPolicyWriteModel.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(iam.AggregateType).
AggregateIDs(wm.PrivacyPolicyWriteModel.AggregateID).
EventTypes( EventTypes(
iam.PrivacyPolicyAddedEventType, iam.PrivacyPolicyAddedEventType,
iam.PrivacyPolicyChangedEventType) iam.PrivacyPolicyChangedEventType).
Builder()
} }
func (wm *IAMPrivacyPolicyWriteModel) NewChangedEvent( func (wm *IAMPrivacyPolicyWriteModel) NewChangedEvent(

View File

@ -49,10 +49,13 @@ func (wm *KeyPairWriteModel) Reduce() error {
} }
func (wm *KeyPairWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *KeyPairWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, project.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
EventTypes(keypair.AddedEventType) AddQuery().
AggregateTypes(project.AggregateType).
AggregateIDs(wm.AggregateID).
EventTypes(keypair.AddedEventType).
Builder()
} }
func KeyPairAggregateFromWriteModel(wm *eventstore.WriteModel) *eventstore.Aggregate { func KeyPairAggregateFromWriteModel(wm *eventstore.WriteModel) *eventstore.Aggregate {

View File

@ -81,12 +81,14 @@ func (repo *testRepo) Filter(ctx context.Context, searchQuery *repository.Search
events := make([]*repository.Event, 0, len(repo.events)) events := make([]*repository.Event, 0, len(repo.events))
for _, event := range repo.events { for _, event := range repo.events {
for _, filter := range searchQuery.Filters { for _, filter := range searchQuery.Filters {
if filter.Field == repository.FieldAggregateType { for _, f := range filter {
if event.AggregateType != filter.Value { if f.Field == repository.FieldAggregateType {
if event.AggregateType != f.Value {
continue continue
} }
} }
} }
}
events = append(events, event) events = append(events, event)
} }
return repo.events, nil return repo.events, nil

View File

@ -41,11 +41,14 @@ func (wm *OrgCustomLoginTextReadModel) Reduce() error {
} }
func (wm *OrgCustomLoginTextReadModel) Query() *eventstore.SearchQueryBuilder { func (wm *OrgCustomLoginTextReadModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.CustomLoginTextReadModel.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateIDs(wm.CustomLoginTextReadModel.AggregateID).
AggregateTypes(org.AggregateType).
EventTypes( EventTypes(
org.CustomTextSetEventType, org.CustomTextSetEventType,
org.CustomTextRemovedEventType, org.CustomTextRemovedEventType,
org.CustomTextTemplateRemovedEventType) org.CustomTextTemplateRemovedEventType).
Builder()
} }

View File

@ -42,13 +42,16 @@ func (wm *OrgCustomMessageTextReadModel) Reduce() error {
} }
func (wm *OrgCustomMessageTextReadModel) Query() *eventstore.SearchQueryBuilder { func (wm *OrgCustomMessageTextReadModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.CustomMessageTextReadModel.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(org.AggregateType).
AggregateIDs(wm.CustomMessageTextReadModel.AggregateID).
EventTypes( EventTypes(
org.CustomTextSetEventType, org.CustomTextSetEventType,
org.CustomTextRemovedEventType, org.CustomTextRemovedEventType,
org.CustomTextTemplateRemovedEventType) org.CustomTextTemplateRemovedEventType).
Builder()
} }
type OrgCustomMessageTemplatesReadModel struct { type OrgCustomMessageTemplatesReadModel struct {
@ -85,11 +88,14 @@ func (wm *OrgCustomMessageTemplatesReadModel) Reduce() error {
} }
func (wm *OrgCustomMessageTemplatesReadModel) Query() *eventstore.SearchQueryBuilder { func (wm *OrgCustomMessageTemplatesReadModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.CustomMessageTemplatesReadModel.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(org.AggregateType).
AggregateIDs(wm.CustomMessageTemplatesReadModel.AggregateID).
EventTypes( EventTypes(
org.CustomTextSetEventType, org.CustomTextSetEventType,
org.CustomTextRemovedEventType, org.CustomTextRemovedEventType,
org.CustomTextTemplateRemovedEventType) org.CustomTextTemplateRemovedEventType).
Builder()
} }

View File

@ -84,16 +84,19 @@ func (wm *OrgDomainWriteModel) Reduce() error {
} }
func (wm *OrgDomainWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *OrgDomainWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(org.AggregateType).
AggregateIDs(wm.AggregateID).
EventTypes( EventTypes(
org.OrgDomainAddedEventType, org.OrgDomainAddedEventType,
org.OrgDomainVerifiedEventType, org.OrgDomainVerifiedEventType,
org.OrgDomainVerificationAddedEventType, org.OrgDomainVerificationAddedEventType,
org.OrgDomainVerifiedEventType, org.OrgDomainVerifiedEventType,
org.OrgDomainPrimarySetEventType, org.OrgDomainPrimarySetEventType,
org.OrgDomainRemovedEventType) org.OrgDomainRemovedEventType).
Builder()
} }
type OrgDomainsWriteModel struct { type OrgDomainsWriteModel struct {
@ -151,9 +154,11 @@ func (wm *OrgDomainsWriteModel) Reduce() error {
} }
func (wm *OrgDomainsWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *OrgDomainsWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(org.AggregateType).
AggregateIDs(wm.AggregateID).
EventTypes( EventTypes(
org.OrgAddedEventType, org.OrgAddedEventType,
org.OrgChangedEventType, org.OrgChangedEventType,
@ -162,5 +167,6 @@ func (wm *OrgDomainsWriteModel) Query() *eventstore.SearchQueryBuilder {
org.OrgDomainVerificationAddedEventType, org.OrgDomainVerificationAddedEventType,
org.OrgDomainVerifiedEventType, org.OrgDomainVerifiedEventType,
org.OrgDomainPrimarySetEventType, org.OrgDomainPrimarySetEventType,
org.OrgDomainRemovedEventType) org.OrgDomainRemovedEventType).
Builder()
} }

View File

@ -45,13 +45,15 @@ func (wm *OrgFeaturesWriteModel) Reduce() error {
} }
func (wm *OrgFeaturesWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *OrgFeaturesWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.FeaturesWriteModel.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(org.AggregateType).
AggregateIDs(wm.FeaturesWriteModel.AggregateID).
EventTypes( EventTypes(
org.FeaturesSetEventType, org.FeaturesSetEventType,
org.FeaturesRemovedEventType, org.FeaturesRemovedEventType).
) Builder()
} }
func (wm *OrgFeaturesWriteModel) NewSetEvent( func (wm *OrgFeaturesWriteModel) NewSetEvent(

View File

@ -2,6 +2,7 @@ package command
import ( import (
"context" "context"
"github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/eventstore"
"github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/domain"
@ -26,9 +27,11 @@ func NewOrgIDPConfigWriteModel(configID, orgID string) *OrgIDPConfigWriteModel {
} }
func (wm *OrgIDPConfigWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *OrgIDPConfigWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(org.AggregateType).
AggregateIDs(wm.AggregateID).
EventTypes( EventTypes(
org.IDPConfigAddedEventType, org.IDPConfigAddedEventType,
org.IDPConfigChangedEventType, org.IDPConfigChangedEventType,
@ -36,7 +39,8 @@ func (wm *OrgIDPConfigWriteModel) Query() *eventstore.SearchQueryBuilder {
org.IDPConfigReactivatedEventType, org.IDPConfigReactivatedEventType,
org.IDPConfigRemovedEventType, org.IDPConfigRemovedEventType,
org.IDPOIDCConfigAddedEventType, org.IDPOIDCConfigAddedEventType,
org.IDPOIDCConfigChangedEventType) org.IDPOIDCConfigChangedEventType).
Builder()
} }
func (wm *OrgIDPConfigWriteModel) AppendEvents(events ...eventstore.EventReader) { func (wm *OrgIDPConfigWriteModel) AppendEvents(events ...eventstore.EventReader) {

View File

@ -2,9 +2,10 @@ package command
import ( import (
"context" "context"
"github.com/caos/zitadel/internal/eventstore"
"reflect" "reflect"
"github.com/caos/zitadel/internal/eventstore"
"github.com/caos/zitadel/internal/crypto" "github.com/caos/zitadel/internal/crypto"
"github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/domain"
"github.com/caos/zitadel/internal/repository/idpconfig" "github.com/caos/zitadel/internal/repository/idpconfig"
@ -69,15 +70,18 @@ func (wm *IDPOIDCConfigWriteModel) Reduce() error {
} }
func (wm *IDPOIDCConfigWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *IDPOIDCConfigWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(org.AggregateType).
AggregateIDs(wm.AggregateID).
EventTypes( EventTypes(
org.IDPOIDCConfigAddedEventType, org.IDPOIDCConfigAddedEventType,
org.IDPOIDCConfigChangedEventType, org.IDPOIDCConfigChangedEventType,
org.IDPConfigReactivatedEventType, org.IDPConfigReactivatedEventType,
org.IDPConfigDeactivatedEventType, org.IDPConfigDeactivatedEventType,
org.IDPConfigRemovedEventType) org.IDPConfigRemovedEventType).
Builder()
} }
func (wm *IDPOIDCConfigWriteModel) NewChangedEvent( func (wm *IDPOIDCConfigWriteModel) NewChangedEvent(

View File

@ -53,12 +53,15 @@ func (wm *OrgMemberWriteModel) Reduce() error {
} }
func (wm *OrgMemberWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *OrgMemberWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.MemberWriteModel.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(org.AggregateType).
AggregateIDs(wm.MemberWriteModel.AggregateID).
EventTypes( EventTypes(
org.MemberAddedEventType, org.MemberAddedEventType,
org.MemberChangedEventType, org.MemberChangedEventType,
org.MemberRemovedEventType, org.MemberRemovedEventType,
org.MemberCascadeRemovedEventType) org.MemberCascadeRemovedEventType).
Builder()
} }

View File

@ -43,13 +43,16 @@ func (wm *OrgWriteModel) Reduce() error {
} }
func (wm *OrgWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *OrgWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(org.AggregateType).
AggregateIDs(wm.AggregateID).
EventTypes( EventTypes(
org.OrgAddedEventType, org.OrgAddedEventType,
org.OrgChangedEventType, org.OrgChangedEventType,
org.OrgDomainPrimarySetEventType) org.OrgDomainPrimarySetEventType).
Builder()
} }
func OrgAggregateFromWriteModel(wm *eventstore.WriteModel) *eventstore.Aggregate { func OrgAggregateFromWriteModel(wm *eventstore.WriteModel) *eventstore.Aggregate {

View File

@ -2,6 +2,7 @@ package command
import ( import (
"context" "context"
"github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/eventstore"
"github.com/caos/zitadel/internal/repository/org" "github.com/caos/zitadel/internal/repository/org"
@ -61,9 +62,11 @@ func (wm *OrgLabelPolicyWriteModel) Reduce() error {
} }
func (wm *OrgLabelPolicyWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *OrgLabelPolicyWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.LabelPolicyWriteModel.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(org.AggregateType).
AggregateIDs(wm.LabelPolicyWriteModel.AggregateID).
EventTypes( EventTypes(
org.LabelPolicyAddedEventType, org.LabelPolicyAddedEventType,
org.LabelPolicyChangedEventType, org.LabelPolicyChangedEventType,
@ -77,8 +80,8 @@ func (wm *OrgLabelPolicyWriteModel) Query() *eventstore.SearchQueryBuilder {
org.LabelPolicyIconDarkAddedEventType, org.LabelPolicyIconDarkAddedEventType,
org.LabelPolicyIconDarkRemovedEventType, org.LabelPolicyIconDarkRemovedEventType,
org.LabelPolicyFontAddedEventType, org.LabelPolicyFontAddedEventType,
org.LabelPolicyFontRemovedEventType, org.LabelPolicyFontRemovedEventType).
) Builder()
} }
func (wm *OrgLabelPolicyWriteModel) NewChangedEvent( func (wm *OrgLabelPolicyWriteModel) NewChangedEvent(

View File

@ -43,12 +43,15 @@ func (wm *OrgSecondFactorWriteModel) Reduce() error {
} }
func (wm *OrgSecondFactorWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *OrgSecondFactorWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.WriteModel.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(org.AggregateType).
AggregateIDs(wm.WriteModel.AggregateID).
EventTypes( EventTypes(
org.LoginPolicySecondFactorAddedEventType, org.LoginPolicySecondFactorAddedEventType,
org.LoginPolicySecondFactorRemovedEventType) org.LoginPolicySecondFactorRemovedEventType).
Builder()
} }
type OrgMultiFactorWriteModel struct { type OrgMultiFactorWriteModel struct {
@ -87,12 +90,15 @@ func (wm *OrgMultiFactorWriteModel) Reduce() error {
} }
func (wm *OrgMultiFactorWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *OrgMultiFactorWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.WriteModel.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(org.AggregateType).
AggregateIDs(wm.WriteModel.AggregateID).
EventTypes( EventTypes(
org.LoginPolicyMultiFactorAddedEventType, org.LoginPolicyMultiFactorAddedEventType,
org.LoginPolicyMultiFactorRemovedEventType) org.LoginPolicyMultiFactorRemovedEventType).
Builder()
} }
func NewOrgAuthFactorsAllowedWriteModel(orgID string) *OrgAuthFactorsAllowedWriteModel { func NewOrgAuthFactorsAllowedWriteModel(orgID string) *OrgAuthFactorsAllowedWriteModel {
@ -164,17 +170,26 @@ func (wm *OrgAuthFactorsAllowedWriteModel) ensureMultiFactor(multiFactor domain.
} }
func (wm *OrgAuthFactorsAllowedWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *OrgAuthFactorsAllowedWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType, org.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(domain.IAMID, wm.WriteModel.AggregateID). AddQuery().
AggregateTypes(iam.AggregateType).
AggregateIDs(domain.IAMID).
EventTypes( EventTypes(
iam.LoginPolicySecondFactorAddedEventType, iam.LoginPolicySecondFactorAddedEventType,
iam.LoginPolicySecondFactorRemovedEventType, iam.LoginPolicySecondFactorRemovedEventType,
iam.LoginPolicyMultiFactorAddedEventType, iam.LoginPolicyMultiFactorAddedEventType,
iam.LoginPolicyMultiFactorRemovedEventType, iam.LoginPolicyMultiFactorRemovedEventType,
).
Or().
AggregateTypes(org.AggregateType).
AggregateIDs(wm.WriteModel.AggregateID).
EventTypes(
org.LoginPolicySecondFactorAddedEventType, org.LoginPolicySecondFactorAddedEventType,
org.LoginPolicySecondFactorRemovedEventType, org.LoginPolicySecondFactorRemovedEventType,
org.LoginPolicyMultiFactorAddedEventType, org.LoginPolicyMultiFactorAddedEventType,
org.LoginPolicyMultiFactorRemovedEventType) org.LoginPolicyMultiFactorRemovedEventType,
).
Builder()
} }
func (wm *OrgAuthFactorsAllowedWriteModel) ToSecondFactorWriteModel(factor domain.SecondFactorType) *OrgSecondFactorWriteModel { func (wm *OrgAuthFactorsAllowedWriteModel) ToSecondFactorWriteModel(factor domain.SecondFactorType) *OrgSecondFactorWriteModel {

View File

@ -43,10 +43,13 @@ func (wm *OrgIdentityProviderWriteModel) Reduce() error {
} }
func (wm *OrgIdentityProviderWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *OrgIdentityProviderWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(org.AggregateType).
AggregateIDs(wm.AggregateID).
EventTypes( EventTypes(
org.LoginPolicyIDPProviderAddedEventType, org.LoginPolicyIDPProviderAddedEventType,
org.LoginPolicyIDPProviderRemovedEventType) org.LoginPolicyIDPProviderRemovedEventType).
Builder()
} }

View File

@ -2,6 +2,7 @@ package command
import ( import (
"context" "context"
"github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/eventstore"
"github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/domain"
@ -46,13 +47,16 @@ func (wm *OrgLoginPolicyWriteModel) Reduce() error {
} }
func (wm *OrgLoginPolicyWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *OrgLoginPolicyWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.LoginPolicyWriteModel.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(org.AggregateType).
AggregateIDs(wm.LoginPolicyWriteModel.AggregateID).
EventTypes( EventTypes(
org.LoginPolicyAddedEventType, org.LoginPolicyAddedEventType,
org.LoginPolicyChangedEventType, org.LoginPolicyChangedEventType,
org.LoginPolicyRemovedEventType) org.LoginPolicyRemovedEventType).
Builder()
} }
func (wm *OrgLoginPolicyWriteModel) NewChangedEvent( func (wm *OrgLoginPolicyWriteModel) NewChangedEvent(

View File

@ -2,9 +2,10 @@ package command
import ( import (
"context" "context"
"github.com/caos/zitadel/internal/eventstore"
"reflect" "reflect"
"github.com/caos/zitadel/internal/eventstore"
"github.com/caos/zitadel/internal/repository/org" "github.com/caos/zitadel/internal/repository/org"
"github.com/caos/zitadel/internal/repository/policy" "github.com/caos/zitadel/internal/repository/policy"
) )
@ -42,12 +43,15 @@ func (wm *OrgMailTemplateWriteModel) Reduce() error {
} }
func (wm *OrgMailTemplateWriteModel) Query() *eventstore.SearchQueryBuilder { 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). AggregateIDs(wm.MailTemplateWriteModel.AggregateID).
EventTypes( EventTypes(
org.MailTemplateAddedEventType, org.MailTemplateAddedEventType,
org.MailTemplateChangedEventType, org.MailTemplateChangedEventType,
org.MailTemplateRemovedEventType) org.MailTemplateRemovedEventType).
Builder()
if wm.ResourceOwner != "" { if wm.ResourceOwner != "" {
query.ResourceOwner(wm.ResourceOwner) query.ResourceOwner(wm.ResourceOwner)

View File

@ -2,6 +2,7 @@ package command
import ( import (
"context" "context"
"github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/eventstore"
"github.com/caos/zitadel/internal/repository/org" "github.com/caos/zitadel/internal/repository/org"
@ -41,12 +42,15 @@ func (wm *ORGOrgIAMPolicyWriteModel) Reduce() error {
} }
func (wm *ORGOrgIAMPolicyWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *ORGOrgIAMPolicyWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.PolicyOrgIAMWriteModel.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(org.AggregateType).
AggregateIDs(wm.PolicyOrgIAMWriteModel.AggregateID).
EventTypes(org.OrgIAMPolicyAddedEventType, EventTypes(org.OrgIAMPolicyAddedEventType,
org.OrgIAMPolicyChangedEventType, org.OrgIAMPolicyChangedEventType,
org.OrgIAMPolicyRemovedEventType) org.OrgIAMPolicyRemovedEventType).
Builder()
} }
func (wm *ORGOrgIAMPolicyWriteModel) NewChangedEvent( func (wm *ORGOrgIAMPolicyWriteModel) NewChangedEvent(

View File

@ -2,6 +2,7 @@ package command
import ( import (
"context" "context"
"github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/eventstore"
"github.com/caos/zitadel/internal/repository/org" "github.com/caos/zitadel/internal/repository/org"
@ -41,13 +42,16 @@ func (wm *OrgPasswordAgePolicyWriteModel) Reduce() error {
} }
func (wm *OrgPasswordAgePolicyWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *OrgPasswordAgePolicyWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.PasswordAgePolicyWriteModel.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(org.AggregateType).
AggregateIDs(wm.PasswordAgePolicyWriteModel.AggregateID).
EventTypes( EventTypes(
org.PasswordAgePolicyAddedEventType, org.PasswordAgePolicyAddedEventType,
org.PasswordAgePolicyChangedEventType, org.PasswordAgePolicyChangedEventType,
org.PasswordAgePolicyRemovedEventType) org.PasswordAgePolicyRemovedEventType).
Builder()
} }
func (wm *OrgPasswordAgePolicyWriteModel) NewChangedEvent( func (wm *OrgPasswordAgePolicyWriteModel) NewChangedEvent(

View File

@ -2,6 +2,7 @@ package command
import ( import (
"context" "context"
"github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/eventstore"
"github.com/caos/zitadel/internal/repository/org" "github.com/caos/zitadel/internal/repository/org"
@ -41,12 +42,15 @@ func (wm *OrgPasswordComplexityPolicyWriteModel) Reduce() error {
} }
func (wm *OrgPasswordComplexityPolicyWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *OrgPasswordComplexityPolicyWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.PasswordComplexityPolicyWriteModel.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(org.AggregateType).
AggregateIDs(wm.PasswordComplexityPolicyWriteModel.AggregateID).
EventTypes(org.PasswordComplexityPolicyAddedEventType, EventTypes(org.PasswordComplexityPolicyAddedEventType,
org.PasswordComplexityPolicyChangedEventType, org.PasswordComplexityPolicyChangedEventType,
org.PasswordComplexityPolicyRemovedEventType) org.PasswordComplexityPolicyRemovedEventType).
Builder()
} }
func (wm *OrgPasswordComplexityPolicyWriteModel) NewChangedEvent( func (wm *OrgPasswordComplexityPolicyWriteModel) NewChangedEvent(

View File

@ -2,6 +2,7 @@ package command
import ( import (
"context" "context"
"github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/eventstore"
"github.com/caos/zitadel/internal/repository/org" "github.com/caos/zitadel/internal/repository/org"
@ -41,12 +42,15 @@ func (wm *OrgPasswordLockoutPolicyWriteModel) Reduce() error {
} }
func (wm *OrgPasswordLockoutPolicyWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *OrgPasswordLockoutPolicyWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.PasswordLockoutPolicyWriteModel.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(org.AggregateType).
AggregateIDs(wm.PasswordLockoutPolicyWriteModel.AggregateID).
EventTypes(org.PasswordLockoutPolicyAddedEventType, EventTypes(org.PasswordLockoutPolicyAddedEventType,
org.PasswordLockoutPolicyChangedEventType, org.PasswordLockoutPolicyChangedEventType,
org.PasswordLockoutPolicyRemovedEventType) org.PasswordLockoutPolicyRemovedEventType).
Builder()
} }
func (wm *OrgPasswordLockoutPolicyWriteModel) NewChangedEvent( func (wm *OrgPasswordLockoutPolicyWriteModel) NewChangedEvent(

View File

@ -2,6 +2,7 @@ package command
import ( import (
"context" "context"
"github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/eventstore"
"github.com/caos/zitadel/internal/repository/org" "github.com/caos/zitadel/internal/repository/org"
@ -41,12 +42,15 @@ func (wm *OrgPrivacyPolicyWriteModel) Reduce() error {
} }
func (wm *OrgPrivacyPolicyWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *OrgPrivacyPolicyWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.PrivacyPolicyWriteModel.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateIDs(wm.PrivacyPolicyWriteModel.AggregateID).
AggregateTypes(org.AggregateType).
EventTypes(org.PrivacyPolicyAddedEventType, EventTypes(org.PrivacyPolicyAddedEventType,
org.PrivacyPolicyChangedEventType, org.PrivacyPolicyChangedEventType,
org.PrivacyPolicyRemovedEventType) org.PrivacyPolicyRemovedEventType).
Builder()
} }
func (wm *OrgPrivacyPolicyWriteModel) NewChangedEvent( func (wm *OrgPrivacyPolicyWriteModel) NewChangedEvent(

View File

@ -2,6 +2,7 @@ package command
import ( import (
"context" "context"
"github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/eventstore"
"github.com/caos/zitadel/internal/crypto" "github.com/caos/zitadel/internal/crypto"
@ -136,9 +137,11 @@ func (wm *APIApplicationWriteModel) appendChangeAPIEvent(e *project.APIConfigCha
} }
func (wm *APIApplicationWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *APIApplicationWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, project.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(project.AggregateType).
AggregateIDs(wm.AggregateID).
EventTypes( EventTypes(
project.ApplicationAddedType, project.ApplicationAddedType,
project.ApplicationChangedType, project.ApplicationChangedType,
@ -148,8 +151,8 @@ func (wm *APIApplicationWriteModel) Query() *eventstore.SearchQueryBuilder {
project.APIConfigAddedType, project.APIConfigAddedType,
project.APIConfigChangedType, project.APIConfigChangedType,
project.APIConfigSecretChangedType, project.APIConfigSecretChangedType,
project.ProjectRemovedType, project.ProjectRemovedType).
) Builder()
} }
func (wm *APIApplicationWriteModel) NewChangedEvent( func (wm *APIApplicationWriteModel) NewChangedEvent(

View File

@ -1,9 +1,10 @@
package command package command
import ( import (
"github.com/caos/zitadel/internal/eventstore"
"time" "time"
"github.com/caos/zitadel/internal/eventstore"
"github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/domain"
"github.com/caos/zitadel/internal/repository/project" "github.com/caos/zitadel/internal/repository/project"
) )
@ -126,9 +127,11 @@ func (wm *ApplicationKeyWriteModel) appendChangeAPIEvent(e *project.APIConfigCha
} }
func (wm *ApplicationKeyWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *ApplicationKeyWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, project.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(project.AggregateType).
AggregateIDs(wm.AggregateID).
EventTypes( EventTypes(
project.ApplicationRemovedType, project.ApplicationRemovedType,
project.OIDCConfigAddedType, project.OIDCConfigAddedType,
@ -137,6 +140,6 @@ func (wm *ApplicationKeyWriteModel) Query() *eventstore.SearchQueryBuilder {
project.APIConfigChangedType, project.APIConfigChangedType,
project.ApplicationKeyAddedEventType, project.ApplicationKeyAddedEventType,
project.ApplicationKeyRemovedEventType, project.ApplicationKeyRemovedEventType,
project.ProjectRemovedType, project.ProjectRemovedType).
) Builder()
} }

View File

@ -94,15 +94,17 @@ func (wm *ApplicationWriteModel) Reduce() error {
} }
func (wm *ApplicationWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *ApplicationWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, project.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(project.AggregateType).
AggregateIDs(wm.AggregateID).
EventTypes( EventTypes(
project.ApplicationAddedType, project.ApplicationAddedType,
project.ApplicationChangedType, project.ApplicationChangedType,
project.ApplicationDeactivatedType, project.ApplicationDeactivatedType,
project.ApplicationReactivatedType, project.ApplicationReactivatedType,
project.ApplicationRemovedType, project.ApplicationRemovedType,
project.ProjectRemovedType, project.ProjectRemovedType).
) Builder()
} }

View File

@ -2,12 +2,13 @@ package command
import ( import (
"context" "context"
"reflect"
"time"
"github.com/caos/zitadel/internal/crypto" "github.com/caos/zitadel/internal/crypto"
"github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/domain"
"github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/eventstore"
"github.com/caos/zitadel/internal/repository/project" "github.com/caos/zitadel/internal/repository/project"
"reflect"
"time"
) )
type OIDCApplicationWriteModel struct { type OIDCApplicationWriteModel struct {
@ -203,9 +204,11 @@ func (wm *OIDCApplicationWriteModel) appendChangeOIDCEvent(e *project.OIDCConfig
} }
func (wm *OIDCApplicationWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *OIDCApplicationWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, project.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(project.AggregateType).
AggregateIDs(wm.AggregateID).
EventTypes( EventTypes(
project.ApplicationAddedType, project.ApplicationAddedType,
project.ApplicationChangedType, project.ApplicationChangedType,
@ -215,8 +218,8 @@ func (wm *OIDCApplicationWriteModel) Query() *eventstore.SearchQueryBuilder {
project.OIDCConfigAddedType, project.OIDCConfigAddedType,
project.OIDCConfigChangedType, project.OIDCConfigChangedType,
project.OIDCConfigSecretChangedType, project.OIDCConfigSecretChangedType,
project.ProjectRemovedType, project.ProjectRemovedType).
) Builder()
} }
func (wm *OIDCApplicationWriteModel) NewChangedEvent( func (wm *OIDCApplicationWriteModel) NewChangedEvent(

View File

@ -80,7 +80,9 @@ func (wm *ProjectGrantMemberWriteModel) Reduce() error {
} }
func (wm *ProjectGrantMemberWriteModel) Query() *eventstore.SearchQueryBuilder { 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). AggregateIDs(wm.AggregateID).
EventTypes( EventTypes(
project.GrantMemberAddedType, project.GrantMemberAddedType,
@ -88,5 +90,6 @@ func (wm *ProjectGrantMemberWriteModel) Query() *eventstore.SearchQueryBuilder {
project.GrantMemberRemovedType, project.GrantMemberRemovedType,
project.GrantMemberCascadeRemovedType, project.GrantMemberCascadeRemovedType,
project.GrantRemovedType, project.GrantRemovedType,
project.ProjectRemovedType) project.ProjectRemovedType).
Builder()
} }

View File

@ -91,7 +91,9 @@ func (wm *ProjectGrantWriteModel) Reduce() error {
} }
func (wm *ProjectGrantWriteModel) Query() *eventstore.SearchQueryBuilder { 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). AggregateIDs(wm.AggregateID).
EventTypes( EventTypes(
project.GrantAddedType, project.GrantAddedType,
@ -100,7 +102,9 @@ func (wm *ProjectGrantWriteModel) Query() *eventstore.SearchQueryBuilder {
project.GrantDeactivatedType, project.GrantDeactivatedType,
project.GrantReactivatedType, project.GrantReactivatedType,
project.GrantRemovedType, project.GrantRemovedType,
project.ProjectRemovedType) project.ProjectRemovedType).
Builder()
if wm.ResourceOwner != "" { if wm.ResourceOwner != "" {
query.ResourceOwner(wm.ResourceOwner) query.ResourceOwner(wm.ResourceOwner)
} }
@ -152,14 +156,22 @@ func (wm *ProjectGrantPreConditionReadModel) Reduce() error {
} }
func (wm *ProjectGrantPreConditionReadModel) Query() *eventstore.SearchQueryBuilder { func (wm *ProjectGrantPreConditionReadModel) Query() *eventstore.SearchQueryBuilder {
query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType, project.AggregateType). query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.ProjectID, wm.GrantedOrgID). AddQuery().
AggregateTypes(org.AggregateType).
AggregateIDs(wm.GrantedOrgID).
EventTypes( EventTypes(
org.OrgAddedEventType, org.OrgAddedEventType,
org.OrgRemovedEventType, org.OrgRemovedEventType).
Or().
AggregateTypes(project.AggregateType).
AggregateIDs(wm.ProjectID).
EventTypes(
project.ProjectAddedType, project.ProjectAddedType,
project.ProjectRemovedType, project.ProjectRemovedType,
project.RoleAddedType, project.RoleAddedType,
project.RoleRemovedType) project.RoleRemovedType).
Builder()
return query return query
} }

View File

@ -53,11 +53,14 @@ func (wm *ProjectMemberWriteModel) Reduce() error {
} }
func (wm *ProjectMemberWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *ProjectMemberWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, project.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.MemberWriteModel.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(project.AggregateType).
AggregateIDs(wm.MemberWriteModel.AggregateID).
EventTypes(project.MemberAddedType, EventTypes(project.MemberAddedType,
project.MemberChangedType, project.MemberChangedType,
project.MemberRemovedType, project.MemberRemovedType,
project.MemberCascadeRemovedType) project.MemberCascadeRemovedType).
Builder()
} }

View File

@ -2,6 +2,7 @@ package command
import ( import (
"context" "context"
"github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/domain"
"github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/eventstore"
"github.com/caos/zitadel/internal/repository/project" "github.com/caos/zitadel/internal/repository/project"
@ -61,14 +62,17 @@ func (wm *ProjectWriteModel) Reduce() error {
} }
func (wm *ProjectWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *ProjectWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, project.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(project.AggregateType).
AggregateIDs(wm.AggregateID).
EventTypes(project.ProjectAddedType, EventTypes(project.ProjectAddedType,
project.ProjectChangedType, project.ProjectChangedType,
project.ProjectDeactivatedType, project.ProjectDeactivatedType,
project.ProjectReactivatedType, project.ProjectReactivatedType,
project.ProjectRemovedType) project.ProjectRemovedType).
Builder()
} }
func (wm *ProjectWriteModel) NewChangedEvent( func (wm *ProjectWriteModel) NewChangedEvent(

View File

@ -2,6 +2,7 @@ package command
import ( import (
"context" "context"
"github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/domain"
"github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/eventstore"
"github.com/caos/zitadel/internal/repository/project" "github.com/caos/zitadel/internal/repository/project"
@ -82,14 +83,17 @@ func (wm *ProjectRoleWriteModel) Reduce() error {
} }
func (wm *ProjectRoleWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *ProjectRoleWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, project.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(project.AggregateType).
AggregateIDs(wm.AggregateID).
EventTypes( EventTypes(
project.RoleAddedType, project.RoleAddedType,
project.RoleChangedType, project.RoleChangedType,
project.RoleRemovedType, project.RoleRemovedType,
project.ProjectRemovedType) project.ProjectRemovedType).
Builder()
} }
func (wm *ProjectRoleWriteModel) NewProjectRoleChangedEvent( func (wm *ProjectRoleWriteModel) NewProjectRoleChangedEvent(

View File

@ -2,6 +2,7 @@ package command
import ( import (
"context" "context"
"github.com/caos/logging" "github.com/caos/logging"
"github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/domain"
"github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/eventstore"
@ -181,8 +182,8 @@ func (rm *UniqueConstraintReadModel) Reduce() error {
} }
func (rm *UniqueConstraintReadModel) Query() *eventstore.SearchQueryBuilder { func (rm *UniqueConstraintReadModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder( return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
eventstore.ColumnsEvent, AddQuery().AggregateTypes(
iam.AggregateType, iam.AggregateType,
org.AggregateType, org.AggregateType,
project.AggregateType, project.AggregateType,
@ -237,8 +238,8 @@ func (rm *UniqueConstraintReadModel) Query() *eventstore.SearchQueryBuilder {
org.MemberCascadeRemovedEventType, org.MemberCascadeRemovedEventType,
project.MemberAddedType, project.MemberAddedType,
project.MemberRemovedType, project.MemberRemovedType,
project.MemberCascadeRemovedType, project.MemberCascadeRemovedType).
) Builder()
} }
func (rm *UniqueConstraintReadModel) getUniqueConstraint(aggregateID, objectID, constraintType string) *domain.UniqueConstraintMigration { func (rm *UniqueConstraintReadModel) getUniqueConstraint(aggregateID, objectID, constraintType string) *domain.UniqueConstraintMigration {

View File

@ -60,7 +60,9 @@ func (wm *UserGrantWriteModel) Reduce() error {
} }
func (wm *UserGrantWriteModel) Query() *eventstore.SearchQueryBuilder { 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). AggregateIDs(wm.AggregateID).
EventTypes(usergrant.UserGrantAddedType, EventTypes(usergrant.UserGrantAddedType,
usergrant.UserGrantChangedType, usergrant.UserGrantChangedType,
@ -68,7 +70,9 @@ func (wm *UserGrantWriteModel) Query() *eventstore.SearchQueryBuilder {
usergrant.UserGrantDeactivatedType, usergrant.UserGrantDeactivatedType,
usergrant.UserGrantReactivatedType, usergrant.UserGrantReactivatedType,
usergrant.UserGrantRemovedType, usergrant.UserGrantRemovedType,
usergrant.UserGrantCascadeRemovedType) usergrant.UserGrantCascadeRemovedType).
Builder()
if wm.ResourceOwner != "" { if wm.ResourceOwner != "" {
query.ResourceOwner(wm.ResourceOwner) query.ResourceOwner(wm.ResourceOwner)
} }
@ -152,20 +156,28 @@ func (wm *UserGrantPreConditionReadModel) Reduce() error {
} }
func (wm *UserGrantPreConditionReadModel) Query() *eventstore.SearchQueryBuilder { func (wm *UserGrantPreConditionReadModel) Query() *eventstore.SearchQueryBuilder {
query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType, project.AggregateType). query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.UserID, wm.ProjectID). AddQuery().
EventTypes(user.UserV1AddedType, AggregateTypes(user.AggregateType).
AggregateIDs(wm.UserID).
EventTypes(
user.UserV1AddedType,
user.HumanAddedType, user.HumanAddedType,
user.UserV1RegisteredType, user.UserV1RegisteredType,
user.HumanRegisteredType, user.HumanRegisteredType,
user.MachineAddedEventType, user.MachineAddedEventType,
user.UserRemovedType, user.UserRemovedType).
Or().
AggregateTypes(project.AggregateType).
AggregateIDs(wm.ProjectID).
EventTypes(
project.ProjectAddedType, project.ProjectAddedType,
project.ProjectRemovedType, project.ProjectRemovedType,
project.GrantAddedType, project.GrantAddedType,
project.GrantChangedType, project.GrantChangedType,
project.GrantRemovedType, project.GrantRemovedType,
project.RoleAddedType, project.RoleAddedType,
project.RoleRemovedType) project.RoleRemovedType).
Builder()
return query return query
} }

View File

@ -70,16 +70,19 @@ func (wm *HumanAddressWriteModel) Reduce() error {
} }
func (wm *HumanAddressWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *HumanAddressWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(user.AggregateType).
AggregateIDs(wm.AggregateID).
EventTypes(user.UserV1AddedType, EventTypes(user.UserV1AddedType,
user.UserV1RegisteredType, user.UserV1RegisteredType,
user.UserV1AddressChangedType, user.UserV1AddressChangedType,
user.HumanAddedType, user.HumanAddedType,
user.HumanRegisteredType, user.HumanRegisteredType,
user.HumanAddressChangedType, user.HumanAddressChangedType,
user.UserRemovedType) user.UserRemovedType).
Builder()
} }
func (wm *HumanAddressWriteModel) NewChangedEvent( func (wm *HumanAddressWriteModel) NewChangedEvent(

View File

@ -65,7 +65,9 @@ func (wm *HumanEmailWriteModel) Reduce() error {
} }
func (wm *HumanEmailWriteModel) Query() *eventstore.SearchQueryBuilder { 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). AggregateIDs(wm.AggregateID).
EventTypes(user.UserV1AddedType, EventTypes(user.UserV1AddedType,
user.HumanAddedType, user.HumanAddedType,
@ -81,7 +83,9 @@ func (wm *HumanEmailWriteModel) Query() *eventstore.SearchQueryBuilder {
user.HumanEmailCodeAddedType, user.HumanEmailCodeAddedType,
user.UserV1EmailVerifiedType, user.UserV1EmailVerifiedType,
user.HumanEmailVerifiedType, user.HumanEmailVerifiedType,
user.UserRemovedType) user.UserRemovedType).
Builder()
if wm.ResourceOwner != "" { if wm.ResourceOwner != "" {
query.ResourceOwner(wm.ResourceOwner) query.ResourceOwner(wm.ResourceOwner)
} }

View File

@ -47,11 +47,14 @@ func (wm *HumanExternalIDPWriteModel) Reduce() error {
} }
func (wm *HumanExternalIDPWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *HumanExternalIDPWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(user.AggregateType).
AggregateIDs(wm.AggregateID).
EventTypes(user.HumanExternalIDPAddedType, EventTypes(user.HumanExternalIDPAddedType,
user.HumanExternalIDPRemovedType, user.HumanExternalIDPRemovedType,
user.HumanExternalIDPCascadeRemovedType, user.HumanExternalIDPCascadeRemovedType,
user.UserRemovedType) user.UserRemovedType).
Builder()
} }

View File

@ -2,9 +2,10 @@ package command
import ( import (
"context" "context"
"github.com/caos/zitadel/internal/eventstore"
"time" "time"
"github.com/caos/zitadel/internal/eventstore"
"github.com/caos/zitadel/internal/crypto" "github.com/caos/zitadel/internal/crypto"
"github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/domain"
"github.com/caos/zitadel/internal/repository/user" "github.com/caos/zitadel/internal/repository/user"
@ -66,7 +67,9 @@ func (wm *HumanInitCodeWriteModel) Reduce() error {
} }
func (wm *HumanInitCodeWriteModel) Query() *eventstore.SearchQueryBuilder { 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). AggregateIDs(wm.AggregateID).
EventTypes(user.UserV1AddedType, EventTypes(user.UserV1AddedType,
user.HumanAddedType, user.HumanAddedType,
@ -80,7 +83,9 @@ func (wm *HumanInitCodeWriteModel) Query() *eventstore.SearchQueryBuilder {
user.HumanInitialCodeAddedType, user.HumanInitialCodeAddedType,
user.UserV1InitializedCheckSucceededType, user.UserV1InitializedCheckSucceededType,
user.HumanInitializedCheckSucceededType, user.HumanInitializedCheckSucceededType,
user.UserRemovedType) user.UserRemovedType).
Builder()
if wm.ResourceOwner != "" { if wm.ResourceOwner != "" {
query.ResourceOwner(wm.ResourceOwner) query.ResourceOwner(wm.ResourceOwner)
} }

View File

@ -104,9 +104,11 @@ func (wm *HumanWriteModel) Reduce() error {
} }
func (wm *HumanWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *HumanWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(user.AggregateType).
AggregateIDs(wm.AggregateID).
EventTypes(user.HumanAddedType, EventTypes(user.HumanAddedType,
user.HumanRegisteredType, user.HumanRegisteredType,
user.HumanInitialCodeAddedType, user.HumanInitialCodeAddedType,
@ -136,7 +138,8 @@ func (wm *HumanWriteModel) Query() *eventstore.SearchQueryBuilder {
user.UserV1PhoneChangedType, user.UserV1PhoneChangedType,
user.UserV1PhoneVerifiedType, user.UserV1PhoneVerifiedType,
user.UserV1PhoneRemovedType, user.UserV1PhoneRemovedType,
user.UserV1PasswordChangedType) user.UserV1PasswordChangedType).
Builder()
} }
func (wm *HumanWriteModel) reduceHumanAddedEvent(e *user.HumanAddedEvent) { func (wm *HumanWriteModel) reduceHumanAddedEvent(e *user.HumanAddedEvent) {

View File

@ -41,7 +41,9 @@ func (wm *HumanOTPWriteModel) Reduce() error {
} }
func (wm *HumanOTPWriteModel) Query() *eventstore.SearchQueryBuilder { 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). AggregateIDs(wm.AggregateID).
EventTypes(user.HumanMFAOTPAddedType, EventTypes(user.HumanMFAOTPAddedType,
user.HumanMFAOTPVerifiedType, user.HumanMFAOTPVerifiedType,
@ -49,7 +51,9 @@ func (wm *HumanOTPWriteModel) Query() *eventstore.SearchQueryBuilder {
user.UserRemovedType, user.UserRemovedType,
user.UserV1MFAOTPAddedType, user.UserV1MFAOTPAddedType,
user.UserV1MFAOTPVerifiedType, user.UserV1MFAOTPVerifiedType,
user.UserV1MFAOTPRemovedType) user.UserV1MFAOTPRemovedType).
Builder()
if wm.ResourceOwner != "" { if wm.ResourceOwner != "" {
query.ResourceOwner(wm.ResourceOwner) query.ResourceOwner(wm.ResourceOwner)
} }

View File

@ -1,9 +1,10 @@
package command package command
import ( import (
"github.com/caos/zitadel/internal/eventstore"
"time" "time"
"github.com/caos/zitadel/internal/eventstore"
"github.com/caos/zitadel/internal/crypto" "github.com/caos/zitadel/internal/crypto"
"github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/domain"
"github.com/caos/zitadel/internal/repository/user" "github.com/caos/zitadel/internal/repository/user"
@ -66,7 +67,9 @@ func (wm *HumanPasswordWriteModel) Reduce() error {
} }
func (wm *HumanPasswordWriteModel) Query() *eventstore.SearchQueryBuilder { 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). AggregateIDs(wm.AggregateID).
EventTypes(user.HumanAddedType, EventTypes(user.HumanAddedType,
user.HumanRegisteredType, user.HumanRegisteredType,
@ -82,7 +85,9 @@ func (wm *HumanPasswordWriteModel) Query() *eventstore.SearchQueryBuilder {
user.UserV1InitializedCheckSucceededType, user.UserV1InitializedCheckSucceededType,
user.UserV1PasswordChangedType, user.UserV1PasswordChangedType,
user.UserV1PasswordCodeAddedType, user.UserV1PasswordCodeAddedType,
user.UserV1EmailVerifiedType) user.UserV1EmailVerifiedType).
Builder()
if wm.ResourceOwner != "" { if wm.ResourceOwner != "" {
query.ResourceOwner(wm.ResourceOwner) query.ResourceOwner(wm.ResourceOwner)
} }

View File

@ -2,9 +2,10 @@ package command
import ( import (
"context" "context"
"github.com/caos/zitadel/internal/eventstore"
"time" "time"
"github.com/caos/zitadel/internal/eventstore"
"github.com/caos/zitadel/internal/crypto" "github.com/caos/zitadel/internal/crypto"
"github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/domain"
"github.com/caos/zitadel/internal/repository/user" "github.com/caos/zitadel/internal/repository/user"
@ -74,9 +75,11 @@ func (wm *HumanPhoneWriteModel) Reduce() error {
} }
func (wm *HumanPhoneWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *HumanPhoneWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(user.AggregateType).
AggregateIDs(wm.AggregateID).
EventTypes(user.HumanAddedType, EventTypes(user.HumanAddedType,
user.HumanRegisteredType, user.HumanRegisteredType,
user.HumanInitialCodeAddedType, user.HumanInitialCodeAddedType,
@ -93,7 +96,8 @@ func (wm *HumanPhoneWriteModel) Query() *eventstore.SearchQueryBuilder {
user.UserV1PhoneCodeAddedType, user.UserV1PhoneCodeAddedType,
user.UserV1PhoneChangedType, user.UserV1PhoneChangedType,
user.UserV1PhoneVerifiedType, user.UserV1PhoneVerifiedType,
user.UserV1PhoneRemovedType) user.UserV1PhoneRemovedType).
Builder()
} }
func (wm *HumanPhoneWriteModel) NewChangedEvent( func (wm *HumanPhoneWriteModel) NewChangedEvent(

View File

@ -2,6 +2,7 @@ package command
import ( import (
"context" "context"
"github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/eventstore"
"golang.org/x/text/language" "golang.org/x/text/language"
@ -78,16 +79,19 @@ func (wm *HumanProfileWriteModel) Reduce() error {
} }
func (wm *HumanProfileWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *HumanProfileWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(user.AggregateType).
AggregateIDs(wm.AggregateID).
EventTypes(user.HumanAddedType, EventTypes(user.HumanAddedType,
user.HumanRegisteredType, user.HumanRegisteredType,
user.HumanProfileChangedType, user.HumanProfileChangedType,
user.UserRemovedType, user.UserRemovedType,
user.UserV1AddedType, user.UserV1AddedType,
user.UserV1RegisteredType, user.UserV1RegisteredType,
user.UserV1ProfileChangedType) user.UserV1ProfileChangedType).
Builder()
} }
func (wm *HumanProfileWriteModel) NewChangedEvent( func (wm *HumanProfileWriteModel) NewChangedEvent(

View File

@ -75,13 +75,17 @@ func (wm *HumanRefreshTokenWriteModel) Reduce() error {
} }
func (wm *HumanRefreshTokenWriteModel) Query() *eventstore.SearchQueryBuilder { 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). AggregateIDs(wm.AggregateID).
EventTypes( EventTypes(
user.HumanRefreshTokenAddedType, user.HumanRefreshTokenAddedType,
user.HumanRefreshTokenRenewedType, user.HumanRefreshTokenRenewedType,
user.HumanRefreshTokenRemovedType, user.HumanRefreshTokenRemovedType,
user.UserRemovedType) user.UserRemovedType).
Builder()
if wm.ResourceOwner != "" { if wm.ResourceOwner != "" {
query.ResourceOwner(wm.ResourceOwner) query.ResourceOwner(wm.ResourceOwner)
} }

View File

@ -124,9 +124,11 @@ func (wm *HumanWebAuthNWriteModel) appendVerifiedEvent(e *user.HumanWebAuthNVeri
} }
func (wm *HumanWebAuthNWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *HumanWebAuthNWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(user.AggregateType).
AggregateIDs(wm.AggregateID).
EventTypes(user.HumanU2FTokenAddedType, EventTypes(user.HumanU2FTokenAddedType,
user.HumanPasswordlessTokenAddedType, user.HumanPasswordlessTokenAddedType,
user.HumanU2FTokenAddedType, user.HumanU2FTokenAddedType,
@ -135,7 +137,8 @@ func (wm *HumanWebAuthNWriteModel) Query() *eventstore.SearchQueryBuilder {
user.HumanPasswordlessTokenSignCountChangedType, user.HumanPasswordlessTokenSignCountChangedType,
user.HumanU2FTokenRemovedType, user.HumanU2FTokenRemovedType,
user.HumanPasswordlessTokenRemovedType, user.HumanPasswordlessTokenRemovedType,
user.UserRemovedType) user.UserRemovedType).
Builder()
} }
type HumanU2FTokensReadModel struct { type HumanU2FTokensReadModel struct {
@ -199,13 +202,16 @@ func (wm *HumanU2FTokensReadModel) Reduce() error {
} }
func (rm *HumanU2FTokensReadModel) Query() *eventstore.SearchQueryBuilder { func (rm *HumanU2FTokensReadModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(rm.AggregateID).
ResourceOwner(rm.ResourceOwner). ResourceOwner(rm.ResourceOwner).
AddQuery().
AggregateTypes(user.AggregateType).
AggregateIDs(rm.AggregateID).
EventTypes( EventTypes(
user.HumanU2FTokenAddedType, user.HumanU2FTokenAddedType,
user.HumanU2FTokenVerifiedType, user.HumanU2FTokenVerifiedType,
user.HumanU2FTokenRemovedType) user.HumanU2FTokenRemovedType).
Builder()
} }
@ -279,13 +285,16 @@ func (wm *HumanPasswordlessTokensReadModel) Reduce() error {
} }
func (rm *HumanPasswordlessTokensReadModel) Query() *eventstore.SearchQueryBuilder { func (rm *HumanPasswordlessTokensReadModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(rm.AggregateID).
ResourceOwner(rm.ResourceOwner). ResourceOwner(rm.ResourceOwner).
AddQuery().
AggregateTypes(user.AggregateType).
AggregateIDs(rm.AggregateID).
EventTypes( EventTypes(
user.HumanPasswordlessTokenAddedType, user.HumanPasswordlessTokenAddedType,
user.HumanPasswordlessTokenVerifiedType, user.HumanPasswordlessTokenVerifiedType,
user.HumanPasswordlessTokenRemovedType) user.HumanPasswordlessTokenRemovedType).
Builder()
} }
@ -349,13 +358,15 @@ func (wm *HumanU2FLoginReadModel) Reduce() error {
} }
func (rm *HumanU2FLoginReadModel) Query() *eventstore.SearchQueryBuilder { func (rm *HumanU2FLoginReadModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(rm.AggregateID).
ResourceOwner(rm.ResourceOwner). ResourceOwner(rm.ResourceOwner).
AddQuery().
AggregateTypes(user.AggregateType).
AggregateIDs(rm.AggregateID).
EventTypes( EventTypes(
user.HumanU2FTokenBeginLoginType, user.HumanU2FTokenBeginLoginType,
user.UserRemovedType, user.UserRemovedType).
) Builder()
} }
type HumanPasswordlessLoginReadModel struct { type HumanPasswordlessLoginReadModel struct {
@ -408,12 +419,14 @@ func (wm *HumanPasswordlessLoginReadModel) Reduce() error {
} }
func (rm *HumanPasswordlessLoginReadModel) Query() *eventstore.SearchQueryBuilder { func (rm *HumanPasswordlessLoginReadModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(rm.AggregateID).
ResourceOwner(rm.ResourceOwner). ResourceOwner(rm.ResourceOwner).
AddQuery().
AggregateTypes(user.AggregateType).
AggregateIDs(rm.AggregateID).
EventTypes( EventTypes(
user.HumanPasswordlessTokenBeginLoginType, user.HumanPasswordlessTokenBeginLoginType,
user.UserRemovedType, user.UserRemovedType).
) Builder()
} }

View File

@ -1,9 +1,10 @@
package command package command
import ( import (
"github.com/caos/zitadel/internal/eventstore"
"time" "time"
"github.com/caos/zitadel/internal/eventstore"
"github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/domain"
"github.com/caos/zitadel/internal/repository/user" "github.com/caos/zitadel/internal/repository/user"
) )
@ -65,13 +66,16 @@ func (wm *MachineKeyWriteModel) Reduce() error {
} }
func (wm *MachineKeyWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *MachineKeyWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(user.AggregateType).
AggregateIDs(wm.AggregateID).
EventTypes( EventTypes(
user.MachineKeyAddedEventType, user.MachineKeyAddedEventType,
user.MachineKeyRemovedEventType, user.MachineKeyRemovedEventType,
user.UserRemovedType) user.UserRemovedType).
Builder()
} }
func (wm *MachineKeyWriteModel) Exists() bool { func (wm *MachineKeyWriteModel) Exists() bool {

View File

@ -2,6 +2,7 @@ package command
import ( import (
"context" "context"
"github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/eventstore"
"github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/domain"
@ -68,9 +69,11 @@ func (wm *MachineWriteModel) Reduce() error {
} }
func (wm *MachineWriteModel) Query() *eventstore.SearchQueryBuilder { func (wm *MachineWriteModel) Query() *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(wm.AggregateID).
ResourceOwner(wm.ResourceOwner). ResourceOwner(wm.ResourceOwner).
AddQuery().
AggregateTypes(user.AggregateType).
AggregateIDs(wm.AggregateID).
EventTypes(user.MachineAddedEventType, EventTypes(user.MachineAddedEventType,
user.UserUserNameChangedType, user.UserUserNameChangedType,
user.MachineChangedEventType, user.MachineChangedEventType,
@ -78,7 +81,8 @@ func (wm *MachineWriteModel) Query() *eventstore.SearchQueryBuilder {
user.UserUnlockedType, user.UserUnlockedType,
user.UserDeactivatedType, user.UserDeactivatedType,
user.UserReactivatedType, user.UserReactivatedType,
user.UserRemovedType) user.UserRemovedType).
Builder()
} }
func (wm *MachineWriteModel) NewChangedEvent( func (wm *MachineWriteModel) NewChangedEvent(

View File

@ -1,9 +1,10 @@
package command package command
import ( import (
"github.com/caos/zitadel/internal/eventstore"
"strings" "strings"
"github.com/caos/zitadel/internal/eventstore"
"github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/domain"
caos_errors "github.com/caos/zitadel/internal/errors" caos_errors "github.com/caos/zitadel/internal/errors"
"github.com/caos/zitadel/internal/repository/user" "github.com/caos/zitadel/internal/repository/user"
@ -67,7 +68,9 @@ func (wm *UserWriteModel) Reduce() error {
} }
func (wm *UserWriteModel) Query() *eventstore.SearchQueryBuilder { 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). AggregateIDs(wm.AggregateID).
EventTypes( EventTypes(
user.HumanAddedType, user.HumanAddedType,
@ -83,7 +86,9 @@ func (wm *UserWriteModel) Query() *eventstore.SearchQueryBuilder {
user.UserRemovedType, user.UserRemovedType,
user.UserV1AddedType, user.UserV1AddedType,
user.UserV1RegisteredType, user.UserV1RegisteredType,
user.UserV1InitializedCheckSucceededType) user.UserV1InitializedCheckSucceededType).
Builder()
if wm.ResourceOwner != "" { if wm.ResourceOwner != "" {
query.ResourceOwner(wm.ResourceOwner) query.ResourceOwner(wm.ResourceOwner)
} }

View File

@ -14,8 +14,6 @@ type AssetAction int32
const ( const (
AssetAdd AssetAction = iota AssetAdd AssetAction = iota
AssetRemove AssetRemove
assetActionCount
) )
func NewAddAsset( func NewAddAsset(

View File

@ -95,18 +95,6 @@ func uniqueConstraintsToRepository(constraints []*EventUniqueConstraint) (unique
return uniqueConstraints 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 //FilterEvents filters the stored events based on the searchQuery
// and maps the events to the defined event structs // and maps the events to the defined event structs
func (es *Eventstore) FilterEvents(ctx context.Context, queryFactory *SearchQueryBuilder) ([]EventReader, error) { func (es *Eventstore) FilterEvents(ctx context.Context, queryFactory *SearchQueryBuilder) ([]EventReader, error) {
@ -241,14 +229,3 @@ func uniqueConstraintActionToRepository(action UniqueConstraintAction) repositor
return repository.UniqueConstraintAdd 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
}
}

View File

@ -13,31 +13,6 @@ import (
"github.com/caos/zitadel/internal/eventstore/repository" "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 // testEvent implements the Event interface
type testEvent struct { type testEvent struct {
BaseEvent BaseEvent
@ -368,7 +343,6 @@ func Test_eventData(t *testing.T) {
func TestEventstore_aggregatesToEvents(t *testing.T) { func TestEventstore_aggregatesToEvents(t *testing.T) {
type args struct { type args struct {
aggregates []Aggregate
events []EventPusher events []EventPusher
} }
type res struct { type res struct {
@ -892,8 +866,13 @@ func TestEventstore_FilterEvents(t *testing.T) {
name: "no events", name: "no events",
args: args{ args: args{
query: &SearchQueryBuilder{ query: &SearchQueryBuilder{
aggregateTypes: []AggregateType{"no.aggregates"},
columns: repository.ColumnsEvent, columns: repository.ColumnsEvent,
queries: []*SearchQuery{
{
builder: &SearchQueryBuilder{},
aggregateTypes: []AggregateType{"no.aggregates"},
},
},
}, },
}, },
fields: fields{ fields: fields{
@ -915,8 +894,13 @@ func TestEventstore_FilterEvents(t *testing.T) {
name: "repo error", name: "repo error",
args: args{ args: args{
query: &SearchQueryBuilder{ query: &SearchQueryBuilder{
aggregateTypes: []AggregateType{"no.aggregates"},
columns: repository.ColumnsEvent, columns: repository.ColumnsEvent,
queries: []*SearchQuery{
{
builder: &SearchQueryBuilder{},
aggregateTypes: []AggregateType{"no.aggregates"},
},
},
}, },
}, },
fields: fields{ fields: fields{
@ -938,8 +922,13 @@ func TestEventstore_FilterEvents(t *testing.T) {
name: "found events", name: "found events",
args: args{ args: args{
query: &SearchQueryBuilder{ query: &SearchQueryBuilder{
aggregateTypes: []AggregateType{"test.aggregate"},
columns: repository.ColumnsEvent, columns: repository.ColumnsEvent,
queries: []*SearchQuery{
{
builder: &SearchQueryBuilder{},
aggregateTypes: []AggregateType{"test.aggregate"},
},
},
}, },
}, },
fields: fields{ fields: fields{
@ -1016,8 +1005,13 @@ func TestEventstore_LatestSequence(t *testing.T) {
name: "no events", name: "no events",
args: args{ args: args{
query: &SearchQueryBuilder{ query: &SearchQueryBuilder{
aggregateTypes: []AggregateType{"no.aggregates"},
columns: repository.ColumnsMaxSequence, columns: repository.ColumnsMaxSequence,
queries: []*SearchQuery{
{
builder: &SearchQueryBuilder{},
aggregateTypes: []AggregateType{"no.aggregates"},
},
},
}, },
}, },
fields: fields{ fields: fields{
@ -1034,8 +1028,13 @@ func TestEventstore_LatestSequence(t *testing.T) {
name: "repo error", name: "repo error",
args: args{ args: args{
query: &SearchQueryBuilder{ query: &SearchQueryBuilder{
aggregateTypes: []AggregateType{"no.aggregates"},
columns: repository.ColumnsMaxSequence, columns: repository.ColumnsMaxSequence,
queries: []*SearchQuery{
{
builder: &SearchQueryBuilder{},
aggregateTypes: []AggregateType{"no.aggregates"},
},
},
}, },
}, },
fields: fields{ fields: fields{
@ -1052,8 +1051,13 @@ func TestEventstore_LatestSequence(t *testing.T) {
name: "found events", name: "found events",
args: args{ args: args{
query: &SearchQueryBuilder{ query: &SearchQueryBuilder{
aggregateTypes: []AggregateType{"test.aggregate"},
columns: repository.ColumnsMaxSequence, columns: repository.ColumnsMaxSequence,
queries: []*SearchQuery{
{
builder: &SearchQueryBuilder{},
aggregateTypes: []AggregateType{"test.aggregate"},
},
},
}, },
}, },
fields: fields{ fields: fields{
@ -1134,8 +1138,13 @@ func TestEventstore_FilterToReducer(t *testing.T) {
name: "no events", name: "no events",
args: args{ args: args{
query: &SearchQueryBuilder{ query: &SearchQueryBuilder{
aggregateTypes: []AggregateType{"no.aggregates"},
columns: repository.ColumnsEvent, columns: repository.ColumnsEvent,
queries: []*SearchQuery{
{
builder: &SearchQueryBuilder{},
aggregateTypes: []AggregateType{"no.aggregates"},
},
},
}, },
readModel: &testReducer{ readModel: &testReducer{
t: t, t: t,
@ -1161,8 +1170,13 @@ func TestEventstore_FilterToReducer(t *testing.T) {
name: "repo error", name: "repo error",
args: args{ args: args{
query: &SearchQueryBuilder{ query: &SearchQueryBuilder{
aggregateTypes: []AggregateType{"no.aggregates"},
columns: repository.ColumnsEvent, columns: repository.ColumnsEvent,
queries: []*SearchQuery{
{
builder: &SearchQueryBuilder{},
aggregateTypes: []AggregateType{"no.aggregates"},
},
},
}, },
readModel: &testReducer{ readModel: &testReducer{
t: t, t: t,
@ -1187,7 +1201,15 @@ func TestEventstore_FilterToReducer(t *testing.T) {
{ {
name: "found events", name: "found events",
args: args{ args: args{
query: NewSearchQueryBuilder(repository.ColumnsEvent, "test.aggregate"), query: &SearchQueryBuilder{
columns: repository.ColumnsEvent,
queries: []*SearchQuery{
{
builder: &SearchQueryBuilder{},
aggregateTypes: []AggregateType{"test.aggregate"},
},
},
},
readModel: &testReducer{ readModel: &testReducer{
t: t, t: t,
expectedLength: 1, expectedLength: 1,
@ -1214,8 +1236,13 @@ func TestEventstore_FilterToReducer(t *testing.T) {
name: "append in reducer fails", name: "append in reducer fails",
args: args{ args: args{
query: &SearchQueryBuilder{ query: &SearchQueryBuilder{
aggregateTypes: []AggregateType{"test.aggregate"},
columns: repository.ColumnsEvent, columns: repository.ColumnsEvent,
queries: []*SearchQuery{
{
builder: &SearchQueryBuilder{},
aggregateTypes: []AggregateType{"test.aggregate"},
},
},
}, },
readModel: &testReducer{ readModel: &testReducer{
t: t, t: t,
@ -1275,13 +1302,6 @@ func combineEventLists(lists ...[]*repository.Event) []*repository.Event {
return events 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) { func compareEvents(t *testing.T, want, got *repository.Event) {
t.Helper() t.Helper()

View File

@ -311,7 +311,8 @@ func TestUserReadModel(t *testing.T) {
fmt.Printf("%+v\n", events) fmt.Printf("%+v\n", events)
users := UsersReadModel{} 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 { if err != nil {
t.Errorf("unexpected error on filter to reducer: %v", err) t.Errorf("unexpected error on filter to reducer: %v", err)
} }

View File

@ -7,7 +7,7 @@ type SearchQuery struct {
Columns Columns Columns Columns
Limit uint64 Limit uint64
Desc bool Desc bool
Filters []*Filter Filters [][]*Filter
} }
//Columns defines which fields of the event are needed for the query //Columns defines which fields of the event are needed for the query

View File

@ -13,9 +13,6 @@ import (
"github.com/caos/zitadel/internal/eventstore/repository" "github.com/caos/zitadel/internal/eventstore/repository"
"github.com/cockroachdb/cockroach-go/v2/crdb" "github.com/cockroachdb/cockroach-go/v2/crdb"
"github.com/lib/pq" "github.com/lib/pq"
//sql import for cockroach
_ "github.com/lib/pq"
) )
const ( const (
@ -163,7 +160,7 @@ func (db *CRDB) Push(ctx context.Context, events []*repository.Event, uniqueCons
// handleUniqueConstraints adds or removes unique constraints // handleUniqueConstraints adds or removes unique constraints
func (db *CRDB) handleUniqueConstraints(ctx context.Context, tx *sql.Tx, uniqueConstraints ...*repository.UniqueConstraint) (err error) { 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 return nil
} }

View File

@ -5,10 +5,8 @@ import (
"sync" "sync"
"testing" "testing"
"github.com/lib/pq"
_ "github.com/lib/pq"
"github.com/caos/zitadel/internal/eventstore/repository" "github.com/caos/zitadel/internal/eventstore/repository"
"github.com/lib/pq"
) )
func TestCRDB_placeholder(t *testing.T) { func TestCRDB_placeholder(t *testing.T) {
@ -749,11 +747,13 @@ func TestCRDB_Filter(t *testing.T) {
args: args{ args: args{
searchQuery: &repository.SearchQuery{ searchQuery: &repository.SearchQuery{
Columns: repository.ColumnsEvent, Columns: repository.ColumnsEvent,
Filters: []*repository.Filter{ Filters: [][]*repository.Filter{
{
repository.NewFilter(repository.FieldAggregateType, "not found", repository.OperationEquals), repository.NewFilter(repository.FieldAggregateType, "not found", repository.OperationEquals),
}, },
}, },
}, },
},
fields: fields{ fields: fields{
existingEvents: []*repository.Event{ existingEvents: []*repository.Event{
generateEvent(t, "300"), generateEvent(t, "300"),
@ -771,12 +771,14 @@ func TestCRDB_Filter(t *testing.T) {
args: args{ args: args{
searchQuery: &repository.SearchQuery{ searchQuery: &repository.SearchQuery{
Columns: repository.ColumnsEvent, Columns: repository.ColumnsEvent,
Filters: []*repository.Filter{ Filters: [][]*repository.Filter{
{
repository.NewFilter(repository.FieldAggregateType, t.Name(), repository.OperationEquals), repository.NewFilter(repository.FieldAggregateType, t.Name(), repository.OperationEquals),
repository.NewFilter(repository.FieldAggregateID, "303", repository.OperationEquals), repository.NewFilter(repository.FieldAggregateID, "303", repository.OperationEquals),
}, },
}, },
}, },
},
fields: fields{ fields: fields{
existingEvents: []*repository.Event{ existingEvents: []*repository.Event{
generateEvent(t, "303"), generateEvent(t, "303"),
@ -837,11 +839,13 @@ func TestCRDB_LatestSequence(t *testing.T) {
args: args{ args: args{
searchQuery: &repository.SearchQuery{ searchQuery: &repository.SearchQuery{
Columns: repository.ColumnsMaxSequence, Columns: repository.ColumnsMaxSequence,
Filters: []*repository.Filter{ Filters: [][]*repository.Filter{
{
repository.NewFilter(repository.FieldAggregateType, "not found", repository.OperationEquals), repository.NewFilter(repository.FieldAggregateType, "not found", repository.OperationEquals),
}, },
}, },
}, },
},
fields: fields{ fields: fields{
existingEvents: []*repository.Event{ existingEvents: []*repository.Event{
generateEvent(t, "400"), generateEvent(t, "400"),
@ -859,11 +863,13 @@ func TestCRDB_LatestSequence(t *testing.T) {
args: args{ args: args{
searchQuery: &repository.SearchQuery{ searchQuery: &repository.SearchQuery{
Columns: repository.ColumnsMaxSequence, Columns: repository.ColumnsMaxSequence,
Filters: []*repository.Filter{ Filters: [][]*repository.Filter{
{
repository.NewFilter(repository.FieldAggregateType, t.Name(), repository.OperationEquals), repository.NewFilter(repository.FieldAggregateType, t.Name(), repository.OperationEquals),
}, },
}, },
}, },
},
fields: fields{ fields: fields{
existingEvents: []*repository.Event{ existingEvents: []*repository.Event{
generateEvent(t, "401"), generateEvent(t, "401"),
@ -1093,20 +1099,6 @@ func generateEvent(t *testing.T, aggregateID string, opts ...func(*repository.Ev
return e 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 { func generateAddUniqueConstraint(t *testing.T, table, uniqueField string) *repository.UniqueConstraint {
t.Helper() t.Helper()
e := &repository.UniqueConstraint{ e := &repository.UniqueConstraint{
@ -1128,22 +1120,3 @@ func generateRemoveUniqueConstraint(t *testing.T, table, uniqueField string) *re
return e 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
}

View File

@ -100,11 +100,6 @@ func fillUniqueData(unique_type, field string) error {
return err 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 migrationPaths []string
type version struct { type version struct {

View File

@ -9,7 +9,6 @@ import (
"strings" "strings"
"github.com/caos/logging" "github.com/caos/logging"
caos_errs "github.com/caos/zitadel/internal/errors"
z_errors "github.com/caos/zitadel/internal/errors" z_errors "github.com/caos/zitadel/internal/errors"
"github.com/caos/zitadel/internal/eventstore/repository" "github.com/caos/zitadel/internal/eventstore/repository"
"github.com/lib/pq" "github.com/lib/pq"
@ -26,14 +25,13 @@ type querier interface {
orderByEventSequence(desc bool) string orderByEventSequence(desc bool) string
} }
type rowScan func(scan, interface{}) error
type scan func(dest ...interface{}) error type scan func(dest ...interface{}) error
func query(ctx context.Context, criteria querier, searchQuery *repository.SearchQuery, dest interface{}) error { func query(ctx context.Context, criteria querier, searchQuery *repository.SearchQuery, dest interface{}) error {
query, rowScanner := prepareColumns(criteria, searchQuery.Columns) query, rowScanner := prepareColumns(criteria, searchQuery.Columns)
where, values := prepareCondition(criteria, searchQuery.Filters) where, values := prepareCondition(criteria, searchQuery.Filters)
if where == "" || query == "" { 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 query += where
@ -51,7 +49,7 @@ func query(ctx context.Context, criteria querier, searchQuery *repository.Search
rows, err := criteria.db().QueryContext(ctx, query, values...) rows, err := criteria.db().QueryContext(ctx, query, values...)
if err != nil { if err != nil {
logging.Log("SQL-HP3Uk").WithError(err).Info("query failed") 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() defer rows.Close()
@ -125,15 +123,18 @@ func eventsScanner(scanner scan, dest interface{}) (err error) {
return nil return nil
} }
func prepareCondition(criteria querier, filters []*repository.Filter) (clause string, values []interface{}) { func prepareCondition(criteria querier, filters [][]*repository.Filter) (clause string, values []interface{}) {
values = make([]interface{}, len(filters)) values = make([]interface{}, 0, len(filters))
clauses := make([]string, len(filters))
if len(filters) == 0 { if len(filters) == 0 {
return clause, values return clause, values
} }
for i, filter := range filters {
value := filter.Value 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) { switch value.(type) {
case []bool, []float64, []int64, []string, []repository.AggregateType, []repository.EventType, *[]bool, *[]float64, *[]int64, *[]string, *[]repository.AggregateType, *[]repository.EventType: case []bool, []float64, []int64, []string, []repository.AggregateType, []repository.EventType, *[]bool, *[]float64, *[]int64, *[]string, *[]repository.AggregateType, *[]repository.EventType:
value = pq.Array(value) value = pq.Array(value)
@ -141,15 +142,18 @@ func prepareCondition(criteria querier, filters []*repository.Filter) (clause st
var err error var err error
value, err = json.Marshal(value) value, err = json.Marshal(value)
logging.Log("SQL-BSsNy").OnError(err).Warn("unable to marshal search value") logging.Log("SQL-BSsNy").OnError(err).Warn("unable to marshal search value")
continue
} }
clauses[i] = getCondition(criteria, filter) subClauses = append(subClauses, getCondition(criteria, f))
if clauses[i] == "" { if subClauses[len(subClauses)-1] == "" {
return "", nil return "", nil
} }
values[i] = value values = append(values, value)
} }
return " WHERE " + strings.Join(clauses, " AND "), values clauses[idx] = "( " + strings.Join(subClauses, " AND ") + " )"
}
return " WHERE " + strings.Join(clauses, " OR "), values
} }
func getCondition(cond querier, filter *repository.Filter) (condition string) { func getCondition(cond querier, filter *repository.Filter) (condition string) {

View File

@ -208,7 +208,7 @@ func prepareTestScan(err error, res []interface{}) scan {
func Test_prepareCondition(t *testing.T) { func Test_prepareCondition(t *testing.T) {
type args struct { type args struct {
filters []*repository.Filter filters [][]*repository.Filter
} }
type res struct { type res struct {
clause string clause string
@ -232,7 +232,7 @@ func Test_prepareCondition(t *testing.T) {
{ {
name: "empty filters", name: "empty filters",
args: args{ args: args{
filters: []*repository.Filter{}, filters: [][]*repository.Filter{},
}, },
res: res{ res: res{
clause: "", clause: "",
@ -242,10 +242,12 @@ func Test_prepareCondition(t *testing.T) {
{ {
name: "invalid condition", name: "invalid condition",
args: args{ args: args{
filters: []*repository.Filter{ filters: [][]*repository.Filter{
{
repository.NewFilter(repository.FieldAggregateID, "wrong", repository.Operation(-1)), repository.NewFilter(repository.FieldAggregateID, "wrong", repository.Operation(-1)),
}, },
}, },
},
res: res{ res: res{
clause: "", clause: "",
values: nil, values: nil,
@ -254,26 +256,30 @@ func Test_prepareCondition(t *testing.T) {
{ {
name: "array as condition value", name: "array as condition value",
args: args{ args: args{
filters: []*repository.Filter{ filters: [][]*repository.Filter{
{
repository.NewFilter(repository.FieldAggregateType, []repository.AggregateType{"user", "org"}, repository.OperationIn), repository.NewFilter(repository.FieldAggregateType, []repository.AggregateType{"user", "org"}, repository.OperationIn),
}, },
}, },
},
res: res{ res: res{
clause: " WHERE aggregate_type = ANY(?)", clause: " WHERE ( aggregate_type = ANY(?) )",
values: []interface{}{pq.Array([]repository.AggregateType{"user", "org"})}, values: []interface{}{pq.Array([]repository.AggregateType{"user", "org"})},
}, },
}, },
{ {
name: "multiple filters", name: "multiple filters",
args: args{ args: args{
filters: []*repository.Filter{ filters: [][]*repository.Filter{
{
repository.NewFilter(repository.FieldAggregateType, []repository.AggregateType{"user", "org"}, repository.OperationIn), repository.NewFilter(repository.FieldAggregateType, []repository.AggregateType{"user", "org"}, repository.OperationIn),
repository.NewFilter(repository.FieldAggregateID, "1234", repository.OperationEquals), repository.NewFilter(repository.FieldAggregateID, "1234", repository.OperationEquals),
repository.NewFilter(repository.FieldEventType, []repository.EventType{"user.created", "org.created"}, repository.OperationIn), repository.NewFilter(repository.FieldEventType, []repository.EventType{"user.created", "org.created"}, repository.OperationIn),
}, },
}, },
},
res: res{ 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"})}, 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 { type fields struct {
existingEvents []*repository.Event existingEvents []*repository.Event
existingAssets []*repository.Asset
client *sql.DB client *sql.DB
} }
type res struct { type res struct {
@ -322,11 +327,13 @@ func Test_query_events_with_crdb(t *testing.T) {
args: args{ args: args{
searchQuery: &repository.SearchQuery{ searchQuery: &repository.SearchQuery{
Columns: repository.ColumnsEvent, Columns: repository.ColumnsEvent,
Filters: []*repository.Filter{ Filters: [][]*repository.Filter{
{
repository.NewFilter(repository.FieldAggregateType, "not found", repository.OperationEquals), repository.NewFilter(repository.FieldAggregateType, "not found", repository.OperationEquals),
}, },
}, },
}, },
},
fields: fields{ fields: fields{
client: testCRDBClient, client: testCRDBClient,
existingEvents: []*repository.Event{ existingEvents: []*repository.Event{
@ -345,11 +352,13 @@ func Test_query_events_with_crdb(t *testing.T) {
args: args{ args: args{
searchQuery: &repository.SearchQuery{ searchQuery: &repository.SearchQuery{
Columns: repository.ColumnsEvent, Columns: repository.ColumnsEvent,
Filters: []*repository.Filter{ Filters: [][]*repository.Filter{
{
repository.NewFilter(repository.FieldAggregateType, t.Name(), repository.OperationEquals), repository.NewFilter(repository.FieldAggregateType, t.Name(), repository.OperationEquals),
}, },
}, },
}, },
},
fields: fields{ fields: fields{
client: testCRDBClient, client: testCRDBClient,
existingEvents: []*repository.Event{ existingEvents: []*repository.Event{
@ -369,12 +378,14 @@ func Test_query_events_with_crdb(t *testing.T) {
args: args{ args: args{
searchQuery: &repository.SearchQuery{ searchQuery: &repository.SearchQuery{
Columns: repository.ColumnsEvent, Columns: repository.ColumnsEvent,
Filters: []*repository.Filter{ Filters: [][]*repository.Filter{
{
repository.NewFilter(repository.FieldAggregateType, t.Name(), repository.OperationEquals), repository.NewFilter(repository.FieldAggregateType, t.Name(), repository.OperationEquals),
repository.NewFilter(repository.FieldAggregateID, "303", repository.OperationEquals), repository.NewFilter(repository.FieldAggregateID, "303", repository.OperationEquals),
}, },
}, },
}, },
},
fields: fields{ fields: fields{
client: testCRDBClient, client: testCRDBClient,
existingEvents: []*repository.Event{ existingEvents: []*repository.Event{
@ -395,11 +406,13 @@ func Test_query_events_with_crdb(t *testing.T) {
args: args{ args: args{
searchQuery: &repository.SearchQuery{ searchQuery: &repository.SearchQuery{
Columns: repository.ColumnsEvent, Columns: repository.ColumnsEvent,
Filters: []*repository.Filter{ Filters: [][]*repository.Filter{
{
repository.NewFilter(repository.FieldResourceOwner, "caos", repository.OperationEquals), repository.NewFilter(repository.FieldResourceOwner, "caos", repository.OperationEquals),
}, },
}, },
}, },
},
fields: fields{ fields: fields{
client: testCRDBClient, client: testCRDBClient,
existingEvents: []*repository.Event{ existingEvents: []*repository.Event{
@ -420,12 +433,14 @@ func Test_query_events_with_crdb(t *testing.T) {
args: args{ args: args{
searchQuery: &repository.SearchQuery{ searchQuery: &repository.SearchQuery{
Columns: repository.ColumnsEvent, Columns: repository.ColumnsEvent,
Filters: []*repository.Filter{ Filters: [][]*repository.Filter{
{
repository.NewFilter(repository.FieldEditorService, "MANAGEMENT-API", repository.OperationEquals), repository.NewFilter(repository.FieldEditorService, "MANAGEMENT-API", repository.OperationEquals),
repository.NewFilter(repository.FieldEditorService, "ADMIN-API", repository.OperationEquals), repository.NewFilter(repository.FieldEditorService, "ADMIN-API", repository.OperationEquals),
}, },
}, },
}, },
},
fields: fields{ fields: fields{
client: testCRDBClient, client: testCRDBClient,
existingEvents: []*repository.Event{ existingEvents: []*repository.Event{
@ -446,13 +461,15 @@ func Test_query_events_with_crdb(t *testing.T) {
args: args{ args: args{
searchQuery: &repository.SearchQuery{ searchQuery: &repository.SearchQuery{
Columns: repository.ColumnsEvent, Columns: repository.ColumnsEvent,
Filters: []*repository.Filter{ Filters: [][]*repository.Filter{
{
repository.NewFilter(repository.FieldEditorUser, "adlerhurst", repository.OperationEquals), repository.NewFilter(repository.FieldEditorUser, "adlerhurst", repository.OperationEquals),
repository.NewFilter(repository.FieldEditorUser, "nobody", repository.OperationEquals), repository.NewFilter(repository.FieldEditorUser, "nobody", repository.OperationEquals),
repository.NewFilter(repository.FieldEditorUser, "", repository.OperationEquals), repository.NewFilter(repository.FieldEditorUser, "", repository.OperationEquals),
}, },
}, },
}, },
},
fields: fields{ fields: fields{
client: testCRDBClient, client: testCRDBClient,
existingEvents: []*repository.Event{ existingEvents: []*repository.Event{
@ -475,12 +492,14 @@ func Test_query_events_with_crdb(t *testing.T) {
args: args{ args: args{
searchQuery: &repository.SearchQuery{ searchQuery: &repository.SearchQuery{
Columns: repository.ColumnsEvent, Columns: repository.ColumnsEvent,
Filters: []*repository.Filter{ Filters: [][]*repository.Filter{
{
repository.NewFilter(repository.FieldEventType, repository.EventType("user.created"), repository.OperationEquals), repository.NewFilter(repository.FieldEventType, repository.EventType("user.created"), repository.OperationEquals),
repository.NewFilter(repository.FieldEventType, repository.EventType("user.updated"), repository.OperationEquals), repository.NewFilter(repository.FieldEventType, repository.EventType("user.updated"), repository.OperationEquals),
}, },
}, },
}, },
},
fields: fields{ fields: fields{
client: testCRDBClient, client: testCRDBClient,
existingEvents: []*repository.Event{ existingEvents: []*repository.Event{
@ -559,7 +578,8 @@ func Test_query_events_mocked(t *testing.T) {
query: &repository.SearchQuery{ query: &repository.SearchQuery{
Columns: repository.ColumnsEvent, Columns: repository.ColumnsEvent,
Desc: true, Desc: true,
Filters: []*repository.Filter{ Filters: [][]*repository.Filter{
{
{ {
Field: repository.FieldAggregateType, Field: repository.FieldAggregateType,
Value: repository.AggregateType("user"), Value: repository.AggregateType("user"),
@ -568,9 +588,10 @@ func Test_query_events_mocked(t *testing.T) {
}, },
}, },
}, },
},
fields: fields{ fields: fields{
mock: newMockClient(t).expectQuery(t, 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")}, []driver.Value{repository.AggregateType("user")},
), ),
}, },
@ -586,7 +607,8 @@ func Test_query_events_mocked(t *testing.T) {
Columns: repository.ColumnsEvent, Columns: repository.ColumnsEvent,
Desc: false, Desc: false,
Limit: 5, Limit: 5,
Filters: []*repository.Filter{ Filters: [][]*repository.Filter{
{
{ {
Field: repository.FieldAggregateType, Field: repository.FieldAggregateType,
Value: repository.AggregateType("user"), Value: repository.AggregateType("user"),
@ -595,9 +617,10 @@ func Test_query_events_mocked(t *testing.T) {
}, },
}, },
}, },
},
fields: fields{ fields: fields{
mock: newMockClient(t).expectQuery(t, 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)}, []driver.Value{repository.AggregateType("user"), uint64(5)},
), ),
}, },
@ -613,7 +636,8 @@ func Test_query_events_mocked(t *testing.T) {
Columns: repository.ColumnsEvent, Columns: repository.ColumnsEvent,
Desc: true, Desc: true,
Limit: 5, Limit: 5,
Filters: []*repository.Filter{ Filters: [][]*repository.Filter{
{
{ {
Field: repository.FieldAggregateType, Field: repository.FieldAggregateType,
Value: repository.AggregateType("user"), Value: repository.AggregateType("user"),
@ -622,9 +646,10 @@ func Test_query_events_mocked(t *testing.T) {
}, },
}, },
}, },
},
fields: fields{ fields: fields{
mock: newMockClient(t).expectQuery(t, 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)}, []driver.Value{repository.AggregateType("user"), uint64(5)},
), ),
}, },
@ -640,7 +665,8 @@ func Test_query_events_mocked(t *testing.T) {
Columns: repository.ColumnsEvent, Columns: repository.ColumnsEvent,
Desc: true, Desc: true,
Limit: 0, Limit: 0,
Filters: []*repository.Filter{ Filters: [][]*repository.Filter{
{
{ {
Field: repository.FieldAggregateType, Field: repository.FieldAggregateType,
Value: repository.AggregateType("user"), Value: repository.AggregateType("user"),
@ -649,9 +675,10 @@ func Test_query_events_mocked(t *testing.T) {
}, },
}, },
}, },
},
fields: fields{ fields: fields{
mock: newMockClient(t).expectQueryErr(t, 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")}, []driver.Value{repository.AggregateType("user")},
sql.ErrConnDone), sql.ErrConnDone),
}, },
@ -667,7 +694,8 @@ func Test_query_events_mocked(t *testing.T) {
Columns: repository.ColumnsEvent, Columns: repository.ColumnsEvent,
Desc: true, Desc: true,
Limit: 0, Limit: 0,
Filters: []*repository.Filter{ Filters: [][]*repository.Filter{
{
{ {
Field: repository.FieldAggregateType, Field: repository.FieldAggregateType,
Value: repository.AggregateType("user"), Value: repository.AggregateType("user"),
@ -676,9 +704,10 @@ func Test_query_events_mocked(t *testing.T) {
}, },
}, },
}, },
},
fields: fields{ fields: fields{
mock: newMockClient(t).expectQuery(t, 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")}, []driver.Value{repository.AggregateType("user")},
&repository.Event{Sequence: 100}), &repository.Event{Sequence: 100}),
}, },
@ -702,15 +731,58 @@ func Test_query_events_mocked(t *testing.T) {
args: args{ args: args{
query: &repository.SearchQuery{ query: &repository.SearchQuery{
Columns: repository.ColumnsEvent, Columns: repository.ColumnsEvent,
Filters: []*repository.Filter{ Filters: [][]*repository.Filter{
{
{}, {},
}, },
}, },
}, },
},
res: res{ res: res{
wantErr: true, 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 { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {

View File

@ -11,12 +11,17 @@ type SearchQueryBuilder struct {
columns repository.Columns columns repository.Columns
limit uint64 limit uint64
desc bool desc bool
resourceOwner string
queries []*SearchQuery
}
type SearchQuery struct {
builder *SearchQueryBuilder
aggregateTypes []AggregateType aggregateTypes []AggregateType
aggregateIDs []string aggregateIDs []string
eventSequence uint64 eventSequence uint64
eventTypes []EventType eventTypes []EventType
eventData map[string]interface{} eventData map[string]interface{}
resourceOwner string
} }
// Columns defines which fields of the event are needed for the query // Columns defines which fields of the event are needed for the query
@ -37,83 +42,122 @@ type EventType repository.EventType
// NewSearchQueryBuilder creates a new factory for event filters // NewSearchQueryBuilder creates a new factory for event filters
// aggregateTypes must contain at least one aggregate type // aggregateTypes must contain at least one aggregate type
func NewSearchQueryBuilder(columns Columns, aggregateTypes ...AggregateType) *SearchQueryBuilder { func NewSearchQueryBuilder(columns Columns) *SearchQueryBuilder {
return &SearchQueryBuilder{ return &SearchQueryBuilder{
columns: repository.Columns(columns), columns: repository.Columns(columns),
aggregateTypes: aggregateTypes,
} }
} }
//Columns defines which fields are set
func (factory *SearchQueryBuilder) Columns(columns Columns) *SearchQueryBuilder { func (factory *SearchQueryBuilder) Columns(columns Columns) *SearchQueryBuilder {
factory.columns = repository.Columns(columns) factory.columns = repository.Columns(columns)
return factory return factory
} }
//Limit defines how many events are returned maximally.
func (factory *SearchQueryBuilder) Limit(limit uint64) *SearchQueryBuilder { func (factory *SearchQueryBuilder) Limit(limit uint64) *SearchQueryBuilder {
factory.limit = limit factory.limit = limit
return factory return factory
} }
func (factory *SearchQueryBuilder) SequenceGreater(sequence uint64) *SearchQueryBuilder { //ResourceOwner defines the resource owner (org) of the events
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
}
func (factory *SearchQueryBuilder) ResourceOwner(resourceOwner string) *SearchQueryBuilder { func (factory *SearchQueryBuilder) ResourceOwner(resourceOwner string) *SearchQueryBuilder {
factory.resourceOwner = resourceOwner factory.resourceOwner = resourceOwner
return factory return factory
} }
//OrderDesc changes the sorting order of the returned events to descending
func (factory *SearchQueryBuilder) OrderDesc() *SearchQueryBuilder { func (factory *SearchQueryBuilder) OrderDesc() *SearchQueryBuilder {
factory.desc = true factory.desc = true
return factory return factory
} }
//OrderAsc changes the sorting order of the returned events to ascending
func (factory *SearchQueryBuilder) OrderAsc() *SearchQueryBuilder { func (factory *SearchQueryBuilder) OrderAsc() *SearchQueryBuilder {
factory.desc = false factory.desc = false
return factory return factory
} }
func (factory *SearchQueryBuilder) EventData(query map[string]interface{}) *SearchQueryBuilder { //AddQuery creates a new sub query.
factory.eventData = query //All fields in the sub query are AND-connected in the storage request.
return factory //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) { func (factory *SearchQueryBuilder) build() (*repository.SearchQuery, error) {
if factory == nil || if factory == nil ||
len(factory.aggregateTypes) < 1 || len(factory.queries) < 1 ||
factory.columns.Validate() != nil { factory.columns.Validate() != nil {
return nil, errors.ThrowPreconditionFailed(nil, "MODEL-4m9gs", "factory invalid") return nil, errors.ThrowPreconditionFailed(nil, "MODEL-4m9gs", "factory invalid")
} }
filters := []*repository.Filter{ filters := make([][]*repository.Filter, len(factory.queries))
factory.aggregateTypeFilter(),
}
for i, query := range factory.queries {
for _, f := range []func() *repository.Filter{ for _, f := range []func() *repository.Filter{
factory.aggregateIDFilter, query.aggregateTypeFilter,
factory.eventSequenceFilter, query.aggregateIDFilter,
factory.eventTypeFilter, query.eventSequenceFilter,
factory.resourceOwnerFilter, query.eventTypeFilter,
factory.eventDataFilter, query.eventDataFilter,
query.builder.resourceOwnerFilter,
} { } {
if filter := f(); filter != nil { if filter := f(); filter != nil {
if err := filter.Validate(); err != nil { if err := filter.Validate(); err != nil {
return nil, err return nil, err
} }
filters = append(filters, filter) filters[i] = append(filters[i], filter)
} }
} }
}
return &repository.SearchQuery{ return &repository.SearchQuery{
Columns: factory.columns, Columns: factory.columns,
Limit: factory.limit, Limit: factory.limit,
@ -122,50 +166,50 @@ func (factory *SearchQueryBuilder) build() (*repository.SearchQuery, error) {
}, nil }, nil
} }
func (factory *SearchQueryBuilder) aggregateIDFilter() *repository.Filter { func (query *SearchQuery) aggregateIDFilter() *repository.Filter {
if len(factory.aggregateIDs) < 1 { if len(query.aggregateIDs) < 1 {
return nil return nil
} }
if len(factory.aggregateIDs) == 1 { if len(query.aggregateIDs) == 1 {
return repository.NewFilter(repository.FieldAggregateID, factory.aggregateIDs[0], repository.OperationEquals) 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 { func (query *SearchQuery) eventTypeFilter() *repository.Filter {
if len(factory.eventTypes) < 1 { if len(query.eventTypes) < 1 {
return nil return nil
} }
if len(factory.eventTypes) == 1 { if len(query.eventTypes) == 1 {
return repository.NewFilter(repository.FieldEventType, repository.EventType(factory.eventTypes[0]), repository.OperationEquals) return repository.NewFilter(repository.FieldEventType, repository.EventType(query.eventTypes[0]), repository.OperationEquals)
} }
eventTypes := make([]repository.EventType, len(factory.eventTypes)) eventTypes := make([]repository.EventType, len(query.eventTypes))
for i, eventType := range factory.eventTypes { for i, eventType := range query.eventTypes {
eventTypes[i] = repository.EventType(eventType) eventTypes[i] = repository.EventType(eventType)
} }
return repository.NewFilter(repository.FieldEventType, eventTypes, repository.OperationIn) return repository.NewFilter(repository.FieldEventType, eventTypes, repository.OperationIn)
} }
func (factory *SearchQueryBuilder) aggregateTypeFilter() *repository.Filter { func (query *SearchQuery) aggregateTypeFilter() *repository.Filter {
if len(factory.aggregateTypes) == 1 { if len(query.aggregateTypes) == 1 {
return repository.NewFilter(repository.FieldAggregateType, repository.AggregateType(factory.aggregateTypes[0]), repository.OperationEquals) return repository.NewFilter(repository.FieldAggregateType, repository.AggregateType(query.aggregateTypes[0]), repository.OperationEquals)
} }
aggregateTypes := make([]repository.AggregateType, len(factory.aggregateTypes)) aggregateTypes := make([]repository.AggregateType, len(query.aggregateTypes))
for i, aggregateType := range factory.aggregateTypes { for i, aggregateType := range query.aggregateTypes {
aggregateTypes[i] = repository.AggregateType(aggregateType) aggregateTypes[i] = repository.AggregateType(aggregateType)
} }
return repository.NewFilter(repository.FieldAggregateType, aggregateTypes, repository.OperationIn) return repository.NewFilter(repository.FieldAggregateType, aggregateTypes, repository.OperationIn)
} }
func (factory *SearchQueryBuilder) eventSequenceFilter() *repository.Filter { func (query *SearchQuery) eventSequenceFilter() *repository.Filter {
if factory.eventSequence == 0 { if query.eventSequence == 0 {
return nil return nil
} }
sortOrder := repository.OperationGreater sortOrder := repository.OperationGreater
if factory.desc { if query.builder.desc {
sortOrder = repository.OperationLess 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 { 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) return repository.NewFilter(repository.FieldResourceOwner, factory.resourceOwner, repository.OperationEquals)
} }
func (factory *SearchQueryBuilder) eventDataFilter() *repository.Filter { func (query *SearchQuery) eventDataFilter() *repository.Filter {
if len(factory.eventData) == 0 { if len(query.eventData) == 0 {
return nil return nil
} }
return repository.NewFilter(repository.FieldEventData, factory.eventData, repository.OperationJSONContains) return repository.NewFilter(repository.FieldEventData, query.eventData, repository.OperationJSONContains)
} }

View File

@ -9,6 +9,16 @@ import (
"github.com/caos/zitadel/internal/eventstore/repository" "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 { func testSetColumns(columns Columns) func(factory *SearchQueryBuilder) *SearchQueryBuilder {
return func(factory *SearchQueryBuilder) *SearchQueryBuilder { return func(factory *SearchQueryBuilder) *SearchQueryBuilder {
factory = factory.Columns(columns) factory = factory.Columns(columns)
@ -23,49 +33,65 @@ func testSetLimit(limit uint64) func(factory *SearchQueryBuilder) *SearchQueryBu
} }
} }
func testSetSequence(sequence uint64) func(factory *SearchQueryBuilder) *SearchQueryBuilder { func testOr(queryFuncs ...func(*SearchQuery) *SearchQuery) func(*SearchQuery) *SearchQuery {
return func(factory *SearchQueryBuilder) *SearchQueryBuilder { return func(query *SearchQuery) *SearchQuery {
factory = factory.SequenceGreater(sequence) subQuery := query.Or()
return factory for _, queryFunc := range queryFuncs {
queryFunc(subQuery)
}
return subQuery
} }
} }
func testSetAggregateIDs(aggregateIDs ...string) func(factory *SearchQueryBuilder) *SearchQueryBuilder { func testSetAggregateTypes(types ...AggregateType) func(*SearchQuery) *SearchQuery {
return func(factory *SearchQueryBuilder) *SearchQueryBuilder { return func(query *SearchQuery) *SearchQuery {
factory = factory.AggregateIDs(aggregateIDs...) query = query.AggregateTypes(types...)
return factory return query
} }
} }
func testSetEventTypes(eventTypes ...EventType) func(factory *SearchQueryBuilder) *SearchQueryBuilder { func testSetSequence(sequence uint64) func(*SearchQuery) *SearchQuery {
return func(factory *SearchQueryBuilder) *SearchQueryBuilder { return func(query *SearchQuery) *SearchQuery {
factory = factory.EventTypes(eventTypes...) query = query.SequenceGreater(sequence)
return factory return query
} }
} }
func testSetResourceOwner(resourceOwner string) func(factory *SearchQueryBuilder) *SearchQueryBuilder { func testSetAggregateIDs(aggregateIDs ...string) func(*SearchQuery) *SearchQuery {
return func(factory *SearchQueryBuilder) *SearchQueryBuilder { return func(query *SearchQuery) *SearchQuery {
factory = factory.ResourceOwner(resourceOwner) query = query.AggregateIDs(aggregateIDs...)
return factory return query
} }
} }
func testSetSortOrder(asc bool) func(factory *SearchQueryBuilder) *SearchQueryBuilder { func testSetEventTypes(eventTypes ...EventType) func(*SearchQuery) *SearchQuery {
return func(factory *SearchQueryBuilder) *SearchQueryBuilder { 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 { if asc {
factory = factory.OrderAsc() query = query.OrderAsc()
} else { } else {
factory = factory.OrderDesc() query = query.OrderDesc()
} }
return factory return query
} }
} }
func TestSearchQueryFactorySetters(t *testing.T) { func TestSearchQueryFactorySetters(t *testing.T) {
type args struct { type args struct {
columns Columns columns Columns
aggregateTypes []AggregateType
setters []func(*SearchQueryBuilder) *SearchQueryBuilder setters []func(*SearchQueryBuilder) *SearchQueryBuilder
} }
tests := []struct { tests := []struct {
@ -77,11 +103,9 @@ func TestSearchQueryFactorySetters(t *testing.T) {
name: "New factory", name: "New factory",
args: args{ args: args{
columns: ColumnsEvent, columns: ColumnsEvent,
aggregateTypes: []AggregateType{"user", "org"},
}, },
res: &SearchQueryBuilder{ res: &SearchQueryBuilder{
columns: repository.Columns(ColumnsEvent), columns: repository.Columns(ColumnsEvent),
aggregateTypes: []AggregateType{"user", "org"},
}, },
}, },
{ {
@ -105,30 +129,42 @@ func TestSearchQueryFactorySetters(t *testing.T) {
{ {
name: "set sequence", name: "set sequence",
args: args{ args: args{
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{testSetSequence(90)}, setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{testAddQuery(testSetSequence(90))},
}, },
res: &SearchQueryBuilder{ res: &SearchQueryBuilder{
queries: []*SearchQuery{
{
eventSequence: 90, eventSequence: 90,
}, },
}, },
},
},
{ {
name: "set aggregateIDs", name: "set aggregateIDs",
args: args{ args: args{
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{testSetAggregateIDs("1235", "09824")}, setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{testAddQuery(testSetAggregateIDs("1235", "09824"))},
}, },
res: &SearchQueryBuilder{ res: &SearchQueryBuilder{
queries: []*SearchQuery{
{
aggregateIDs: []string{"1235", "09824"}, aggregateIDs: []string{"1235", "09824"},
}, },
}, },
},
},
{ {
name: "set eventTypes", name: "set eventTypes",
args: args{ args: args{
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{testSetEventTypes("user.created", "user.updated")}, setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{testAddQuery(testSetEventTypes("user.created", "user.updated"))},
}, },
res: &SearchQueryBuilder{ res: &SearchQueryBuilder{
queries: []*SearchQuery{
{
eventTypes: []EventType{"user.created", "user.updated"}, eventTypes: []EventType{"user.created", "user.updated"},
}, },
}, },
},
},
{ {
name: "set resource owner", name: "set resource owner",
args: args{ args: args{
@ -141,25 +177,27 @@ func TestSearchQueryFactorySetters(t *testing.T) {
{ {
name: "default search query", name: "default search query",
args: args{ args: args{
aggregateTypes: []AggregateType{"user"}, setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{testAddQuery(testSetAggregateTypes("user"), testSetAggregateIDs("1235", "024")), testSetSortOrder(false)},
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{testSetAggregateIDs("1235", "024"), testSetSortOrder(false)},
}, },
res: &SearchQueryBuilder{ res: &SearchQueryBuilder{
desc: true,
queries: []*SearchQuery{
{
aggregateTypes: []AggregateType{"user"}, aggregateTypes: []AggregateType{"user"},
aggregateIDs: []string{"1235", "024"}, aggregateIDs: []string{"1235", "024"},
desc: true, },
},
}, },
}, },
} }
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { 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 { for _, setter := range tt.args.setters {
factory = setter(factory) builder = setter(builder)
}
if !reflect.DeepEqual(factory, tt.res) {
t.Errorf("NewSearchQueryFactory() = %v, want %v", factory, tt.res)
} }
assertBuilder(t, tt.res, builder)
}) })
} }
} }
@ -167,7 +205,6 @@ func TestSearchQueryFactorySetters(t *testing.T) {
func TestSearchQueryFactoryBuild(t *testing.T) { func TestSearchQueryFactoryBuild(t *testing.T) {
type args struct { type args struct {
columns Columns columns Columns
aggregateTypes []AggregateType
setters []func(*SearchQueryBuilder) *SearchQueryBuilder setters []func(*SearchQueryBuilder) *SearchQueryBuilder
} }
type res struct { type res struct {
@ -183,7 +220,6 @@ func TestSearchQueryFactoryBuild(t *testing.T) {
name: "no aggregate types", name: "no aggregate types",
args: args{ args: args{
columns: ColumnsEvent, columns: ColumnsEvent,
aggregateTypes: []AggregateType{},
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{}, setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{},
}, },
res: res{ res: res{
@ -195,9 +231,9 @@ func TestSearchQueryFactoryBuild(t *testing.T) {
name: "invalid column (too low)", name: "invalid column (too low)",
args: args{ args: args{
columns: ColumnsEvent, columns: ColumnsEvent,
aggregateTypes: []AggregateType{"user"},
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{ setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{
testSetColumns(Columns(-1)), testSetColumns(Columns(-1)),
testAddQuery(testSetAggregateTypes("user")),
}, },
}, },
res: res{ res: res{
@ -208,9 +244,9 @@ func TestSearchQueryFactoryBuild(t *testing.T) {
name: "invalid column (too high)", name: "invalid column (too high)",
args: args{ args: args{
columns: ColumnsEvent, columns: ColumnsEvent,
aggregateTypes: []AggregateType{"user"},
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{ setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{
testSetColumns(math.MaxInt32), testSetColumns(math.MaxInt32),
testAddQuery(testSetAggregateTypes("uesr")),
}, },
}, },
res: res{ res: res{
@ -221,8 +257,9 @@ func TestSearchQueryFactoryBuild(t *testing.T) {
name: "filter aggregate type", name: "filter aggregate type",
args: args{ args: args{
columns: ColumnsEvent, columns: ColumnsEvent,
aggregateTypes: []AggregateType{"user"}, setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{}, testAddQuery(testSetAggregateTypes("user")),
},
}, },
res: res{ res: res{
isErr: nil, isErr: nil,
@ -230,18 +267,21 @@ func TestSearchQueryFactoryBuild(t *testing.T) {
Columns: repository.ColumnsEvent, Columns: repository.ColumnsEvent,
Desc: false, Desc: false,
Limit: 0, Limit: 0,
Filters: []*repository.Filter{ Filters: [][]*repository.Filter{
{
repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals), repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals),
}, },
}, },
}, },
}, },
},
{ {
name: "filter aggregate types", name: "filter aggregate types",
args: args{ args: args{
columns: ColumnsEvent, columns: ColumnsEvent,
aggregateTypes: []AggregateType{"user", "org"}, setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{}, testAddQuery(testSetAggregateTypes("user", "org")),
},
}, },
res: res{ res: res{
isErr: nil, isErr: nil,
@ -249,21 +289,25 @@ func TestSearchQueryFactoryBuild(t *testing.T) {
Columns: repository.ColumnsEvent, Columns: repository.ColumnsEvent,
Desc: false, Desc: false,
Limit: 0, Limit: 0,
Filters: []*repository.Filter{ Filters: [][]*repository.Filter{
{
repository.NewFilter(repository.FieldAggregateType, []repository.AggregateType{"user", "org"}, repository.OperationIn), repository.NewFilter(repository.FieldAggregateType, []repository.AggregateType{"user", "org"}, repository.OperationIn),
}, },
}, },
}, },
}, },
},
{ {
name: "filter aggregate type, limit, desc", name: "filter aggregate type, limit, desc",
args: args{ args: args{
columns: ColumnsEvent, columns: ColumnsEvent,
aggregateTypes: []AggregateType{"user"},
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{ setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{
testSetLimit(5), testSetLimit(5),
testSetSortOrder(false), testSetSortOrder(false),
testAddQuery(
testSetSequence(100), testSetSequence(100),
testSetAggregateTypes("user"),
),
}, },
}, },
res: res{ res: res{
@ -272,22 +316,26 @@ func TestSearchQueryFactoryBuild(t *testing.T) {
Columns: repository.ColumnsEvent, Columns: repository.ColumnsEvent,
Desc: true, Desc: true,
Limit: 5, Limit: 5,
Filters: []*repository.Filter{ Filters: [][]*repository.Filter{
{
repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals), repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals),
repository.NewFilter(repository.FieldSequence, uint64(100), repository.OperationLess), repository.NewFilter(repository.FieldSequence, uint64(100), repository.OperationLess),
}, },
}, },
}, },
}, },
},
{ {
name: "filter aggregate type, limit, asc", name: "filter aggregate type, limit, asc",
args: args{ args: args{
columns: ColumnsEvent, columns: ColumnsEvent,
aggregateTypes: []AggregateType{"user"},
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{ setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{
testSetLimit(5), testSetLimit(5),
testSetSortOrder(true), testSetSortOrder(true),
testAddQuery(
testSetSequence(100), testSetSequence(100),
testSetAggregateTypes("user"),
),
}, },
}, },
res: res{ res: res{
@ -296,23 +344,27 @@ func TestSearchQueryFactoryBuild(t *testing.T) {
Columns: repository.ColumnsEvent, Columns: repository.ColumnsEvent,
Desc: false, Desc: false,
Limit: 5, Limit: 5,
Filters: []*repository.Filter{ Filters: [][]*repository.Filter{
{
repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals), repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals),
repository.NewFilter(repository.FieldSequence, uint64(100), repository.OperationGreater), repository.NewFilter(repository.FieldSequence, uint64(100), repository.OperationGreater),
}, },
}, },
}, },
}, },
},
{ {
name: "filter aggregate type, limit, desc, max event sequence cols", name: "filter aggregate type, limit, desc, max event sequence cols",
args: args{ args: args{
columns: ColumnsEvent, columns: ColumnsEvent,
aggregateTypes: []AggregateType{"user"},
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{ setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{
testSetLimit(5), testSetLimit(5),
testSetSortOrder(false), testSetSortOrder(false),
testSetSequence(100),
testSetColumns(repository.ColumnsMaxSequence), testSetColumns(repository.ColumnsMaxSequence),
testAddQuery(
testSetSequence(100),
testSetAggregateTypes("user"),
),
}, },
}, },
res: res{ res: res{
@ -321,20 +373,24 @@ func TestSearchQueryFactoryBuild(t *testing.T) {
Columns: repository.ColumnsMaxSequence, Columns: repository.ColumnsMaxSequence,
Desc: true, Desc: true,
Limit: 5, Limit: 5,
Filters: []*repository.Filter{ Filters: [][]*repository.Filter{
{
repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals), repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals),
repository.NewFilter(repository.FieldSequence, uint64(100), repository.OperationLess), repository.NewFilter(repository.FieldSequence, uint64(100), repository.OperationLess),
}, },
}, },
}, },
}, },
},
{ {
name: "filter aggregate type and aggregate id", name: "filter aggregate type and aggregate id",
args: args{ args: args{
columns: ColumnsEvent, columns: ColumnsEvent,
aggregateTypes: []AggregateType{"user"},
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{ setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{
testAddQuery(
testSetAggregateTypes("user"),
testSetAggregateIDs("1234"), testSetAggregateIDs("1234"),
),
}, },
}, },
res: res{ res: res{
@ -343,20 +399,58 @@ func TestSearchQueryFactoryBuild(t *testing.T) {
Columns: repository.ColumnsEvent, Columns: repository.ColumnsEvent,
Desc: false, Desc: false,
Limit: 0, Limit: 0,
Filters: []*repository.Filter{ Filters: [][]*repository.Filter{
{
repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals), repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals),
repository.NewFilter(repository.FieldAggregateID, "1234", 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),
},
},
},
},
},
{ {
name: "filter aggregate type and aggregate ids", name: "filter aggregate type and aggregate ids",
args: args{ args: args{
columns: ColumnsEvent, columns: ColumnsEvent,
aggregateTypes: []AggregateType{"user"},
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{ setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{
testAddQuery(
testSetAggregateTypes("user"),
testSetAggregateIDs("1234", "0815"), testSetAggregateIDs("1234", "0815"),
),
}, },
}, },
res: res{ res: res{
@ -365,20 +459,24 @@ func TestSearchQueryFactoryBuild(t *testing.T) {
Columns: repository.ColumnsEvent, Columns: repository.ColumnsEvent,
Desc: false, Desc: false,
Limit: 0, Limit: 0,
Filters: []*repository.Filter{ Filters: [][]*repository.Filter{
{
repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals), repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals),
repository.NewFilter(repository.FieldAggregateID, []string{"1234", "0815"}, repository.OperationIn), repository.NewFilter(repository.FieldAggregateID, []string{"1234", "0815"}, repository.OperationIn),
}, },
}, },
}, },
}, },
},
{ {
name: "filter aggregate type and sequence greater", name: "filter aggregate type and sequence greater",
args: args{ args: args{
columns: ColumnsEvent, columns: ColumnsEvent,
aggregateTypes: []AggregateType{"user"},
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{ setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{
testAddQuery(
testSetAggregateTypes("user"),
testSetSequence(8), testSetSequence(8),
),
}, },
}, },
res: res{ res: res{
@ -387,20 +485,24 @@ func TestSearchQueryFactoryBuild(t *testing.T) {
Columns: repository.ColumnsEvent, Columns: repository.ColumnsEvent,
Desc: false, Desc: false,
Limit: 0, Limit: 0,
Filters: []*repository.Filter{ Filters: [][]*repository.Filter{
{
repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals), repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals),
repository.NewFilter(repository.FieldSequence, uint64(8), repository.OperationGreater), repository.NewFilter(repository.FieldSequence, uint64(8), repository.OperationGreater),
}, },
}, },
}, },
}, },
},
{ {
name: "filter aggregate type and event type", name: "filter aggregate type and event type",
args: args{ args: args{
columns: ColumnsEvent, columns: ColumnsEvent,
aggregateTypes: []AggregateType{"user"},
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{ setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{
testAddQuery(
testSetAggregateTypes("user"),
testSetEventTypes("user.created"), testSetEventTypes("user.created"),
),
}, },
}, },
res: res{ res: res{
@ -409,20 +511,24 @@ func TestSearchQueryFactoryBuild(t *testing.T) {
Columns: repository.ColumnsEvent, Columns: repository.ColumnsEvent,
Desc: false, Desc: false,
Limit: 0, Limit: 0,
Filters: []*repository.Filter{ Filters: [][]*repository.Filter{
{
repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals), repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals),
repository.NewFilter(repository.FieldEventType, repository.EventType("user.created"), repository.OperationEquals), repository.NewFilter(repository.FieldEventType, repository.EventType("user.created"), repository.OperationEquals),
}, },
}, },
}, },
}, },
},
{ {
name: "filter aggregate type and event types", name: "filter aggregate type and event types",
args: args{ args: args{
columns: ColumnsEvent, columns: ColumnsEvent,
aggregateTypes: []AggregateType{"user"},
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{ setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{
testAddQuery(
testSetAggregateTypes("user"),
testSetEventTypes("user.created", "user.changed"), testSetEventTypes("user.created", "user.changed"),
),
}, },
}, },
res: res{ res: res{
@ -431,20 +537,24 @@ func TestSearchQueryFactoryBuild(t *testing.T) {
Columns: repository.ColumnsEvent, Columns: repository.ColumnsEvent,
Desc: false, Desc: false,
Limit: 0, Limit: 0,
Filters: []*repository.Filter{ Filters: [][]*repository.Filter{
{
repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals), repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals),
repository.NewFilter(repository.FieldEventType, []repository.EventType{"user.created", "user.changed"}, repository.OperationIn), repository.NewFilter(repository.FieldEventType, []repository.EventType{"user.created", "user.changed"}, repository.OperationIn),
}, },
}, },
}, },
}, },
},
{ {
name: "filter aggregate type resource owner", name: "filter aggregate type resource owner",
args: args{ args: args{
columns: ColumnsEvent, columns: ColumnsEvent,
aggregateTypes: []AggregateType{"user"},
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{ setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{
testSetResourceOwner("hodor"), testSetResourceOwner("hodor"),
testAddQuery(
testSetAggregateTypes("user"),
),
}, },
}, },
res: res{ res: res{
@ -453,18 +563,24 @@ func TestSearchQueryFactoryBuild(t *testing.T) {
Columns: repository.ColumnsEvent, Columns: repository.ColumnsEvent,
Desc: false, Desc: false,
Limit: 0, Limit: 0,
Filters: []*repository.Filter{ Filters: [][]*repository.Filter{
{
repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals), repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals),
repository.NewFilter(repository.FieldResourceOwner, "hodor", repository.OperationEquals), repository.NewFilter(repository.FieldResourceOwner, "hodor", repository.OperationEquals),
}, },
}, },
}, },
}, },
},
{ {
name: "column invalid", name: "column invalid",
args: args{ args: args{
columns: Columns(-1), columns: Columns(-1),
aggregateTypes: []AggregateType{"user"}, setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{
testAddQuery(
testSetAggregateTypes("user"),
),
},
}, },
res: res{ res: res{
isErr: errors.IsPreconditionFailed, isErr: errors.IsPreconditionFailed,
@ -473,7 +589,7 @@ func TestSearchQueryFactoryBuild(t *testing.T) {
} }
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { 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 { for _, f := range tt.args.setters {
factory = f(factory) factory = f(factory)
} }
@ -487,9 +603,96 @@ func TestSearchQueryFactoryBuild(t *testing.T) {
return return
} }
if !reflect.DeepEqual(query, tt.res.query) { assertRepoQuery(t, tt.res.query, query)
t.Errorf("NewSearchQueryFactory() = %+v, want %+v", factory, tt.res.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)
}
}

View File

@ -1,9 +1,10 @@
package eventstore package eventstore
import ( import (
"sync"
v1 "github.com/caos/zitadel/internal/eventstore/v1" v1 "github.com/caos/zitadel/internal/eventstore/v1"
"github.com/caos/zitadel/internal/eventstore/v1/models" "github.com/caos/zitadel/internal/eventstore/v1/models"
"sync"
) )
var ( var (

View File

@ -16,8 +16,6 @@ type UniqueConstraintAction int32
const ( const (
UniqueConstraintAdd UniqueConstraintAction = iota UniqueConstraintAdd UniqueConstraintAction = iota
UniqueConstraintRemove UniqueConstraintRemove
uniqueConstraintActionCount
) )
func NewAddEventUniqueConstraint( func NewAddEventUniqueConstraint(

View File

@ -7,7 +7,10 @@ import (
) )
func KeyPairQuery(latestSequence uint64) *eventstore.SearchQueryBuilder { func KeyPairQuery(latestSequence uint64) *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AddQuery().
AggregateTypes(iam.AggregateType).
SequenceGreater(latestSequence). SequenceGreater(latestSequence).
EventTypes(keypair.AddedEventType) EventTypes(keypair.AddedEventType).
Builder()
} }

View File

@ -41,9 +41,11 @@ func (rm *IAMIDPConfigReadModel) AppendEvents(events ...eventstore.EventReader)
} }
func (rm *IAMIDPConfigReadModel) Query() *eventstore.SearchQueryBuilder { 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). AggregateIDs(rm.iamID).
EventData(map[string]interface{}{ EventData(map[string]interface{}{
"idpConfigId": rm.configID, "idpConfigId": rm.configID,
}) }).Builder()
} }

View File

@ -35,9 +35,11 @@ func (rm *IAMMemberReadModel) AppendEvents(events ...eventstore.EventReader) {
} }
func (rm *IAMMemberReadModel) Query() *eventstore.SearchQueryBuilder { 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). AggregateIDs(rm.iamID).
EventData(map[string]interface{}{ EventData(map[string]interface{}{
"userId": rm.userID, "userId": rm.userID,
}) }).Builder()
} }

View File

@ -128,5 +128,9 @@ func (rm *ReadModel) AppendAndReduce(events ...eventstore.EventReader) error {
} }
func (rm *ReadModel) Query() *eventstore.SearchQueryBuilder { 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()
} }

View File

@ -49,10 +49,19 @@ func (rm *UserReadModel) AppendAndReduce(events ...eventstore.EventReader) error
} }
func (rm *UserReadModel) Query() *eventstore.SearchQueryBuilder { 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 { func NewUserEventSearchQuery(userID, orgID string, sequence uint64) *eventstore.SearchQueryBuilder {
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType). return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
AggregateIDs(userID).ResourceOwner(orgID).SequenceGreater(sequence) ResourceOwner(orgID).
AddQuery().
AggregateTypes(user.AggregateType).
AggregateIDs(userID).
SequenceGreater(sequence).
Builder()
} }