mirror of
https://github.com/zitadel/zitadel.git
synced 2025-02-28 16:37:24 +00:00
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:
parent
0e472a347f
commit
5349d96ce4
@ -23,10 +23,11 @@ We add the label "good first issue" for problems we think are a good starting po
|
||||
|
||||
If you like to contribute fork the ZITADEL repository. After you implemented the new feature create a PullRequest in the ZITADEL reposiotry.
|
||||
|
||||
Make sure you use semantic release.
|
||||
feat: New Feature
|
||||
fix: Bug Fix
|
||||
docs: Documentation
|
||||
Make sure you use semantic release:
|
||||
|
||||
* feat: New Feature
|
||||
* fix: Bug Fix
|
||||
* docs: Documentation
|
||||
|
||||
## Want to start ZITADEL?
|
||||
|
||||
|
23
README.md
23
README.md
@ -42,14 +42,15 @@ For example, **ZITADEL** is event sourced but it does not rely on a pub/sub syst
|
||||
### Self-Managed
|
||||
|
||||
You can run an automatically operated **ZITADEL** instance on a CNCF compliant Kubernetes cluster of your choice:
|
||||
- [CRD Mode on an existing k8s cluster](https://docs.zitadel.ch/docs/guides/installation/crd)
|
||||
- [GitOps Mode on an existing k8s cluster](https://docs.zitadel.ch/docs/guides/installation/gitops)
|
||||
- [GitOps Mode on VM/bare-metal](https://docs.zitadel.ch/docs/guides/installation/managed-dedicated-instance) using [ORBOS](https://docs.zitadel.ch/docs/guides/installation/orbos)
|
||||
|
||||
* [CRD Mode on an existing k8s cluster](https://docs.zitadel.ch/docs/guides/installation/crd)
|
||||
* [GitOps Mode on an existing k8s cluster](https://docs.zitadel.ch/docs/guides/installation/gitops)
|
||||
* [GitOps Mode on VM/bare-metal](https://docs.zitadel.ch/docs/guides/installation/managed-dedicated-instance) using [ORBOS](https://docs.zitadel.ch/docs/guides/installation/orbos)
|
||||
|
||||
### CAOS-Managed
|
||||
|
||||
- **ZITADEL Cloud:** [**ZITADEL.ch**](https://zitadel.ch) is our shared cloud service hosted in Switzerland. [Get started](https://docs.zitadel.ch/docs/guides/usage/get-started) and try the free tier, including already unlimited users and all necessary security features.
|
||||
- **ZITADEL Enterprise:** We operate and support a private instance of **ZITADEL** for you. [Get in touch!](https://zitadel.ch/contact/)
|
||||
* **ZITADEL Cloud:** [**ZITADEL.ch**](https://zitadel.ch) is our shared cloud service hosted in Switzerland. [Get started](https://docs.zitadel.ch/docs/guides/usage/get-started) and try the free tier, including already unlimited users and all necessary security features.
|
||||
* **ZITADEL Enterprise:** We operate and support a private instance of **ZITADEL** for you. [Get in touch!](https://zitadel.ch/contact/)
|
||||
|
||||
## Start using ZITADEL
|
||||
|
||||
@ -58,6 +59,7 @@ You can run an automatically operated **ZITADEL** instance on a CNCF compliant K
|
||||
See our [Documentation](https://docs.zitadel.ch/docs/quickstarts/introduction) to get started with ZITADEL quickly. Let us know, if you are missing a language or framework in the [Q&A](https://github.com/caos/zitadel/discussions/1717).
|
||||
|
||||
### Client libraries
|
||||
|
||||
* [Go](https://github.com/caos/zitadel-go) client library
|
||||
* [.NET](https://github.com/caos/zitadel-net) client library
|
||||
* [Dart](https://github.com/caos/zitadel-dart) client library
|
||||
@ -71,16 +73,19 @@ See our [Documentation](https://docs.zitadel.ch/docs/quickstarts/introduction) t
|
||||
## Showcase
|
||||
|
||||
### Passwordless Login
|
||||
|
||||
Use our login widget to allow easy and sucure access to your applications and enjoy all the benefits of passwordless (FIDO 2 / WebAuthN):
|
||||
- works on all modern platforms, devices, and browsers
|
||||
- phishing resistant alternative
|
||||
- requires only one gesture by the user
|
||||
- easy [enrollment](https://docs.zitadel.ch/docs/manuals/user-factors) of the device during registration
|
||||
|
||||
* works on all modern platforms, devices, and browsers
|
||||
* phishing resistant alternative
|
||||
* requires only one gesture by the user
|
||||
* easy [enrollment](https://docs.zitadel.ch/docs/manuals/user-factors) of the device during registration
|
||||
|
||||

|
||||

|
||||
|
||||
### Admin Console
|
||||
|
||||
Use [Console](https://docs.zitadel.ch/docs/manuals/introduction) or our [APIs](https://docs.zitadel.ch/docs/apis/introduction) to setup organizations, projects and applications.
|
||||
|
||||
Register new applications
|
||||
|
@ -42,13 +42,14 @@ func (rm *ExistingLabelPoliciesReadModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (rm *ExistingLabelPoliciesReadModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(
|
||||
eventstore.ColumnsEvent,
|
||||
iam.AggregateType,
|
||||
org.AggregateType).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
AddQuery().
|
||||
AggregateTypes(iam.AggregateType).
|
||||
EventTypes(iam.LabelPolicyAddedEventType).
|
||||
Or().
|
||||
AggregateTypes(org.AggregateType).
|
||||
EventTypes(
|
||||
iam.LabelPolicyAddedEventType,
|
||||
org.LabelPolicyAddedEventType,
|
||||
org.LabelPolicyRemovedEventType,
|
||||
)
|
||||
org.LabelPolicyRemovedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
@ -40,10 +40,13 @@ func (wm *IAMCustomLoginTextReadModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *IAMCustomLoginTextReadModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType).
|
||||
AggregateIDs(wm.CustomLoginTextReadModel.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateIDs(wm.CustomLoginTextReadModel.AggregateID).
|
||||
AggregateTypes(iam.AggregateType).
|
||||
EventTypes(
|
||||
iam.CustomTextSetEventType,
|
||||
iam.CustomTextRemovedEventType)
|
||||
iam.CustomTextRemovedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
@ -39,9 +39,11 @@ func (wm *IAMCustomMessageTextReadModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *IAMCustomMessageTextReadModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType).
|
||||
AggregateIDs(wm.CustomMessageTextReadModel.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
EventTypes(
|
||||
iam.CustomTextSetEventType)
|
||||
AddQuery().
|
||||
AggregateTypes(iam.AggregateType).
|
||||
AggregateIDs(wm.CustomMessageTextReadModel.AggregateID).
|
||||
EventTypes(iam.CustomTextSetEventType).
|
||||
Builder()
|
||||
}
|
||||
|
@ -39,9 +39,12 @@ func (wm *IAMCustomTextWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *IAMCustomTextWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType).
|
||||
AggregateIDs(wm.CustomTextWriteModel.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateIDs(wm.CustomTextWriteModel.AggregateID).
|
||||
AggregateTypes(iam.AggregateType).
|
||||
EventTypes(
|
||||
iam.CustomTextSetEventType)
|
||||
iam.CustomTextSetEventType).
|
||||
Builder()
|
||||
}
|
||||
|
@ -43,10 +43,12 @@ func (wm *IAMFeaturesWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *IAMFeaturesWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType).
|
||||
AggregateIDs(wm.FeaturesWriteModel.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
EventTypes(iam.FeaturesSetEventType)
|
||||
AddQuery().
|
||||
EventTypes(iam.FeaturesSetEventType).
|
||||
AggregateTypes(iam.AggregateType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func (wm *IAMFeaturesWriteModel) NewSetEvent(
|
||||
|
@ -2,6 +2,7 @@ package command
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
|
||||
"github.com/caos/zitadel/internal/domain"
|
||||
@ -26,9 +27,11 @@ func NewIAMIDPConfigWriteModel(configID string) *IAMIDPConfigWriteModel {
|
||||
}
|
||||
|
||||
func (wm *IAMIDPConfigWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(iam.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
EventTypes(
|
||||
iam.IDPConfigAddedEventType,
|
||||
iam.IDPConfigChangedEventType,
|
||||
@ -36,8 +39,8 @@ func (wm *IAMIDPConfigWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
iam.IDPConfigReactivatedEventType,
|
||||
iam.IDPConfigRemovedEventType,
|
||||
iam.IDPOIDCConfigAddedEventType,
|
||||
iam.IDPOIDCConfigChangedEventType,
|
||||
)
|
||||
iam.IDPOIDCConfigChangedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func (wm *IAMIDPConfigWriteModel) AppendEvents(events ...eventstore.EventReader) {
|
||||
|
@ -2,9 +2,10 @@ package command
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
"reflect"
|
||||
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
|
||||
"github.com/caos/zitadel/internal/crypto"
|
||||
"github.com/caos/zitadel/internal/domain"
|
||||
"github.com/caos/zitadel/internal/repository/iam"
|
||||
@ -69,15 +70,18 @@ func (wm *IAMIDPOIDCConfigWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *IAMIDPOIDCConfigWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(iam.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
EventTypes(
|
||||
iam.IDPOIDCConfigAddedEventType,
|
||||
iam.IDPOIDCConfigChangedEventType,
|
||||
iam.IDPConfigReactivatedEventType,
|
||||
iam.IDPConfigDeactivatedEventType,
|
||||
iam.IDPConfigRemovedEventType)
|
||||
iam.IDPConfigRemovedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func (wm *IAMIDPOIDCConfigWriteModel) NewChangedEvent(
|
||||
|
@ -54,12 +54,15 @@ func (wm *IAMMemberWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *IAMMemberWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType).
|
||||
AggregateIDs(wm.MemberWriteModel.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(iam.AggregateType).
|
||||
AggregateIDs(wm.MemberWriteModel.AggregateID).
|
||||
EventTypes(
|
||||
iam.MemberAddedEventType,
|
||||
iam.MemberChangedEventType,
|
||||
iam.MemberRemovedEventType,
|
||||
iam.MemberCascadeRemovedEventType)
|
||||
iam.MemberCascadeRemovedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
@ -44,14 +44,17 @@ func (wm *IAMWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *IAMWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(iam.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
EventTypes(
|
||||
iam.ProjectSetEventType,
|
||||
iam.GlobalOrgSetEventType,
|
||||
iam.SetupStartedEventType,
|
||||
iam.SetupDoneEventType)
|
||||
iam.SetupDoneEventType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func IAMAggregateFromWriteModel(wm *eventstore.WriteModel) *eventstore.Aggregate {
|
||||
|
@ -62,9 +62,11 @@ func (wm *IAMLabelPolicyWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *IAMLabelPolicyWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType).
|
||||
AggregateIDs(wm.LabelPolicyWriteModel.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(iam.AggregateType).
|
||||
AggregateIDs(wm.LabelPolicyWriteModel.AggregateID).
|
||||
EventTypes(
|
||||
iam.LabelPolicyAddedEventType,
|
||||
iam.LabelPolicyChangedEventType,
|
||||
@ -77,8 +79,8 @@ func (wm *IAMLabelPolicyWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
iam.LabelPolicyIconDarkAddedEventType,
|
||||
iam.LabelPolicyIconDarkRemovedEventType,
|
||||
iam.LabelPolicyFontAddedEventType,
|
||||
iam.LabelPolicyFontRemovedEventType,
|
||||
)
|
||||
iam.LabelPolicyFontRemovedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func (wm *IAMLabelPolicyWriteModel) NewChangedEvent(
|
||||
|
@ -42,12 +42,15 @@ func (wm *IAMSecondFactorWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *IAMSecondFactorWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType).
|
||||
AggregateIDs(wm.WriteModel.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(iam.AggregateType).
|
||||
AggregateIDs(wm.WriteModel.AggregateID).
|
||||
EventTypes(
|
||||
iam.LoginPolicySecondFactorAddedEventType,
|
||||
iam.LoginPolicySecondFactorRemovedEventType)
|
||||
iam.LoginPolicySecondFactorRemovedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
type IAMMultiFactorWriteModel struct {
|
||||
@ -86,10 +89,13 @@ func (wm *IAMMultiFactorWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *IAMMultiFactorWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType).
|
||||
AggregateIDs(wm.WriteModel.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(iam.AggregateType).
|
||||
AggregateIDs(wm.WriteModel.AggregateID).
|
||||
EventTypes(
|
||||
iam.LoginPolicyMultiFactorAddedEventType,
|
||||
iam.LoginPolicyMultiFactorRemovedEventType)
|
||||
iam.LoginPolicyMultiFactorRemovedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
@ -44,7 +44,10 @@ func (wm *IAMIdentityProviderWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *IAMIdentityProviderWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(iam.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
ResourceOwner(wm.ResourceOwner)
|
||||
Builder()
|
||||
}
|
||||
|
@ -2,6 +2,7 @@ package command
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
|
||||
"github.com/caos/zitadel/internal/domain"
|
||||
@ -44,12 +45,15 @@ func (wm *IAMLoginPolicyWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *IAMLoginPolicyWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType).
|
||||
AggregateIDs(wm.LoginPolicyWriteModel.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(iam.AggregateType).
|
||||
AggregateIDs(wm.LoginPolicyWriteModel.AggregateID).
|
||||
EventTypes(
|
||||
iam.LoginPolicyAddedEventType,
|
||||
iam.LoginPolicyChangedEventType)
|
||||
iam.LoginPolicyChangedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func (wm *IAMLoginPolicyWriteModel) NewChangedEvent(
|
||||
|
@ -2,9 +2,10 @@ package command
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
"reflect"
|
||||
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
|
||||
"github.com/caos/zitadel/internal/domain"
|
||||
"github.com/caos/zitadel/internal/repository/iam"
|
||||
"github.com/caos/zitadel/internal/repository/policy"
|
||||
@ -41,12 +42,15 @@ func (wm *IAMMailTemplateWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *IAMMailTemplateWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType).
|
||||
AggregateIDs(wm.MailTemplateWriteModel.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(iam.AggregateType).
|
||||
AggregateIDs(wm.MailTemplateWriteModel.AggregateID).
|
||||
EventTypes(
|
||||
iam.MailTemplateAddedEventType,
|
||||
iam.MailTemplateChangedEventType)
|
||||
iam.MailTemplateChangedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func (wm *IAMMailTemplateWriteModel) NewChangedEvent(
|
||||
|
@ -2,6 +2,7 @@ package command
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
|
||||
"github.com/caos/zitadel/internal/domain"
|
||||
@ -40,12 +41,15 @@ func (wm *IAMOrgIAMPolicyWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *IAMOrgIAMPolicyWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType).
|
||||
AggregateIDs(wm.PolicyOrgIAMWriteModel.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(iam.AggregateType).
|
||||
AggregateIDs(wm.PolicyOrgIAMWriteModel.AggregateID).
|
||||
EventTypes(
|
||||
iam.OrgIAMPolicyAddedEventType,
|
||||
iam.OrgIAMPolicyChangedEventType)
|
||||
iam.OrgIAMPolicyChangedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func (wm *IAMOrgIAMPolicyWriteModel) NewChangedEvent(
|
||||
|
@ -2,6 +2,7 @@ package command
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
|
||||
"github.com/caos/zitadel/internal/domain"
|
||||
@ -40,12 +41,15 @@ func (wm *IAMPasswordAgePolicyWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *IAMPasswordAgePolicyWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType).
|
||||
AggregateIDs(wm.PasswordAgePolicyWriteModel.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(iam.AggregateType).
|
||||
AggregateIDs(wm.PasswordAgePolicyWriteModel.AggregateID).
|
||||
EventTypes(
|
||||
iam.PasswordAgePolicyAddedEventType,
|
||||
iam.PasswordAgePolicyChangedEventType)
|
||||
iam.PasswordAgePolicyChangedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func (wm *IAMPasswordAgePolicyWriteModel) NewChangedEvent(
|
||||
|
@ -2,6 +2,7 @@ package command
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
|
||||
"github.com/caos/zitadel/internal/domain"
|
||||
@ -40,12 +41,15 @@ func (wm *IAMPasswordComplexityPolicyWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *IAMPasswordComplexityPolicyWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType).
|
||||
AggregateIDs(wm.PasswordComplexityPolicyWriteModel.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(iam.AggregateType).
|
||||
AggregateIDs(wm.PasswordComplexityPolicyWriteModel.AggregateID).
|
||||
EventTypes(
|
||||
iam.PasswordComplexityPolicyAddedEventType,
|
||||
iam.PasswordComplexityPolicyChangedEventType)
|
||||
iam.PasswordComplexityPolicyChangedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func (wm *IAMPasswordComplexityPolicyWriteModel) NewChangedEvent(
|
||||
|
@ -2,6 +2,7 @@ package command
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
|
||||
"github.com/caos/zitadel/internal/domain"
|
||||
@ -40,12 +41,15 @@ func (wm *IAMPasswordLockoutPolicyWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *IAMPasswordLockoutPolicyWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType).
|
||||
AggregateIDs(wm.PasswordLockoutPolicyWriteModel.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(iam.AggregateType).
|
||||
AggregateIDs(wm.PasswordLockoutPolicyWriteModel.AggregateID).
|
||||
EventTypes(
|
||||
iam.PasswordLockoutPolicyAddedEventType,
|
||||
iam.PasswordLockoutPolicyChangedEventType)
|
||||
iam.PasswordLockoutPolicyChangedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func (wm *IAMPasswordLockoutPolicyWriteModel) NewChangedEvent(
|
||||
|
@ -2,6 +2,7 @@ package command
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
|
||||
"github.com/caos/zitadel/internal/domain"
|
||||
@ -40,12 +41,15 @@ func (wm *IAMPrivacyPolicyWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *IAMPrivacyPolicyWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType).
|
||||
AggregateIDs(wm.PrivacyPolicyWriteModel.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(iam.AggregateType).
|
||||
AggregateIDs(wm.PrivacyPolicyWriteModel.AggregateID).
|
||||
EventTypes(
|
||||
iam.PrivacyPolicyAddedEventType,
|
||||
iam.PrivacyPolicyChangedEventType)
|
||||
iam.PrivacyPolicyChangedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func (wm *IAMPrivacyPolicyWriteModel) NewChangedEvent(
|
||||
|
@ -49,10 +49,13 @@ func (wm *KeyPairWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *KeyPairWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, project.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
EventTypes(keypair.AddedEventType)
|
||||
AddQuery().
|
||||
AggregateTypes(project.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
EventTypes(keypair.AddedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func KeyPairAggregateFromWriteModel(wm *eventstore.WriteModel) *eventstore.Aggregate {
|
||||
|
@ -81,12 +81,14 @@ func (repo *testRepo) Filter(ctx context.Context, searchQuery *repository.Search
|
||||
events := make([]*repository.Event, 0, len(repo.events))
|
||||
for _, event := range repo.events {
|
||||
for _, filter := range searchQuery.Filters {
|
||||
if filter.Field == repository.FieldAggregateType {
|
||||
if event.AggregateType != filter.Value {
|
||||
for _, f := range filter {
|
||||
if f.Field == repository.FieldAggregateType {
|
||||
if event.AggregateType != f.Value {
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
events = append(events, event)
|
||||
}
|
||||
return repo.events, nil
|
||||
|
@ -41,11 +41,14 @@ func (wm *OrgCustomLoginTextReadModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *OrgCustomLoginTextReadModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType).
|
||||
AggregateIDs(wm.CustomLoginTextReadModel.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateIDs(wm.CustomLoginTextReadModel.AggregateID).
|
||||
AggregateTypes(org.AggregateType).
|
||||
EventTypes(
|
||||
org.CustomTextSetEventType,
|
||||
org.CustomTextRemovedEventType,
|
||||
org.CustomTextTemplateRemovedEventType)
|
||||
org.CustomTextTemplateRemovedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
@ -42,13 +42,16 @@ func (wm *OrgCustomMessageTextReadModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *OrgCustomMessageTextReadModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType).
|
||||
AggregateIDs(wm.CustomMessageTextReadModel.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(org.AggregateType).
|
||||
AggregateIDs(wm.CustomMessageTextReadModel.AggregateID).
|
||||
EventTypes(
|
||||
org.CustomTextSetEventType,
|
||||
org.CustomTextRemovedEventType,
|
||||
org.CustomTextTemplateRemovedEventType)
|
||||
org.CustomTextTemplateRemovedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
type OrgCustomMessageTemplatesReadModel struct {
|
||||
@ -85,11 +88,14 @@ func (wm *OrgCustomMessageTemplatesReadModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *OrgCustomMessageTemplatesReadModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType).
|
||||
AggregateIDs(wm.CustomMessageTemplatesReadModel.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(org.AggregateType).
|
||||
AggregateIDs(wm.CustomMessageTemplatesReadModel.AggregateID).
|
||||
EventTypes(
|
||||
org.CustomTextSetEventType,
|
||||
org.CustomTextRemovedEventType,
|
||||
org.CustomTextTemplateRemovedEventType)
|
||||
org.CustomTextTemplateRemovedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
@ -84,16 +84,19 @@ func (wm *OrgDomainWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *OrgDomainWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(org.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
EventTypes(
|
||||
org.OrgDomainAddedEventType,
|
||||
org.OrgDomainVerifiedEventType,
|
||||
org.OrgDomainVerificationAddedEventType,
|
||||
org.OrgDomainVerifiedEventType,
|
||||
org.OrgDomainPrimarySetEventType,
|
||||
org.OrgDomainRemovedEventType)
|
||||
org.OrgDomainRemovedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
type OrgDomainsWriteModel struct {
|
||||
@ -151,9 +154,11 @@ func (wm *OrgDomainsWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *OrgDomainsWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(org.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
EventTypes(
|
||||
org.OrgAddedEventType,
|
||||
org.OrgChangedEventType,
|
||||
@ -162,5 +167,6 @@ func (wm *OrgDomainsWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
org.OrgDomainVerificationAddedEventType,
|
||||
org.OrgDomainVerifiedEventType,
|
||||
org.OrgDomainPrimarySetEventType,
|
||||
org.OrgDomainRemovedEventType)
|
||||
org.OrgDomainRemovedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
@ -45,13 +45,15 @@ func (wm *OrgFeaturesWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *OrgFeaturesWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType).
|
||||
AggregateIDs(wm.FeaturesWriteModel.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(org.AggregateType).
|
||||
AggregateIDs(wm.FeaturesWriteModel.AggregateID).
|
||||
EventTypes(
|
||||
org.FeaturesSetEventType,
|
||||
org.FeaturesRemovedEventType,
|
||||
)
|
||||
org.FeaturesRemovedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func (wm *OrgFeaturesWriteModel) NewSetEvent(
|
||||
|
@ -2,6 +2,7 @@ package command
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
|
||||
"github.com/caos/zitadel/internal/domain"
|
||||
@ -26,9 +27,11 @@ func NewOrgIDPConfigWriteModel(configID, orgID string) *OrgIDPConfigWriteModel {
|
||||
}
|
||||
|
||||
func (wm *OrgIDPConfigWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(org.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
EventTypes(
|
||||
org.IDPConfigAddedEventType,
|
||||
org.IDPConfigChangedEventType,
|
||||
@ -36,7 +39,8 @@ func (wm *OrgIDPConfigWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
org.IDPConfigReactivatedEventType,
|
||||
org.IDPConfigRemovedEventType,
|
||||
org.IDPOIDCConfigAddedEventType,
|
||||
org.IDPOIDCConfigChangedEventType)
|
||||
org.IDPOIDCConfigChangedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func (wm *OrgIDPConfigWriteModel) AppendEvents(events ...eventstore.EventReader) {
|
||||
|
@ -2,9 +2,10 @@ package command
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
"reflect"
|
||||
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
|
||||
"github.com/caos/zitadel/internal/crypto"
|
||||
"github.com/caos/zitadel/internal/domain"
|
||||
"github.com/caos/zitadel/internal/repository/idpconfig"
|
||||
@ -69,15 +70,18 @@ func (wm *IDPOIDCConfigWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *IDPOIDCConfigWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(org.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
EventTypes(
|
||||
org.IDPOIDCConfigAddedEventType,
|
||||
org.IDPOIDCConfigChangedEventType,
|
||||
org.IDPConfigReactivatedEventType,
|
||||
org.IDPConfigDeactivatedEventType,
|
||||
org.IDPConfigRemovedEventType)
|
||||
org.IDPConfigRemovedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func (wm *IDPOIDCConfigWriteModel) NewChangedEvent(
|
||||
|
@ -53,12 +53,15 @@ func (wm *OrgMemberWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *OrgMemberWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType).
|
||||
AggregateIDs(wm.MemberWriteModel.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(org.AggregateType).
|
||||
AggregateIDs(wm.MemberWriteModel.AggregateID).
|
||||
EventTypes(
|
||||
org.MemberAddedEventType,
|
||||
org.MemberChangedEventType,
|
||||
org.MemberRemovedEventType,
|
||||
org.MemberCascadeRemovedEventType)
|
||||
org.MemberCascadeRemovedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
@ -43,13 +43,16 @@ func (wm *OrgWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *OrgWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(org.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
EventTypes(
|
||||
org.OrgAddedEventType,
|
||||
org.OrgChangedEventType,
|
||||
org.OrgDomainPrimarySetEventType)
|
||||
org.OrgDomainPrimarySetEventType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func OrgAggregateFromWriteModel(wm *eventstore.WriteModel) *eventstore.Aggregate {
|
||||
|
@ -2,6 +2,7 @@ package command
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
|
||||
"github.com/caos/zitadel/internal/repository/org"
|
||||
@ -61,9 +62,11 @@ func (wm *OrgLabelPolicyWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *OrgLabelPolicyWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType).
|
||||
AggregateIDs(wm.LabelPolicyWriteModel.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(org.AggregateType).
|
||||
AggregateIDs(wm.LabelPolicyWriteModel.AggregateID).
|
||||
EventTypes(
|
||||
org.LabelPolicyAddedEventType,
|
||||
org.LabelPolicyChangedEventType,
|
||||
@ -77,8 +80,8 @@ func (wm *OrgLabelPolicyWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
org.LabelPolicyIconDarkAddedEventType,
|
||||
org.LabelPolicyIconDarkRemovedEventType,
|
||||
org.LabelPolicyFontAddedEventType,
|
||||
org.LabelPolicyFontRemovedEventType,
|
||||
)
|
||||
org.LabelPolicyFontRemovedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func (wm *OrgLabelPolicyWriteModel) NewChangedEvent(
|
||||
|
@ -43,12 +43,15 @@ func (wm *OrgSecondFactorWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *OrgSecondFactorWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType).
|
||||
AggregateIDs(wm.WriteModel.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(org.AggregateType).
|
||||
AggregateIDs(wm.WriteModel.AggregateID).
|
||||
EventTypes(
|
||||
org.LoginPolicySecondFactorAddedEventType,
|
||||
org.LoginPolicySecondFactorRemovedEventType)
|
||||
org.LoginPolicySecondFactorRemovedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
type OrgMultiFactorWriteModel struct {
|
||||
@ -87,12 +90,15 @@ func (wm *OrgMultiFactorWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *OrgMultiFactorWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType).
|
||||
AggregateIDs(wm.WriteModel.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(org.AggregateType).
|
||||
AggregateIDs(wm.WriteModel.AggregateID).
|
||||
EventTypes(
|
||||
org.LoginPolicyMultiFactorAddedEventType,
|
||||
org.LoginPolicyMultiFactorRemovedEventType)
|
||||
org.LoginPolicyMultiFactorRemovedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func NewOrgAuthFactorsAllowedWriteModel(orgID string) *OrgAuthFactorsAllowedWriteModel {
|
||||
@ -164,17 +170,26 @@ func (wm *OrgAuthFactorsAllowedWriteModel) ensureMultiFactor(multiFactor domain.
|
||||
}
|
||||
|
||||
func (wm *OrgAuthFactorsAllowedWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType, org.AggregateType).
|
||||
AggregateIDs(domain.IAMID, wm.WriteModel.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
AddQuery().
|
||||
AggregateTypes(iam.AggregateType).
|
||||
AggregateIDs(domain.IAMID).
|
||||
EventTypes(
|
||||
iam.LoginPolicySecondFactorAddedEventType,
|
||||
iam.LoginPolicySecondFactorRemovedEventType,
|
||||
iam.LoginPolicyMultiFactorAddedEventType,
|
||||
iam.LoginPolicyMultiFactorRemovedEventType,
|
||||
).
|
||||
Or().
|
||||
AggregateTypes(org.AggregateType).
|
||||
AggregateIDs(wm.WriteModel.AggregateID).
|
||||
EventTypes(
|
||||
org.LoginPolicySecondFactorAddedEventType,
|
||||
org.LoginPolicySecondFactorRemovedEventType,
|
||||
org.LoginPolicyMultiFactorAddedEventType,
|
||||
org.LoginPolicyMultiFactorRemovedEventType)
|
||||
org.LoginPolicyMultiFactorRemovedEventType,
|
||||
).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func (wm *OrgAuthFactorsAllowedWriteModel) ToSecondFactorWriteModel(factor domain.SecondFactorType) *OrgSecondFactorWriteModel {
|
||||
|
@ -43,10 +43,13 @@ func (wm *OrgIdentityProviderWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *OrgIdentityProviderWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(org.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
EventTypes(
|
||||
org.LoginPolicyIDPProviderAddedEventType,
|
||||
org.LoginPolicyIDPProviderRemovedEventType)
|
||||
org.LoginPolicyIDPProviderRemovedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
@ -2,6 +2,7 @@ package command
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
|
||||
"github.com/caos/zitadel/internal/domain"
|
||||
@ -46,13 +47,16 @@ func (wm *OrgLoginPolicyWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *OrgLoginPolicyWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType).
|
||||
AggregateIDs(wm.LoginPolicyWriteModel.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(org.AggregateType).
|
||||
AggregateIDs(wm.LoginPolicyWriteModel.AggregateID).
|
||||
EventTypes(
|
||||
org.LoginPolicyAddedEventType,
|
||||
org.LoginPolicyChangedEventType,
|
||||
org.LoginPolicyRemovedEventType)
|
||||
org.LoginPolicyRemovedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func (wm *OrgLoginPolicyWriteModel) NewChangedEvent(
|
||||
|
@ -2,9 +2,10 @@ package command
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
"reflect"
|
||||
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
|
||||
"github.com/caos/zitadel/internal/repository/org"
|
||||
"github.com/caos/zitadel/internal/repository/policy"
|
||||
)
|
||||
@ -42,12 +43,15 @@ func (wm *OrgMailTemplateWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *OrgMailTemplateWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType).
|
||||
query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
AddQuery().
|
||||
AggregateTypes(org.AggregateType).
|
||||
AggregateIDs(wm.MailTemplateWriteModel.AggregateID).
|
||||
EventTypes(
|
||||
org.MailTemplateAddedEventType,
|
||||
org.MailTemplateChangedEventType,
|
||||
org.MailTemplateRemovedEventType)
|
||||
org.MailTemplateRemovedEventType).
|
||||
Builder()
|
||||
|
||||
if wm.ResourceOwner != "" {
|
||||
query.ResourceOwner(wm.ResourceOwner)
|
||||
|
@ -2,6 +2,7 @@ package command
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
|
||||
"github.com/caos/zitadel/internal/repository/org"
|
||||
@ -41,12 +42,15 @@ func (wm *ORGOrgIAMPolicyWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *ORGOrgIAMPolicyWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType).
|
||||
AggregateIDs(wm.PolicyOrgIAMWriteModel.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(org.AggregateType).
|
||||
AggregateIDs(wm.PolicyOrgIAMWriteModel.AggregateID).
|
||||
EventTypes(org.OrgIAMPolicyAddedEventType,
|
||||
org.OrgIAMPolicyChangedEventType,
|
||||
org.OrgIAMPolicyRemovedEventType)
|
||||
org.OrgIAMPolicyRemovedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func (wm *ORGOrgIAMPolicyWriteModel) NewChangedEvent(
|
||||
|
@ -2,6 +2,7 @@ package command
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
|
||||
"github.com/caos/zitadel/internal/repository/org"
|
||||
@ -41,13 +42,16 @@ func (wm *OrgPasswordAgePolicyWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *OrgPasswordAgePolicyWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType).
|
||||
AggregateIDs(wm.PasswordAgePolicyWriteModel.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(org.AggregateType).
|
||||
AggregateIDs(wm.PasswordAgePolicyWriteModel.AggregateID).
|
||||
EventTypes(
|
||||
org.PasswordAgePolicyAddedEventType,
|
||||
org.PasswordAgePolicyChangedEventType,
|
||||
org.PasswordAgePolicyRemovedEventType)
|
||||
org.PasswordAgePolicyRemovedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func (wm *OrgPasswordAgePolicyWriteModel) NewChangedEvent(
|
||||
|
@ -2,6 +2,7 @@ package command
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
|
||||
"github.com/caos/zitadel/internal/repository/org"
|
||||
@ -41,12 +42,15 @@ func (wm *OrgPasswordComplexityPolicyWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *OrgPasswordComplexityPolicyWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType).
|
||||
AggregateIDs(wm.PasswordComplexityPolicyWriteModel.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(org.AggregateType).
|
||||
AggregateIDs(wm.PasswordComplexityPolicyWriteModel.AggregateID).
|
||||
EventTypes(org.PasswordComplexityPolicyAddedEventType,
|
||||
org.PasswordComplexityPolicyChangedEventType,
|
||||
org.PasswordComplexityPolicyRemovedEventType)
|
||||
org.PasswordComplexityPolicyRemovedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func (wm *OrgPasswordComplexityPolicyWriteModel) NewChangedEvent(
|
||||
|
@ -2,6 +2,7 @@ package command
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
|
||||
"github.com/caos/zitadel/internal/repository/org"
|
||||
@ -41,12 +42,15 @@ func (wm *OrgPasswordLockoutPolicyWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *OrgPasswordLockoutPolicyWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType).
|
||||
AggregateIDs(wm.PasswordLockoutPolicyWriteModel.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(org.AggregateType).
|
||||
AggregateIDs(wm.PasswordLockoutPolicyWriteModel.AggregateID).
|
||||
EventTypes(org.PasswordLockoutPolicyAddedEventType,
|
||||
org.PasswordLockoutPolicyChangedEventType,
|
||||
org.PasswordLockoutPolicyRemovedEventType)
|
||||
org.PasswordLockoutPolicyRemovedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func (wm *OrgPasswordLockoutPolicyWriteModel) NewChangedEvent(
|
||||
|
@ -2,6 +2,7 @@ package command
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
|
||||
"github.com/caos/zitadel/internal/repository/org"
|
||||
@ -41,12 +42,15 @@ func (wm *OrgPrivacyPolicyWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *OrgPrivacyPolicyWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType).
|
||||
AggregateIDs(wm.PrivacyPolicyWriteModel.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateIDs(wm.PrivacyPolicyWriteModel.AggregateID).
|
||||
AggregateTypes(org.AggregateType).
|
||||
EventTypes(org.PrivacyPolicyAddedEventType,
|
||||
org.PrivacyPolicyChangedEventType,
|
||||
org.PrivacyPolicyRemovedEventType)
|
||||
org.PrivacyPolicyRemovedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func (wm *OrgPrivacyPolicyWriteModel) NewChangedEvent(
|
||||
|
@ -2,6 +2,7 @@ package command
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
|
||||
"github.com/caos/zitadel/internal/crypto"
|
||||
@ -136,9 +137,11 @@ func (wm *APIApplicationWriteModel) appendChangeAPIEvent(e *project.APIConfigCha
|
||||
}
|
||||
|
||||
func (wm *APIApplicationWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, project.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(project.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
EventTypes(
|
||||
project.ApplicationAddedType,
|
||||
project.ApplicationChangedType,
|
||||
@ -148,8 +151,8 @@ func (wm *APIApplicationWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
project.APIConfigAddedType,
|
||||
project.APIConfigChangedType,
|
||||
project.APIConfigSecretChangedType,
|
||||
project.ProjectRemovedType,
|
||||
)
|
||||
project.ProjectRemovedType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func (wm *APIApplicationWriteModel) NewChangedEvent(
|
||||
|
@ -1,9 +1,10 @@
|
||||
package command
|
||||
|
||||
import (
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
"time"
|
||||
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
|
||||
"github.com/caos/zitadel/internal/domain"
|
||||
"github.com/caos/zitadel/internal/repository/project"
|
||||
)
|
||||
@ -126,9 +127,11 @@ func (wm *ApplicationKeyWriteModel) appendChangeAPIEvent(e *project.APIConfigCha
|
||||
}
|
||||
|
||||
func (wm *ApplicationKeyWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, project.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(project.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
EventTypes(
|
||||
project.ApplicationRemovedType,
|
||||
project.OIDCConfigAddedType,
|
||||
@ -137,6 +140,6 @@ func (wm *ApplicationKeyWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
project.APIConfigChangedType,
|
||||
project.ApplicationKeyAddedEventType,
|
||||
project.ApplicationKeyRemovedEventType,
|
||||
project.ProjectRemovedType,
|
||||
)
|
||||
project.ProjectRemovedType).
|
||||
Builder()
|
||||
}
|
||||
|
@ -94,15 +94,17 @@ func (wm *ApplicationWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *ApplicationWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, project.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(project.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
EventTypes(
|
||||
project.ApplicationAddedType,
|
||||
project.ApplicationChangedType,
|
||||
project.ApplicationDeactivatedType,
|
||||
project.ApplicationReactivatedType,
|
||||
project.ApplicationRemovedType,
|
||||
project.ProjectRemovedType,
|
||||
)
|
||||
project.ProjectRemovedType).
|
||||
Builder()
|
||||
}
|
||||
|
@ -2,12 +2,13 @@ package command
|
||||
|
||||
import (
|
||||
"context"
|
||||
"reflect"
|
||||
"time"
|
||||
|
||||
"github.com/caos/zitadel/internal/crypto"
|
||||
"github.com/caos/zitadel/internal/domain"
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
"github.com/caos/zitadel/internal/repository/project"
|
||||
"reflect"
|
||||
"time"
|
||||
)
|
||||
|
||||
type OIDCApplicationWriteModel struct {
|
||||
@ -203,9 +204,11 @@ func (wm *OIDCApplicationWriteModel) appendChangeOIDCEvent(e *project.OIDCConfig
|
||||
}
|
||||
|
||||
func (wm *OIDCApplicationWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, project.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(project.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
EventTypes(
|
||||
project.ApplicationAddedType,
|
||||
project.ApplicationChangedType,
|
||||
@ -215,8 +218,8 @@ func (wm *OIDCApplicationWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
project.OIDCConfigAddedType,
|
||||
project.OIDCConfigChangedType,
|
||||
project.OIDCConfigSecretChangedType,
|
||||
project.ProjectRemovedType,
|
||||
)
|
||||
project.ProjectRemovedType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func (wm *OIDCApplicationWriteModel) NewChangedEvent(
|
||||
|
@ -80,7 +80,9 @@ func (wm *ProjectGrantMemberWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *ProjectGrantMemberWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, project.AggregateType).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
AddQuery().
|
||||
AggregateTypes(project.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
EventTypes(
|
||||
project.GrantMemberAddedType,
|
||||
@ -88,5 +90,6 @@ func (wm *ProjectGrantMemberWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
project.GrantMemberRemovedType,
|
||||
project.GrantMemberCascadeRemovedType,
|
||||
project.GrantRemovedType,
|
||||
project.ProjectRemovedType)
|
||||
project.ProjectRemovedType).
|
||||
Builder()
|
||||
}
|
||||
|
@ -91,7 +91,9 @@ func (wm *ProjectGrantWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *ProjectGrantWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, project.AggregateType).
|
||||
query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
AddQuery().
|
||||
AggregateTypes(project.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
EventTypes(
|
||||
project.GrantAddedType,
|
||||
@ -100,7 +102,9 @@ func (wm *ProjectGrantWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
project.GrantDeactivatedType,
|
||||
project.GrantReactivatedType,
|
||||
project.GrantRemovedType,
|
||||
project.ProjectRemovedType)
|
||||
project.ProjectRemovedType).
|
||||
Builder()
|
||||
|
||||
if wm.ResourceOwner != "" {
|
||||
query.ResourceOwner(wm.ResourceOwner)
|
||||
}
|
||||
@ -152,14 +156,22 @@ func (wm *ProjectGrantPreConditionReadModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *ProjectGrantPreConditionReadModel) Query() *eventstore.SearchQueryBuilder {
|
||||
query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, org.AggregateType, project.AggregateType).
|
||||
AggregateIDs(wm.ProjectID, wm.GrantedOrgID).
|
||||
query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
AddQuery().
|
||||
AggregateTypes(org.AggregateType).
|
||||
AggregateIDs(wm.GrantedOrgID).
|
||||
EventTypes(
|
||||
org.OrgAddedEventType,
|
||||
org.OrgRemovedEventType,
|
||||
org.OrgRemovedEventType).
|
||||
Or().
|
||||
AggregateTypes(project.AggregateType).
|
||||
AggregateIDs(wm.ProjectID).
|
||||
EventTypes(
|
||||
project.ProjectAddedType,
|
||||
project.ProjectRemovedType,
|
||||
project.RoleAddedType,
|
||||
project.RoleRemovedType)
|
||||
project.RoleRemovedType).
|
||||
Builder()
|
||||
|
||||
return query
|
||||
}
|
||||
|
@ -53,11 +53,14 @@ func (wm *ProjectMemberWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *ProjectMemberWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, project.AggregateType).
|
||||
AggregateIDs(wm.MemberWriteModel.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(project.AggregateType).
|
||||
AggregateIDs(wm.MemberWriteModel.AggregateID).
|
||||
EventTypes(project.MemberAddedType,
|
||||
project.MemberChangedType,
|
||||
project.MemberRemovedType,
|
||||
project.MemberCascadeRemovedType)
|
||||
project.MemberCascadeRemovedType).
|
||||
Builder()
|
||||
}
|
||||
|
@ -2,6 +2,7 @@ package command
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/caos/zitadel/internal/domain"
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
"github.com/caos/zitadel/internal/repository/project"
|
||||
@ -61,14 +62,17 @@ func (wm *ProjectWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *ProjectWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, project.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(project.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
EventTypes(project.ProjectAddedType,
|
||||
project.ProjectChangedType,
|
||||
project.ProjectDeactivatedType,
|
||||
project.ProjectReactivatedType,
|
||||
project.ProjectRemovedType)
|
||||
project.ProjectRemovedType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func (wm *ProjectWriteModel) NewChangedEvent(
|
||||
|
@ -2,6 +2,7 @@ package command
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/caos/zitadel/internal/domain"
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
"github.com/caos/zitadel/internal/repository/project"
|
||||
@ -82,14 +83,17 @@ func (wm *ProjectRoleWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *ProjectRoleWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, project.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(project.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
EventTypes(
|
||||
project.RoleAddedType,
|
||||
project.RoleChangedType,
|
||||
project.RoleRemovedType,
|
||||
project.ProjectRemovedType)
|
||||
project.ProjectRemovedType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func (wm *ProjectRoleWriteModel) NewProjectRoleChangedEvent(
|
||||
|
@ -2,6 +2,7 @@ package command
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/caos/logging"
|
||||
"github.com/caos/zitadel/internal/domain"
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
@ -181,8 +182,8 @@ func (rm *UniqueConstraintReadModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (rm *UniqueConstraintReadModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(
|
||||
eventstore.ColumnsEvent,
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
AddQuery().AggregateTypes(
|
||||
iam.AggregateType,
|
||||
org.AggregateType,
|
||||
project.AggregateType,
|
||||
@ -237,8 +238,8 @@ func (rm *UniqueConstraintReadModel) Query() *eventstore.SearchQueryBuilder {
|
||||
org.MemberCascadeRemovedEventType,
|
||||
project.MemberAddedType,
|
||||
project.MemberRemovedType,
|
||||
project.MemberCascadeRemovedType,
|
||||
)
|
||||
project.MemberCascadeRemovedType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func (rm *UniqueConstraintReadModel) getUniqueConstraint(aggregateID, objectID, constraintType string) *domain.UniqueConstraintMigration {
|
||||
|
@ -60,7 +60,9 @@ func (wm *UserGrantWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *UserGrantWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, usergrant.AggregateType).
|
||||
query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
AddQuery().
|
||||
AggregateTypes(usergrant.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
EventTypes(usergrant.UserGrantAddedType,
|
||||
usergrant.UserGrantChangedType,
|
||||
@ -68,7 +70,9 @@ func (wm *UserGrantWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
usergrant.UserGrantDeactivatedType,
|
||||
usergrant.UserGrantReactivatedType,
|
||||
usergrant.UserGrantRemovedType,
|
||||
usergrant.UserGrantCascadeRemovedType)
|
||||
usergrant.UserGrantCascadeRemovedType).
|
||||
Builder()
|
||||
|
||||
if wm.ResourceOwner != "" {
|
||||
query.ResourceOwner(wm.ResourceOwner)
|
||||
}
|
||||
@ -152,20 +156,28 @@ func (wm *UserGrantPreConditionReadModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *UserGrantPreConditionReadModel) Query() *eventstore.SearchQueryBuilder {
|
||||
query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType, project.AggregateType).
|
||||
AggregateIDs(wm.UserID, wm.ProjectID).
|
||||
EventTypes(user.UserV1AddedType,
|
||||
query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
AddQuery().
|
||||
AggregateTypes(user.AggregateType).
|
||||
AggregateIDs(wm.UserID).
|
||||
EventTypes(
|
||||
user.UserV1AddedType,
|
||||
user.HumanAddedType,
|
||||
user.UserV1RegisteredType,
|
||||
user.HumanRegisteredType,
|
||||
user.MachineAddedEventType,
|
||||
user.UserRemovedType,
|
||||
user.UserRemovedType).
|
||||
Or().
|
||||
AggregateTypes(project.AggregateType).
|
||||
AggregateIDs(wm.ProjectID).
|
||||
EventTypes(
|
||||
project.ProjectAddedType,
|
||||
project.ProjectRemovedType,
|
||||
project.GrantAddedType,
|
||||
project.GrantChangedType,
|
||||
project.GrantRemovedType,
|
||||
project.RoleAddedType,
|
||||
project.RoleRemovedType)
|
||||
project.RoleRemovedType).
|
||||
Builder()
|
||||
return query
|
||||
}
|
||||
|
@ -70,16 +70,19 @@ func (wm *HumanAddressWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *HumanAddressWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(user.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
EventTypes(user.UserV1AddedType,
|
||||
user.UserV1RegisteredType,
|
||||
user.UserV1AddressChangedType,
|
||||
user.HumanAddedType,
|
||||
user.HumanRegisteredType,
|
||||
user.HumanAddressChangedType,
|
||||
user.UserRemovedType)
|
||||
user.UserRemovedType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func (wm *HumanAddressWriteModel) NewChangedEvent(
|
||||
|
@ -65,7 +65,9 @@ func (wm *HumanEmailWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *HumanEmailWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType).
|
||||
query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
AddQuery().
|
||||
AggregateTypes(user.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
EventTypes(user.UserV1AddedType,
|
||||
user.HumanAddedType,
|
||||
@ -81,7 +83,9 @@ func (wm *HumanEmailWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
user.HumanEmailCodeAddedType,
|
||||
user.UserV1EmailVerifiedType,
|
||||
user.HumanEmailVerifiedType,
|
||||
user.UserRemovedType)
|
||||
user.UserRemovedType).
|
||||
Builder()
|
||||
|
||||
if wm.ResourceOwner != "" {
|
||||
query.ResourceOwner(wm.ResourceOwner)
|
||||
}
|
||||
|
@ -47,11 +47,14 @@ func (wm *HumanExternalIDPWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *HumanExternalIDPWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(user.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
EventTypes(user.HumanExternalIDPAddedType,
|
||||
user.HumanExternalIDPRemovedType,
|
||||
user.HumanExternalIDPCascadeRemovedType,
|
||||
user.UserRemovedType)
|
||||
user.UserRemovedType).
|
||||
Builder()
|
||||
}
|
||||
|
@ -2,9 +2,10 @@ package command
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
"time"
|
||||
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
|
||||
"github.com/caos/zitadel/internal/crypto"
|
||||
"github.com/caos/zitadel/internal/domain"
|
||||
"github.com/caos/zitadel/internal/repository/user"
|
||||
@ -66,7 +67,9 @@ func (wm *HumanInitCodeWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *HumanInitCodeWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType).
|
||||
query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
AddQuery().
|
||||
AggregateTypes(user.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
EventTypes(user.UserV1AddedType,
|
||||
user.HumanAddedType,
|
||||
@ -80,7 +83,9 @@ func (wm *HumanInitCodeWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
user.HumanInitialCodeAddedType,
|
||||
user.UserV1InitializedCheckSucceededType,
|
||||
user.HumanInitializedCheckSucceededType,
|
||||
user.UserRemovedType)
|
||||
user.UserRemovedType).
|
||||
Builder()
|
||||
|
||||
if wm.ResourceOwner != "" {
|
||||
query.ResourceOwner(wm.ResourceOwner)
|
||||
}
|
||||
|
@ -104,9 +104,11 @@ func (wm *HumanWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *HumanWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(user.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
EventTypes(user.HumanAddedType,
|
||||
user.HumanRegisteredType,
|
||||
user.HumanInitialCodeAddedType,
|
||||
@ -136,7 +138,8 @@ func (wm *HumanWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
user.UserV1PhoneChangedType,
|
||||
user.UserV1PhoneVerifiedType,
|
||||
user.UserV1PhoneRemovedType,
|
||||
user.UserV1PasswordChangedType)
|
||||
user.UserV1PasswordChangedType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func (wm *HumanWriteModel) reduceHumanAddedEvent(e *user.HumanAddedEvent) {
|
||||
|
@ -41,7 +41,9 @@ func (wm *HumanOTPWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *HumanOTPWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType).
|
||||
query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
AddQuery().
|
||||
AggregateTypes(user.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
EventTypes(user.HumanMFAOTPAddedType,
|
||||
user.HumanMFAOTPVerifiedType,
|
||||
@ -49,7 +51,9 @@ func (wm *HumanOTPWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
user.UserRemovedType,
|
||||
user.UserV1MFAOTPAddedType,
|
||||
user.UserV1MFAOTPVerifiedType,
|
||||
user.UserV1MFAOTPRemovedType)
|
||||
user.UserV1MFAOTPRemovedType).
|
||||
Builder()
|
||||
|
||||
if wm.ResourceOwner != "" {
|
||||
query.ResourceOwner(wm.ResourceOwner)
|
||||
}
|
||||
|
@ -1,9 +1,10 @@
|
||||
package command
|
||||
|
||||
import (
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
"time"
|
||||
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
|
||||
"github.com/caos/zitadel/internal/crypto"
|
||||
"github.com/caos/zitadel/internal/domain"
|
||||
"github.com/caos/zitadel/internal/repository/user"
|
||||
@ -66,7 +67,9 @@ func (wm *HumanPasswordWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *HumanPasswordWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType).
|
||||
query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
AddQuery().
|
||||
AggregateTypes(user.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
EventTypes(user.HumanAddedType,
|
||||
user.HumanRegisteredType,
|
||||
@ -82,7 +85,9 @@ func (wm *HumanPasswordWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
user.UserV1InitializedCheckSucceededType,
|
||||
user.UserV1PasswordChangedType,
|
||||
user.UserV1PasswordCodeAddedType,
|
||||
user.UserV1EmailVerifiedType)
|
||||
user.UserV1EmailVerifiedType).
|
||||
Builder()
|
||||
|
||||
if wm.ResourceOwner != "" {
|
||||
query.ResourceOwner(wm.ResourceOwner)
|
||||
}
|
||||
|
@ -2,9 +2,10 @@ package command
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
"time"
|
||||
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
|
||||
"github.com/caos/zitadel/internal/crypto"
|
||||
"github.com/caos/zitadel/internal/domain"
|
||||
"github.com/caos/zitadel/internal/repository/user"
|
||||
@ -74,9 +75,11 @@ func (wm *HumanPhoneWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *HumanPhoneWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(user.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
EventTypes(user.HumanAddedType,
|
||||
user.HumanRegisteredType,
|
||||
user.HumanInitialCodeAddedType,
|
||||
@ -93,7 +96,8 @@ func (wm *HumanPhoneWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
user.UserV1PhoneCodeAddedType,
|
||||
user.UserV1PhoneChangedType,
|
||||
user.UserV1PhoneVerifiedType,
|
||||
user.UserV1PhoneRemovedType)
|
||||
user.UserV1PhoneRemovedType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func (wm *HumanPhoneWriteModel) NewChangedEvent(
|
||||
|
@ -2,6 +2,7 @@ package command
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
|
||||
"golang.org/x/text/language"
|
||||
@ -78,16 +79,19 @@ func (wm *HumanProfileWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *HumanProfileWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(user.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
EventTypes(user.HumanAddedType,
|
||||
user.HumanRegisteredType,
|
||||
user.HumanProfileChangedType,
|
||||
user.UserRemovedType,
|
||||
user.UserV1AddedType,
|
||||
user.UserV1RegisteredType,
|
||||
user.UserV1ProfileChangedType)
|
||||
user.UserV1ProfileChangedType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func (wm *HumanProfileWriteModel) NewChangedEvent(
|
||||
|
@ -75,13 +75,17 @@ func (wm *HumanRefreshTokenWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *HumanRefreshTokenWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType).
|
||||
query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
AddQuery().
|
||||
AggregateTypes(user.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
EventTypes(
|
||||
user.HumanRefreshTokenAddedType,
|
||||
user.HumanRefreshTokenRenewedType,
|
||||
user.HumanRefreshTokenRemovedType,
|
||||
user.UserRemovedType)
|
||||
user.UserRemovedType).
|
||||
Builder()
|
||||
|
||||
if wm.ResourceOwner != "" {
|
||||
query.ResourceOwner(wm.ResourceOwner)
|
||||
}
|
||||
|
@ -124,9 +124,11 @@ func (wm *HumanWebAuthNWriteModel) appendVerifiedEvent(e *user.HumanWebAuthNVeri
|
||||
}
|
||||
|
||||
func (wm *HumanWebAuthNWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(user.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
EventTypes(user.HumanU2FTokenAddedType,
|
||||
user.HumanPasswordlessTokenAddedType,
|
||||
user.HumanU2FTokenAddedType,
|
||||
@ -135,7 +137,8 @@ func (wm *HumanWebAuthNWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
user.HumanPasswordlessTokenSignCountChangedType,
|
||||
user.HumanU2FTokenRemovedType,
|
||||
user.HumanPasswordlessTokenRemovedType,
|
||||
user.UserRemovedType)
|
||||
user.UserRemovedType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
type HumanU2FTokensReadModel struct {
|
||||
@ -199,13 +202,16 @@ func (wm *HumanU2FTokensReadModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (rm *HumanU2FTokensReadModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType).
|
||||
AggregateIDs(rm.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(rm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(user.AggregateType).
|
||||
AggregateIDs(rm.AggregateID).
|
||||
EventTypes(
|
||||
user.HumanU2FTokenAddedType,
|
||||
user.HumanU2FTokenVerifiedType,
|
||||
user.HumanU2FTokenRemovedType)
|
||||
user.HumanU2FTokenRemovedType).
|
||||
Builder()
|
||||
|
||||
}
|
||||
|
||||
@ -279,13 +285,16 @@ func (wm *HumanPasswordlessTokensReadModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (rm *HumanPasswordlessTokensReadModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType).
|
||||
AggregateIDs(rm.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(rm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(user.AggregateType).
|
||||
AggregateIDs(rm.AggregateID).
|
||||
EventTypes(
|
||||
user.HumanPasswordlessTokenAddedType,
|
||||
user.HumanPasswordlessTokenVerifiedType,
|
||||
user.HumanPasswordlessTokenRemovedType)
|
||||
user.HumanPasswordlessTokenRemovedType).
|
||||
Builder()
|
||||
|
||||
}
|
||||
|
||||
@ -349,13 +358,15 @@ func (wm *HumanU2FLoginReadModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (rm *HumanU2FLoginReadModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType).
|
||||
AggregateIDs(rm.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(rm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(user.AggregateType).
|
||||
AggregateIDs(rm.AggregateID).
|
||||
EventTypes(
|
||||
user.HumanU2FTokenBeginLoginType,
|
||||
user.UserRemovedType,
|
||||
)
|
||||
user.UserRemovedType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
type HumanPasswordlessLoginReadModel struct {
|
||||
@ -408,12 +419,14 @@ func (wm *HumanPasswordlessLoginReadModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (rm *HumanPasswordlessLoginReadModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType).
|
||||
AggregateIDs(rm.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(rm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(user.AggregateType).
|
||||
AggregateIDs(rm.AggregateID).
|
||||
EventTypes(
|
||||
user.HumanPasswordlessTokenBeginLoginType,
|
||||
user.UserRemovedType,
|
||||
)
|
||||
user.UserRemovedType).
|
||||
Builder()
|
||||
|
||||
}
|
||||
|
@ -1,9 +1,10 @@
|
||||
package command
|
||||
|
||||
import (
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
"time"
|
||||
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
|
||||
"github.com/caos/zitadel/internal/domain"
|
||||
"github.com/caos/zitadel/internal/repository/user"
|
||||
)
|
||||
@ -65,13 +66,16 @@ func (wm *MachineKeyWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *MachineKeyWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(user.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
EventTypes(
|
||||
user.MachineKeyAddedEventType,
|
||||
user.MachineKeyRemovedEventType,
|
||||
user.UserRemovedType)
|
||||
user.UserRemovedType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func (wm *MachineKeyWriteModel) Exists() bool {
|
||||
|
@ -2,6 +2,7 @@ package command
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
|
||||
"github.com/caos/zitadel/internal/domain"
|
||||
@ -68,9 +69,11 @@ func (wm *MachineWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *MachineWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(wm.ResourceOwner).
|
||||
AddQuery().
|
||||
AggregateTypes(user.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
EventTypes(user.MachineAddedEventType,
|
||||
user.UserUserNameChangedType,
|
||||
user.MachineChangedEventType,
|
||||
@ -78,7 +81,8 @@ func (wm *MachineWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
user.UserUnlockedType,
|
||||
user.UserDeactivatedType,
|
||||
user.UserReactivatedType,
|
||||
user.UserRemovedType)
|
||||
user.UserRemovedType).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func (wm *MachineWriteModel) NewChangedEvent(
|
||||
|
@ -1,9 +1,10 @@
|
||||
package command
|
||||
|
||||
import (
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
"strings"
|
||||
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
|
||||
"github.com/caos/zitadel/internal/domain"
|
||||
caos_errors "github.com/caos/zitadel/internal/errors"
|
||||
"github.com/caos/zitadel/internal/repository/user"
|
||||
@ -67,7 +68,9 @@ func (wm *UserWriteModel) Reduce() error {
|
||||
}
|
||||
|
||||
func (wm *UserWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType).
|
||||
query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
AddQuery().
|
||||
AggregateTypes(user.AggregateType).
|
||||
AggregateIDs(wm.AggregateID).
|
||||
EventTypes(
|
||||
user.HumanAddedType,
|
||||
@ -83,7 +86,9 @@ func (wm *UserWriteModel) Query() *eventstore.SearchQueryBuilder {
|
||||
user.UserRemovedType,
|
||||
user.UserV1AddedType,
|
||||
user.UserV1RegisteredType,
|
||||
user.UserV1InitializedCheckSucceededType)
|
||||
user.UserV1InitializedCheckSucceededType).
|
||||
Builder()
|
||||
|
||||
if wm.ResourceOwner != "" {
|
||||
query.ResourceOwner(wm.ResourceOwner)
|
||||
}
|
||||
|
@ -14,8 +14,6 @@ type AssetAction int32
|
||||
const (
|
||||
AssetAdd AssetAction = iota
|
||||
AssetRemove
|
||||
|
||||
assetActionCount
|
||||
)
|
||||
|
||||
func NewAddAsset(
|
||||
|
@ -95,18 +95,6 @@ func uniqueConstraintsToRepository(constraints []*EventUniqueConstraint) (unique
|
||||
return uniqueConstraints
|
||||
}
|
||||
|
||||
func assetsToRepository(assets []*Asset) (result []*repository.Asset) {
|
||||
result = make([]*repository.Asset, len(assets))
|
||||
for i, asset := range assets {
|
||||
result[i] = &repository.Asset{
|
||||
ID: asset.ID,
|
||||
Asset: asset.Asset,
|
||||
Action: assetActionToRepository(asset.Action),
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
//FilterEvents filters the stored events based on the searchQuery
|
||||
// and maps the events to the defined event structs
|
||||
func (es *Eventstore) FilterEvents(ctx context.Context, queryFactory *SearchQueryBuilder) ([]EventReader, error) {
|
||||
@ -241,14 +229,3 @@ func uniqueConstraintActionToRepository(action UniqueConstraintAction) repositor
|
||||
return repository.UniqueConstraintAdd
|
||||
}
|
||||
}
|
||||
|
||||
func assetActionToRepository(action AssetAction) repository.AssetAction {
|
||||
switch action {
|
||||
case AssetAdd:
|
||||
return repository.AssetAdded
|
||||
case AssetRemove:
|
||||
return repository.AssetRemoved
|
||||
default:
|
||||
return repository.AssetAdded
|
||||
}
|
||||
}
|
||||
|
@ -13,31 +13,6 @@ import (
|
||||
"github.com/caos/zitadel/internal/eventstore/repository"
|
||||
)
|
||||
|
||||
type testAggregate struct {
|
||||
id string
|
||||
events []EventPusher
|
||||
}
|
||||
|
||||
func (a *testAggregate) ID() string {
|
||||
return a.id
|
||||
}
|
||||
|
||||
func (a *testAggregate) Type() AggregateType {
|
||||
return "test.aggregate"
|
||||
}
|
||||
|
||||
func (a *testAggregate) Events() []EventPusher {
|
||||
return a.events
|
||||
}
|
||||
|
||||
func (a *testAggregate) ResourceOwner() string {
|
||||
return "caos"
|
||||
}
|
||||
|
||||
func (a *testAggregate) Version() Version {
|
||||
return "v1"
|
||||
}
|
||||
|
||||
// testEvent implements the Event interface
|
||||
type testEvent struct {
|
||||
BaseEvent
|
||||
@ -368,7 +343,6 @@ func Test_eventData(t *testing.T) {
|
||||
|
||||
func TestEventstore_aggregatesToEvents(t *testing.T) {
|
||||
type args struct {
|
||||
aggregates []Aggregate
|
||||
events []EventPusher
|
||||
}
|
||||
type res struct {
|
||||
@ -892,8 +866,13 @@ func TestEventstore_FilterEvents(t *testing.T) {
|
||||
name: "no events",
|
||||
args: args{
|
||||
query: &SearchQueryBuilder{
|
||||
aggregateTypes: []AggregateType{"no.aggregates"},
|
||||
columns: repository.ColumnsEvent,
|
||||
queries: []*SearchQuery{
|
||||
{
|
||||
builder: &SearchQueryBuilder{},
|
||||
aggregateTypes: []AggregateType{"no.aggregates"},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
fields: fields{
|
||||
@ -915,8 +894,13 @@ func TestEventstore_FilterEvents(t *testing.T) {
|
||||
name: "repo error",
|
||||
args: args{
|
||||
query: &SearchQueryBuilder{
|
||||
aggregateTypes: []AggregateType{"no.aggregates"},
|
||||
columns: repository.ColumnsEvent,
|
||||
queries: []*SearchQuery{
|
||||
{
|
||||
builder: &SearchQueryBuilder{},
|
||||
aggregateTypes: []AggregateType{"no.aggregates"},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
fields: fields{
|
||||
@ -938,8 +922,13 @@ func TestEventstore_FilterEvents(t *testing.T) {
|
||||
name: "found events",
|
||||
args: args{
|
||||
query: &SearchQueryBuilder{
|
||||
aggregateTypes: []AggregateType{"test.aggregate"},
|
||||
columns: repository.ColumnsEvent,
|
||||
queries: []*SearchQuery{
|
||||
{
|
||||
builder: &SearchQueryBuilder{},
|
||||
aggregateTypes: []AggregateType{"test.aggregate"},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
fields: fields{
|
||||
@ -1016,8 +1005,13 @@ func TestEventstore_LatestSequence(t *testing.T) {
|
||||
name: "no events",
|
||||
args: args{
|
||||
query: &SearchQueryBuilder{
|
||||
aggregateTypes: []AggregateType{"no.aggregates"},
|
||||
columns: repository.ColumnsMaxSequence,
|
||||
queries: []*SearchQuery{
|
||||
{
|
||||
builder: &SearchQueryBuilder{},
|
||||
aggregateTypes: []AggregateType{"no.aggregates"},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
fields: fields{
|
||||
@ -1034,8 +1028,13 @@ func TestEventstore_LatestSequence(t *testing.T) {
|
||||
name: "repo error",
|
||||
args: args{
|
||||
query: &SearchQueryBuilder{
|
||||
aggregateTypes: []AggregateType{"no.aggregates"},
|
||||
columns: repository.ColumnsMaxSequence,
|
||||
queries: []*SearchQuery{
|
||||
{
|
||||
builder: &SearchQueryBuilder{},
|
||||
aggregateTypes: []AggregateType{"no.aggregates"},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
fields: fields{
|
||||
@ -1052,8 +1051,13 @@ func TestEventstore_LatestSequence(t *testing.T) {
|
||||
name: "found events",
|
||||
args: args{
|
||||
query: &SearchQueryBuilder{
|
||||
aggregateTypes: []AggregateType{"test.aggregate"},
|
||||
columns: repository.ColumnsMaxSequence,
|
||||
queries: []*SearchQuery{
|
||||
{
|
||||
builder: &SearchQueryBuilder{},
|
||||
aggregateTypes: []AggregateType{"test.aggregate"},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
fields: fields{
|
||||
@ -1134,8 +1138,13 @@ func TestEventstore_FilterToReducer(t *testing.T) {
|
||||
name: "no events",
|
||||
args: args{
|
||||
query: &SearchQueryBuilder{
|
||||
aggregateTypes: []AggregateType{"no.aggregates"},
|
||||
columns: repository.ColumnsEvent,
|
||||
queries: []*SearchQuery{
|
||||
{
|
||||
builder: &SearchQueryBuilder{},
|
||||
aggregateTypes: []AggregateType{"no.aggregates"},
|
||||
},
|
||||
},
|
||||
},
|
||||
readModel: &testReducer{
|
||||
t: t,
|
||||
@ -1161,8 +1170,13 @@ func TestEventstore_FilterToReducer(t *testing.T) {
|
||||
name: "repo error",
|
||||
args: args{
|
||||
query: &SearchQueryBuilder{
|
||||
aggregateTypes: []AggregateType{"no.aggregates"},
|
||||
columns: repository.ColumnsEvent,
|
||||
queries: []*SearchQuery{
|
||||
{
|
||||
builder: &SearchQueryBuilder{},
|
||||
aggregateTypes: []AggregateType{"no.aggregates"},
|
||||
},
|
||||
},
|
||||
},
|
||||
readModel: &testReducer{
|
||||
t: t,
|
||||
@ -1187,7 +1201,15 @@ func TestEventstore_FilterToReducer(t *testing.T) {
|
||||
{
|
||||
name: "found events",
|
||||
args: args{
|
||||
query: NewSearchQueryBuilder(repository.ColumnsEvent, "test.aggregate"),
|
||||
query: &SearchQueryBuilder{
|
||||
columns: repository.ColumnsEvent,
|
||||
queries: []*SearchQuery{
|
||||
{
|
||||
builder: &SearchQueryBuilder{},
|
||||
aggregateTypes: []AggregateType{"test.aggregate"},
|
||||
},
|
||||
},
|
||||
},
|
||||
readModel: &testReducer{
|
||||
t: t,
|
||||
expectedLength: 1,
|
||||
@ -1214,8 +1236,13 @@ func TestEventstore_FilterToReducer(t *testing.T) {
|
||||
name: "append in reducer fails",
|
||||
args: args{
|
||||
query: &SearchQueryBuilder{
|
||||
aggregateTypes: []AggregateType{"test.aggregate"},
|
||||
columns: repository.ColumnsEvent,
|
||||
queries: []*SearchQuery{
|
||||
{
|
||||
builder: &SearchQueryBuilder{},
|
||||
aggregateTypes: []AggregateType{"test.aggregate"},
|
||||
},
|
||||
},
|
||||
},
|
||||
readModel: &testReducer{
|
||||
t: t,
|
||||
@ -1275,13 +1302,6 @@ func combineEventLists(lists ...[]*repository.Event) []*repository.Event {
|
||||
return events
|
||||
}
|
||||
|
||||
func linkEvents(events ...*repository.Event) []*repository.Event {
|
||||
for i := 1; i < len(events); i++ {
|
||||
// events[i].PreviousEvent = events[i-1]
|
||||
}
|
||||
return events
|
||||
}
|
||||
|
||||
func compareEvents(t *testing.T, want, got *repository.Event) {
|
||||
t.Helper()
|
||||
|
||||
|
@ -311,7 +311,8 @@ func TestUserReadModel(t *testing.T) {
|
||||
fmt.Printf("%+v\n", events)
|
||||
|
||||
users := UsersReadModel{}
|
||||
err = es.FilterToReducer(context.Background(), eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, "test.user"), &users)
|
||||
|
||||
err = es.FilterToReducer(context.Background(), eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).AddQuery().AggregateTypes("test.user").Builder(), &users)
|
||||
if err != nil {
|
||||
t.Errorf("unexpected error on filter to reducer: %v", err)
|
||||
}
|
||||
|
@ -7,7 +7,7 @@ type SearchQuery struct {
|
||||
Columns Columns
|
||||
Limit uint64
|
||||
Desc bool
|
||||
Filters []*Filter
|
||||
Filters [][]*Filter
|
||||
}
|
||||
|
||||
//Columns defines which fields of the event are needed for the query
|
||||
|
@ -13,9 +13,6 @@ import (
|
||||
"github.com/caos/zitadel/internal/eventstore/repository"
|
||||
"github.com/cockroachdb/cockroach-go/v2/crdb"
|
||||
"github.com/lib/pq"
|
||||
|
||||
//sql import for cockroach
|
||||
_ "github.com/lib/pq"
|
||||
)
|
||||
|
||||
const (
|
||||
@ -163,7 +160,7 @@ func (db *CRDB) Push(ctx context.Context, events []*repository.Event, uniqueCons
|
||||
|
||||
// handleUniqueConstraints adds or removes unique constraints
|
||||
func (db *CRDB) handleUniqueConstraints(ctx context.Context, tx *sql.Tx, uniqueConstraints ...*repository.UniqueConstraint) (err error) {
|
||||
if uniqueConstraints == nil || len(uniqueConstraints) == 0 || (len(uniqueConstraints) == 1 && uniqueConstraints[0] == nil) {
|
||||
if len(uniqueConstraints) == 0 || (len(uniqueConstraints) == 1 && uniqueConstraints[0] == nil) {
|
||||
return nil
|
||||
}
|
||||
|
||||
|
@ -5,10 +5,8 @@ import (
|
||||
"sync"
|
||||
"testing"
|
||||
|
||||
"github.com/lib/pq"
|
||||
_ "github.com/lib/pq"
|
||||
|
||||
"github.com/caos/zitadel/internal/eventstore/repository"
|
||||
"github.com/lib/pq"
|
||||
)
|
||||
|
||||
func TestCRDB_placeholder(t *testing.T) {
|
||||
@ -749,11 +747,13 @@ func TestCRDB_Filter(t *testing.T) {
|
||||
args: args{
|
||||
searchQuery: &repository.SearchQuery{
|
||||
Columns: repository.ColumnsEvent,
|
||||
Filters: []*repository.Filter{
|
||||
Filters: [][]*repository.Filter{
|
||||
{
|
||||
repository.NewFilter(repository.FieldAggregateType, "not found", repository.OperationEquals),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
fields: fields{
|
||||
existingEvents: []*repository.Event{
|
||||
generateEvent(t, "300"),
|
||||
@ -771,12 +771,14 @@ func TestCRDB_Filter(t *testing.T) {
|
||||
args: args{
|
||||
searchQuery: &repository.SearchQuery{
|
||||
Columns: repository.ColumnsEvent,
|
||||
Filters: []*repository.Filter{
|
||||
Filters: [][]*repository.Filter{
|
||||
{
|
||||
repository.NewFilter(repository.FieldAggregateType, t.Name(), repository.OperationEquals),
|
||||
repository.NewFilter(repository.FieldAggregateID, "303", repository.OperationEquals),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
fields: fields{
|
||||
existingEvents: []*repository.Event{
|
||||
generateEvent(t, "303"),
|
||||
@ -837,11 +839,13 @@ func TestCRDB_LatestSequence(t *testing.T) {
|
||||
args: args{
|
||||
searchQuery: &repository.SearchQuery{
|
||||
Columns: repository.ColumnsMaxSequence,
|
||||
Filters: []*repository.Filter{
|
||||
Filters: [][]*repository.Filter{
|
||||
{
|
||||
repository.NewFilter(repository.FieldAggregateType, "not found", repository.OperationEquals),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
fields: fields{
|
||||
existingEvents: []*repository.Event{
|
||||
generateEvent(t, "400"),
|
||||
@ -859,11 +863,13 @@ func TestCRDB_LatestSequence(t *testing.T) {
|
||||
args: args{
|
||||
searchQuery: &repository.SearchQuery{
|
||||
Columns: repository.ColumnsMaxSequence,
|
||||
Filters: []*repository.Filter{
|
||||
Filters: [][]*repository.Filter{
|
||||
{
|
||||
repository.NewFilter(repository.FieldAggregateType, t.Name(), repository.OperationEquals),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
fields: fields{
|
||||
existingEvents: []*repository.Event{
|
||||
generateEvent(t, "401"),
|
||||
@ -1093,20 +1099,6 @@ func generateEvent(t *testing.T, aggregateID string, opts ...func(*repository.Ev
|
||||
return e
|
||||
}
|
||||
|
||||
func generateEventWithData(t *testing.T, aggregateID string, data []byte) *repository.Event {
|
||||
t.Helper()
|
||||
return &repository.Event{
|
||||
AggregateID: aggregateID,
|
||||
AggregateType: repository.AggregateType(t.Name()),
|
||||
EditorService: "svc",
|
||||
EditorUser: "user",
|
||||
ResourceOwner: "ro",
|
||||
Type: "test.created",
|
||||
Version: "v1",
|
||||
Data: data,
|
||||
}
|
||||
}
|
||||
|
||||
func generateAddUniqueConstraint(t *testing.T, table, uniqueField string) *repository.UniqueConstraint {
|
||||
t.Helper()
|
||||
e := &repository.UniqueConstraint{
|
||||
@ -1128,22 +1120,3 @@ func generateRemoveUniqueConstraint(t *testing.T, table, uniqueField string) *re
|
||||
|
||||
return e
|
||||
}
|
||||
|
||||
func generateAddAsset(t *testing.T, id string, asset []byte) *repository.Asset {
|
||||
t.Helper()
|
||||
e := &repository.Asset{
|
||||
ID: id,
|
||||
Asset: asset,
|
||||
Action: repository.AssetAdded,
|
||||
}
|
||||
return e
|
||||
}
|
||||
|
||||
func generateRemoveAsset(t *testing.T, id string) *repository.Asset {
|
||||
t.Helper()
|
||||
e := &repository.Asset{
|
||||
ID: id,
|
||||
Action: repository.AssetRemoved,
|
||||
}
|
||||
return e
|
||||
}
|
||||
|
@ -100,11 +100,6 @@ func fillUniqueData(unique_type, field string) error {
|
||||
return err
|
||||
}
|
||||
|
||||
func fillAssets(id string, asset []byte) error {
|
||||
_, err := testCRDBClient.Exec("INSERT INTO eventstore.assets (id, asset) VALUES ($1, $2)", id, asset)
|
||||
return err
|
||||
}
|
||||
|
||||
type migrationPaths []string
|
||||
|
||||
type version struct {
|
||||
|
@ -9,7 +9,6 @@ import (
|
||||
"strings"
|
||||
|
||||
"github.com/caos/logging"
|
||||
caos_errs "github.com/caos/zitadel/internal/errors"
|
||||
z_errors "github.com/caos/zitadel/internal/errors"
|
||||
"github.com/caos/zitadel/internal/eventstore/repository"
|
||||
"github.com/lib/pq"
|
||||
@ -26,14 +25,13 @@ type querier interface {
|
||||
orderByEventSequence(desc bool) string
|
||||
}
|
||||
|
||||
type rowScan func(scan, interface{}) error
|
||||
type scan func(dest ...interface{}) error
|
||||
|
||||
func query(ctx context.Context, criteria querier, searchQuery *repository.SearchQuery, dest interface{}) error {
|
||||
query, rowScanner := prepareColumns(criteria, searchQuery.Columns)
|
||||
where, values := prepareCondition(criteria, searchQuery.Filters)
|
||||
if where == "" || query == "" {
|
||||
return caos_errs.ThrowInvalidArgument(nil, "SQL-rWeBw", "invalid query factory")
|
||||
return z_errors.ThrowInvalidArgument(nil, "SQL-rWeBw", "invalid query factory")
|
||||
}
|
||||
query += where
|
||||
|
||||
@ -51,7 +49,7 @@ func query(ctx context.Context, criteria querier, searchQuery *repository.Search
|
||||
rows, err := criteria.db().QueryContext(ctx, query, values...)
|
||||
if err != nil {
|
||||
logging.Log("SQL-HP3Uk").WithError(err).Info("query failed")
|
||||
return caos_errs.ThrowInternal(err, "SQL-IJuyR", "unable to filter events")
|
||||
return z_errors.ThrowInternal(err, "SQL-IJuyR", "unable to filter events")
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
@ -125,15 +123,18 @@ func eventsScanner(scanner scan, dest interface{}) (err error) {
|
||||
return nil
|
||||
}
|
||||
|
||||
func prepareCondition(criteria querier, filters []*repository.Filter) (clause string, values []interface{}) {
|
||||
values = make([]interface{}, len(filters))
|
||||
clauses := make([]string, len(filters))
|
||||
func prepareCondition(criteria querier, filters [][]*repository.Filter) (clause string, values []interface{}) {
|
||||
values = make([]interface{}, 0, len(filters))
|
||||
|
||||
if len(filters) == 0 {
|
||||
return clause, values
|
||||
}
|
||||
for i, filter := range filters {
|
||||
value := filter.Value
|
||||
|
||||
clauses := make([]string, len(filters))
|
||||
for idx, filter := range filters {
|
||||
subClauses := make([]string, 0, len(filter))
|
||||
for _, f := range filter {
|
||||
value := f.Value
|
||||
switch value.(type) {
|
||||
case []bool, []float64, []int64, []string, []repository.AggregateType, []repository.EventType, *[]bool, *[]float64, *[]int64, *[]string, *[]repository.AggregateType, *[]repository.EventType:
|
||||
value = pq.Array(value)
|
||||
@ -141,15 +142,18 @@ func prepareCondition(criteria querier, filters []*repository.Filter) (clause st
|
||||
var err error
|
||||
value, err = json.Marshal(value)
|
||||
logging.Log("SQL-BSsNy").OnError(err).Warn("unable to marshal search value")
|
||||
continue
|
||||
}
|
||||
|
||||
clauses[i] = getCondition(criteria, filter)
|
||||
if clauses[i] == "" {
|
||||
subClauses = append(subClauses, getCondition(criteria, f))
|
||||
if subClauses[len(subClauses)-1] == "" {
|
||||
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) {
|
||||
|
@ -208,7 +208,7 @@ func prepareTestScan(err error, res []interface{}) scan {
|
||||
|
||||
func Test_prepareCondition(t *testing.T) {
|
||||
type args struct {
|
||||
filters []*repository.Filter
|
||||
filters [][]*repository.Filter
|
||||
}
|
||||
type res struct {
|
||||
clause string
|
||||
@ -232,7 +232,7 @@ func Test_prepareCondition(t *testing.T) {
|
||||
{
|
||||
name: "empty filters",
|
||||
args: args{
|
||||
filters: []*repository.Filter{},
|
||||
filters: [][]*repository.Filter{},
|
||||
},
|
||||
res: res{
|
||||
clause: "",
|
||||
@ -242,10 +242,12 @@ func Test_prepareCondition(t *testing.T) {
|
||||
{
|
||||
name: "invalid condition",
|
||||
args: args{
|
||||
filters: []*repository.Filter{
|
||||
filters: [][]*repository.Filter{
|
||||
{
|
||||
repository.NewFilter(repository.FieldAggregateID, "wrong", repository.Operation(-1)),
|
||||
},
|
||||
},
|
||||
},
|
||||
res: res{
|
||||
clause: "",
|
||||
values: nil,
|
||||
@ -254,26 +256,30 @@ func Test_prepareCondition(t *testing.T) {
|
||||
{
|
||||
name: "array as condition value",
|
||||
args: args{
|
||||
filters: []*repository.Filter{
|
||||
filters: [][]*repository.Filter{
|
||||
{
|
||||
repository.NewFilter(repository.FieldAggregateType, []repository.AggregateType{"user", "org"}, repository.OperationIn),
|
||||
},
|
||||
},
|
||||
},
|
||||
res: res{
|
||||
clause: " WHERE aggregate_type = ANY(?)",
|
||||
clause: " WHERE ( aggregate_type = ANY(?) )",
|
||||
values: []interface{}{pq.Array([]repository.AggregateType{"user", "org"})},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "multiple filters",
|
||||
args: args{
|
||||
filters: []*repository.Filter{
|
||||
filters: [][]*repository.Filter{
|
||||
{
|
||||
repository.NewFilter(repository.FieldAggregateType, []repository.AggregateType{"user", "org"}, repository.OperationIn),
|
||||
repository.NewFilter(repository.FieldAggregateID, "1234", repository.OperationEquals),
|
||||
repository.NewFilter(repository.FieldEventType, []repository.EventType{"user.created", "org.created"}, repository.OperationIn),
|
||||
},
|
||||
},
|
||||
},
|
||||
res: res{
|
||||
clause: " WHERE aggregate_type = ANY(?) AND aggregate_id = ? AND event_type = ANY(?)",
|
||||
clause: " WHERE ( aggregate_type = ANY(?) AND aggregate_id = ? AND event_type = ANY(?) )",
|
||||
values: []interface{}{pq.Array([]repository.AggregateType{"user", "org"}), "1234", pq.Array([]repository.EventType{"user.created", "org.created"})},
|
||||
},
|
||||
},
|
||||
@ -304,7 +310,6 @@ func Test_query_events_with_crdb(t *testing.T) {
|
||||
}
|
||||
type fields struct {
|
||||
existingEvents []*repository.Event
|
||||
existingAssets []*repository.Asset
|
||||
client *sql.DB
|
||||
}
|
||||
type res struct {
|
||||
@ -322,11 +327,13 @@ func Test_query_events_with_crdb(t *testing.T) {
|
||||
args: args{
|
||||
searchQuery: &repository.SearchQuery{
|
||||
Columns: repository.ColumnsEvent,
|
||||
Filters: []*repository.Filter{
|
||||
Filters: [][]*repository.Filter{
|
||||
{
|
||||
repository.NewFilter(repository.FieldAggregateType, "not found", repository.OperationEquals),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
fields: fields{
|
||||
client: testCRDBClient,
|
||||
existingEvents: []*repository.Event{
|
||||
@ -345,11 +352,13 @@ func Test_query_events_with_crdb(t *testing.T) {
|
||||
args: args{
|
||||
searchQuery: &repository.SearchQuery{
|
||||
Columns: repository.ColumnsEvent,
|
||||
Filters: []*repository.Filter{
|
||||
Filters: [][]*repository.Filter{
|
||||
{
|
||||
repository.NewFilter(repository.FieldAggregateType, t.Name(), repository.OperationEquals),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
fields: fields{
|
||||
client: testCRDBClient,
|
||||
existingEvents: []*repository.Event{
|
||||
@ -369,12 +378,14 @@ func Test_query_events_with_crdb(t *testing.T) {
|
||||
args: args{
|
||||
searchQuery: &repository.SearchQuery{
|
||||
Columns: repository.ColumnsEvent,
|
||||
Filters: []*repository.Filter{
|
||||
Filters: [][]*repository.Filter{
|
||||
{
|
||||
repository.NewFilter(repository.FieldAggregateType, t.Name(), repository.OperationEquals),
|
||||
repository.NewFilter(repository.FieldAggregateID, "303", repository.OperationEquals),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
fields: fields{
|
||||
client: testCRDBClient,
|
||||
existingEvents: []*repository.Event{
|
||||
@ -395,11 +406,13 @@ func Test_query_events_with_crdb(t *testing.T) {
|
||||
args: args{
|
||||
searchQuery: &repository.SearchQuery{
|
||||
Columns: repository.ColumnsEvent,
|
||||
Filters: []*repository.Filter{
|
||||
Filters: [][]*repository.Filter{
|
||||
{
|
||||
repository.NewFilter(repository.FieldResourceOwner, "caos", repository.OperationEquals),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
fields: fields{
|
||||
client: testCRDBClient,
|
||||
existingEvents: []*repository.Event{
|
||||
@ -420,12 +433,14 @@ func Test_query_events_with_crdb(t *testing.T) {
|
||||
args: args{
|
||||
searchQuery: &repository.SearchQuery{
|
||||
Columns: repository.ColumnsEvent,
|
||||
Filters: []*repository.Filter{
|
||||
Filters: [][]*repository.Filter{
|
||||
{
|
||||
repository.NewFilter(repository.FieldEditorService, "MANAGEMENT-API", repository.OperationEquals),
|
||||
repository.NewFilter(repository.FieldEditorService, "ADMIN-API", repository.OperationEquals),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
fields: fields{
|
||||
client: testCRDBClient,
|
||||
existingEvents: []*repository.Event{
|
||||
@ -446,13 +461,15 @@ func Test_query_events_with_crdb(t *testing.T) {
|
||||
args: args{
|
||||
searchQuery: &repository.SearchQuery{
|
||||
Columns: repository.ColumnsEvent,
|
||||
Filters: []*repository.Filter{
|
||||
Filters: [][]*repository.Filter{
|
||||
{
|
||||
repository.NewFilter(repository.FieldEditorUser, "adlerhurst", repository.OperationEquals),
|
||||
repository.NewFilter(repository.FieldEditorUser, "nobody", repository.OperationEquals),
|
||||
repository.NewFilter(repository.FieldEditorUser, "", repository.OperationEquals),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
fields: fields{
|
||||
client: testCRDBClient,
|
||||
existingEvents: []*repository.Event{
|
||||
@ -475,12 +492,14 @@ func Test_query_events_with_crdb(t *testing.T) {
|
||||
args: args{
|
||||
searchQuery: &repository.SearchQuery{
|
||||
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.updated"), repository.OperationEquals),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
fields: fields{
|
||||
client: testCRDBClient,
|
||||
existingEvents: []*repository.Event{
|
||||
@ -559,7 +578,8 @@ func Test_query_events_mocked(t *testing.T) {
|
||||
query: &repository.SearchQuery{
|
||||
Columns: repository.ColumnsEvent,
|
||||
Desc: true,
|
||||
Filters: []*repository.Filter{
|
||||
Filters: [][]*repository.Filter{
|
||||
{
|
||||
{
|
||||
Field: repository.FieldAggregateType,
|
||||
Value: repository.AggregateType("user"),
|
||||
@ -568,9 +588,10 @@ func Test_query_events_mocked(t *testing.T) {
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
fields: fields{
|
||||
mock: newMockClient(t).expectQuery(t,
|
||||
`SELECT creation_date, event_type, event_sequence, previous_sequence, event_data, editor_service, editor_user, resource_owner, aggregate_type, aggregate_id, aggregate_version FROM eventstore.events WHERE aggregate_type = \$1 ORDER BY event_sequence DESC`,
|
||||
`SELECT creation_date, event_type, event_sequence, previous_sequence, event_data, editor_service, editor_user, resource_owner, aggregate_type, aggregate_id, aggregate_version FROM eventstore.events WHERE \( aggregate_type = \$1 \) ORDER BY event_sequence DESC`,
|
||||
[]driver.Value{repository.AggregateType("user")},
|
||||
),
|
||||
},
|
||||
@ -586,7 +607,8 @@ func Test_query_events_mocked(t *testing.T) {
|
||||
Columns: repository.ColumnsEvent,
|
||||
Desc: false,
|
||||
Limit: 5,
|
||||
Filters: []*repository.Filter{
|
||||
Filters: [][]*repository.Filter{
|
||||
{
|
||||
{
|
||||
Field: repository.FieldAggregateType,
|
||||
Value: repository.AggregateType("user"),
|
||||
@ -595,9 +617,10 @@ func Test_query_events_mocked(t *testing.T) {
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
fields: fields{
|
||||
mock: newMockClient(t).expectQuery(t,
|
||||
`SELECT creation_date, event_type, event_sequence, previous_sequence, event_data, editor_service, editor_user, resource_owner, aggregate_type, aggregate_id, aggregate_version FROM eventstore.events WHERE aggregate_type = \$1 ORDER BY event_sequence LIMIT \$2`,
|
||||
`SELECT creation_date, event_type, event_sequence, previous_sequence, event_data, editor_service, editor_user, resource_owner, aggregate_type, aggregate_id, aggregate_version FROM eventstore.events WHERE \( aggregate_type = \$1 \) ORDER BY event_sequence LIMIT \$2`,
|
||||
[]driver.Value{repository.AggregateType("user"), uint64(5)},
|
||||
),
|
||||
},
|
||||
@ -613,7 +636,8 @@ func Test_query_events_mocked(t *testing.T) {
|
||||
Columns: repository.ColumnsEvent,
|
||||
Desc: true,
|
||||
Limit: 5,
|
||||
Filters: []*repository.Filter{
|
||||
Filters: [][]*repository.Filter{
|
||||
{
|
||||
{
|
||||
Field: repository.FieldAggregateType,
|
||||
Value: repository.AggregateType("user"),
|
||||
@ -622,9 +646,10 @@ func Test_query_events_mocked(t *testing.T) {
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
fields: fields{
|
||||
mock: newMockClient(t).expectQuery(t,
|
||||
`SELECT creation_date, event_type, event_sequence, previous_sequence, event_data, editor_service, editor_user, resource_owner, aggregate_type, aggregate_id, aggregate_version FROM eventstore.events WHERE aggregate_type = \$1 ORDER BY event_sequence DESC LIMIT \$2`,
|
||||
`SELECT creation_date, event_type, event_sequence, previous_sequence, event_data, editor_service, editor_user, resource_owner, aggregate_type, aggregate_id, aggregate_version FROM eventstore.events WHERE \( aggregate_type = \$1 \) ORDER BY event_sequence DESC LIMIT \$2`,
|
||||
[]driver.Value{repository.AggregateType("user"), uint64(5)},
|
||||
),
|
||||
},
|
||||
@ -640,7 +665,8 @@ func Test_query_events_mocked(t *testing.T) {
|
||||
Columns: repository.ColumnsEvent,
|
||||
Desc: true,
|
||||
Limit: 0,
|
||||
Filters: []*repository.Filter{
|
||||
Filters: [][]*repository.Filter{
|
||||
{
|
||||
{
|
||||
Field: repository.FieldAggregateType,
|
||||
Value: repository.AggregateType("user"),
|
||||
@ -649,9 +675,10 @@ func Test_query_events_mocked(t *testing.T) {
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
fields: fields{
|
||||
mock: newMockClient(t).expectQueryErr(t,
|
||||
`SELECT creation_date, event_type, event_sequence, previous_sequence, event_data, editor_service, editor_user, resource_owner, aggregate_type, aggregate_id, aggregate_version FROM eventstore.events WHERE aggregate_type = \$1 ORDER BY event_sequence DESC`,
|
||||
`SELECT creation_date, event_type, event_sequence, previous_sequence, event_data, editor_service, editor_user, resource_owner, aggregate_type, aggregate_id, aggregate_version FROM eventstore.events WHERE \( aggregate_type = \$1 \) ORDER BY event_sequence DESC`,
|
||||
[]driver.Value{repository.AggregateType("user")},
|
||||
sql.ErrConnDone),
|
||||
},
|
||||
@ -667,7 +694,8 @@ func Test_query_events_mocked(t *testing.T) {
|
||||
Columns: repository.ColumnsEvent,
|
||||
Desc: true,
|
||||
Limit: 0,
|
||||
Filters: []*repository.Filter{
|
||||
Filters: [][]*repository.Filter{
|
||||
{
|
||||
{
|
||||
Field: repository.FieldAggregateType,
|
||||
Value: repository.AggregateType("user"),
|
||||
@ -676,9 +704,10 @@ func Test_query_events_mocked(t *testing.T) {
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
fields: fields{
|
||||
mock: newMockClient(t).expectQuery(t,
|
||||
`SELECT creation_date, event_type, event_sequence, previous_sequence, event_data, editor_service, editor_user, resource_owner, aggregate_type, aggregate_id, aggregate_version FROM eventstore.events WHERE aggregate_type = \$1 ORDER BY event_sequence DESC`,
|
||||
`SELECT creation_date, event_type, event_sequence, previous_sequence, event_data, editor_service, editor_user, resource_owner, aggregate_type, aggregate_id, aggregate_version FROM eventstore.events WHERE \( aggregate_type = \$1 \) ORDER BY event_sequence DESC`,
|
||||
[]driver.Value{repository.AggregateType("user")},
|
||||
&repository.Event{Sequence: 100}),
|
||||
},
|
||||
@ -702,15 +731,58 @@ func Test_query_events_mocked(t *testing.T) {
|
||||
args: args{
|
||||
query: &repository.SearchQuery{
|
||||
Columns: repository.ColumnsEvent,
|
||||
Filters: []*repository.Filter{
|
||||
Filters: [][]*repository.Filter{
|
||||
{
|
||||
{},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
res: res{
|
||||
wantErr: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "with subqueries",
|
||||
args: args{
|
||||
dest: &[]*repository.Event{},
|
||||
query: &repository.SearchQuery{
|
||||
Columns: repository.ColumnsEvent,
|
||||
Desc: true,
|
||||
Limit: 5,
|
||||
Filters: [][]*repository.Filter{
|
||||
{
|
||||
{
|
||||
Field: repository.FieldAggregateType,
|
||||
Value: repository.AggregateType("user"),
|
||||
Operation: repository.OperationEquals,
|
||||
},
|
||||
},
|
||||
{
|
||||
{
|
||||
Field: repository.FieldAggregateType,
|
||||
Value: repository.AggregateType("org"),
|
||||
Operation: repository.OperationEquals,
|
||||
},
|
||||
{
|
||||
Field: repository.FieldAggregateID,
|
||||
Value: "asdf42",
|
||||
Operation: repository.OperationEquals,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
fields: fields{
|
||||
mock: newMockClient(t).expectQuery(t,
|
||||
`SELECT creation_date, event_type, event_sequence, previous_sequence, event_data, editor_service, editor_user, resource_owner, aggregate_type, aggregate_id, aggregate_version FROM eventstore.events WHERE \( aggregate_type = \$1 \) OR \( aggregate_type = \$2 AND aggregate_id = \$3 \) ORDER BY event_sequence DESC LIMIT \$4`,
|
||||
[]driver.Value{repository.AggregateType("user"), repository.AggregateType("org"), "asdf42", uint64(5)},
|
||||
),
|
||||
},
|
||||
res: res{
|
||||
wantErr: false,
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
|
@ -11,12 +11,17 @@ type SearchQueryBuilder struct {
|
||||
columns repository.Columns
|
||||
limit uint64
|
||||
desc bool
|
||||
resourceOwner string
|
||||
queries []*SearchQuery
|
||||
}
|
||||
|
||||
type SearchQuery struct {
|
||||
builder *SearchQueryBuilder
|
||||
aggregateTypes []AggregateType
|
||||
aggregateIDs []string
|
||||
eventSequence uint64
|
||||
eventTypes []EventType
|
||||
eventData map[string]interface{}
|
||||
resourceOwner string
|
||||
}
|
||||
|
||||
// Columns defines which fields of the event are needed for the query
|
||||
@ -37,83 +42,122 @@ type EventType repository.EventType
|
||||
|
||||
// NewSearchQueryBuilder creates a new factory for event filters
|
||||
// aggregateTypes must contain at least one aggregate type
|
||||
func NewSearchQueryBuilder(columns Columns, aggregateTypes ...AggregateType) *SearchQueryBuilder {
|
||||
func NewSearchQueryBuilder(columns Columns) *SearchQueryBuilder {
|
||||
return &SearchQueryBuilder{
|
||||
columns: repository.Columns(columns),
|
||||
aggregateTypes: aggregateTypes,
|
||||
}
|
||||
}
|
||||
|
||||
//Columns defines which fields are set
|
||||
func (factory *SearchQueryBuilder) Columns(columns Columns) *SearchQueryBuilder {
|
||||
factory.columns = repository.Columns(columns)
|
||||
return factory
|
||||
}
|
||||
|
||||
//Limit defines how many events are returned maximally.
|
||||
func (factory *SearchQueryBuilder) Limit(limit uint64) *SearchQueryBuilder {
|
||||
factory.limit = limit
|
||||
return factory
|
||||
}
|
||||
|
||||
func (factory *SearchQueryBuilder) SequenceGreater(sequence uint64) *SearchQueryBuilder {
|
||||
factory.eventSequence = sequence
|
||||
return factory
|
||||
}
|
||||
|
||||
func (factory *SearchQueryBuilder) AggregateIDs(ids ...string) *SearchQueryBuilder {
|
||||
factory.aggregateIDs = ids
|
||||
return factory
|
||||
}
|
||||
|
||||
func (factory *SearchQueryBuilder) EventTypes(types ...EventType) *SearchQueryBuilder {
|
||||
factory.eventTypes = types
|
||||
return factory
|
||||
}
|
||||
|
||||
//ResourceOwner defines the resource owner (org) of the events
|
||||
func (factory *SearchQueryBuilder) ResourceOwner(resourceOwner string) *SearchQueryBuilder {
|
||||
factory.resourceOwner = resourceOwner
|
||||
return factory
|
||||
}
|
||||
|
||||
//OrderDesc changes the sorting order of the returned events to descending
|
||||
func (factory *SearchQueryBuilder) OrderDesc() *SearchQueryBuilder {
|
||||
factory.desc = true
|
||||
return factory
|
||||
}
|
||||
|
||||
//OrderAsc changes the sorting order of the returned events to ascending
|
||||
func (factory *SearchQueryBuilder) OrderAsc() *SearchQueryBuilder {
|
||||
factory.desc = false
|
||||
return factory
|
||||
}
|
||||
|
||||
func (factory *SearchQueryBuilder) EventData(query map[string]interface{}) *SearchQueryBuilder {
|
||||
factory.eventData = query
|
||||
return factory
|
||||
//AddQuery creates a new sub query.
|
||||
//All fields in the sub query are AND-connected in the storage request.
|
||||
//Multiple sub queries are OR-connected in the storage request.
|
||||
func (factory *SearchQueryBuilder) AddQuery() *SearchQuery {
|
||||
query := &SearchQuery{
|
||||
builder: factory,
|
||||
}
|
||||
factory.queries = append(factory.queries, query)
|
||||
|
||||
return query
|
||||
}
|
||||
|
||||
//Or creates a new sub query on the search query builder
|
||||
func (query SearchQuery) Or() *SearchQuery {
|
||||
return query.builder.AddQuery()
|
||||
}
|
||||
|
||||
//AggregateTypes filters for events with the given aggregate types
|
||||
func (query *SearchQuery) AggregateTypes(types ...AggregateType) *SearchQuery {
|
||||
query.aggregateTypes = types
|
||||
return query
|
||||
}
|
||||
|
||||
//SequenceGreater filters for events with sequence greater the requested sequence
|
||||
func (query *SearchQuery) SequenceGreater(sequence uint64) *SearchQuery {
|
||||
query.eventSequence = sequence
|
||||
return query
|
||||
}
|
||||
|
||||
//AggregateIDs filters for events with the given aggregate id's
|
||||
func (query *SearchQuery) AggregateIDs(ids ...string) *SearchQuery {
|
||||
query.aggregateIDs = ids
|
||||
return query
|
||||
}
|
||||
|
||||
//EventTypes filters for events with the given event types
|
||||
func (query *SearchQuery) EventTypes(types ...EventType) *SearchQuery {
|
||||
query.eventTypes = types
|
||||
return query
|
||||
}
|
||||
|
||||
//EventData filters for events with the given event data.
|
||||
//Use this call with care as it will be slower than the other filters.
|
||||
func (query *SearchQuery) EventData(data map[string]interface{}) *SearchQuery {
|
||||
query.eventData = data
|
||||
return query
|
||||
}
|
||||
|
||||
//Builder returns the SearchQueryBuilder of the sub query
|
||||
func (query *SearchQuery) Builder() *SearchQueryBuilder {
|
||||
return query.builder
|
||||
}
|
||||
|
||||
func (factory *SearchQueryBuilder) build() (*repository.SearchQuery, error) {
|
||||
if factory == nil ||
|
||||
len(factory.aggregateTypes) < 1 ||
|
||||
len(factory.queries) < 1 ||
|
||||
factory.columns.Validate() != nil {
|
||||
return nil, errors.ThrowPreconditionFailed(nil, "MODEL-4m9gs", "factory invalid")
|
||||
}
|
||||
filters := []*repository.Filter{
|
||||
factory.aggregateTypeFilter(),
|
||||
}
|
||||
filters := make([][]*repository.Filter, len(factory.queries))
|
||||
|
||||
for i, query := range factory.queries {
|
||||
for _, f := range []func() *repository.Filter{
|
||||
factory.aggregateIDFilter,
|
||||
factory.eventSequenceFilter,
|
||||
factory.eventTypeFilter,
|
||||
factory.resourceOwnerFilter,
|
||||
factory.eventDataFilter,
|
||||
query.aggregateTypeFilter,
|
||||
query.aggregateIDFilter,
|
||||
query.eventSequenceFilter,
|
||||
query.eventTypeFilter,
|
||||
query.eventDataFilter,
|
||||
query.builder.resourceOwnerFilter,
|
||||
} {
|
||||
if filter := f(); filter != nil {
|
||||
if err := filter.Validate(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
filters = append(filters, filter)
|
||||
filters[i] = append(filters[i], filter)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return &repository.SearchQuery{
|
||||
Columns: factory.columns,
|
||||
Limit: factory.limit,
|
||||
@ -122,50 +166,50 @@ func (factory *SearchQueryBuilder) build() (*repository.SearchQuery, error) {
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (factory *SearchQueryBuilder) aggregateIDFilter() *repository.Filter {
|
||||
if len(factory.aggregateIDs) < 1 {
|
||||
func (query *SearchQuery) aggregateIDFilter() *repository.Filter {
|
||||
if len(query.aggregateIDs) < 1 {
|
||||
return nil
|
||||
}
|
||||
if len(factory.aggregateIDs) == 1 {
|
||||
return repository.NewFilter(repository.FieldAggregateID, factory.aggregateIDs[0], repository.OperationEquals)
|
||||
if len(query.aggregateIDs) == 1 {
|
||||
return repository.NewFilter(repository.FieldAggregateID, query.aggregateIDs[0], repository.OperationEquals)
|
||||
}
|
||||
return repository.NewFilter(repository.FieldAggregateID, factory.aggregateIDs, repository.OperationIn)
|
||||
return repository.NewFilter(repository.FieldAggregateID, query.aggregateIDs, repository.OperationIn)
|
||||
}
|
||||
|
||||
func (factory *SearchQueryBuilder) eventTypeFilter() *repository.Filter {
|
||||
if len(factory.eventTypes) < 1 {
|
||||
func (query *SearchQuery) eventTypeFilter() *repository.Filter {
|
||||
if len(query.eventTypes) < 1 {
|
||||
return nil
|
||||
}
|
||||
if len(factory.eventTypes) == 1 {
|
||||
return repository.NewFilter(repository.FieldEventType, repository.EventType(factory.eventTypes[0]), repository.OperationEquals)
|
||||
if len(query.eventTypes) == 1 {
|
||||
return repository.NewFilter(repository.FieldEventType, repository.EventType(query.eventTypes[0]), repository.OperationEquals)
|
||||
}
|
||||
eventTypes := make([]repository.EventType, len(factory.eventTypes))
|
||||
for i, eventType := range factory.eventTypes {
|
||||
eventTypes := make([]repository.EventType, len(query.eventTypes))
|
||||
for i, eventType := range query.eventTypes {
|
||||
eventTypes[i] = repository.EventType(eventType)
|
||||
}
|
||||
return repository.NewFilter(repository.FieldEventType, eventTypes, repository.OperationIn)
|
||||
}
|
||||
|
||||
func (factory *SearchQueryBuilder) aggregateTypeFilter() *repository.Filter {
|
||||
if len(factory.aggregateTypes) == 1 {
|
||||
return repository.NewFilter(repository.FieldAggregateType, repository.AggregateType(factory.aggregateTypes[0]), repository.OperationEquals)
|
||||
func (query *SearchQuery) aggregateTypeFilter() *repository.Filter {
|
||||
if len(query.aggregateTypes) == 1 {
|
||||
return repository.NewFilter(repository.FieldAggregateType, repository.AggregateType(query.aggregateTypes[0]), repository.OperationEquals)
|
||||
}
|
||||
aggregateTypes := make([]repository.AggregateType, len(factory.aggregateTypes))
|
||||
for i, aggregateType := range factory.aggregateTypes {
|
||||
aggregateTypes := make([]repository.AggregateType, len(query.aggregateTypes))
|
||||
for i, aggregateType := range query.aggregateTypes {
|
||||
aggregateTypes[i] = repository.AggregateType(aggregateType)
|
||||
}
|
||||
return repository.NewFilter(repository.FieldAggregateType, aggregateTypes, repository.OperationIn)
|
||||
}
|
||||
|
||||
func (factory *SearchQueryBuilder) eventSequenceFilter() *repository.Filter {
|
||||
if factory.eventSequence == 0 {
|
||||
func (query *SearchQuery) eventSequenceFilter() *repository.Filter {
|
||||
if query.eventSequence == 0 {
|
||||
return nil
|
||||
}
|
||||
sortOrder := repository.OperationGreater
|
||||
if factory.desc {
|
||||
if query.builder.desc {
|
||||
sortOrder = repository.OperationLess
|
||||
}
|
||||
return repository.NewFilter(repository.FieldSequence, factory.eventSequence, sortOrder)
|
||||
return repository.NewFilter(repository.FieldSequence, query.eventSequence, sortOrder)
|
||||
}
|
||||
|
||||
func (factory *SearchQueryBuilder) resourceOwnerFilter() *repository.Filter {
|
||||
@ -175,9 +219,9 @@ func (factory *SearchQueryBuilder) resourceOwnerFilter() *repository.Filter {
|
||||
return repository.NewFilter(repository.FieldResourceOwner, factory.resourceOwner, repository.OperationEquals)
|
||||
}
|
||||
|
||||
func (factory *SearchQueryBuilder) eventDataFilter() *repository.Filter {
|
||||
if len(factory.eventData) == 0 {
|
||||
func (query *SearchQuery) eventDataFilter() *repository.Filter {
|
||||
if len(query.eventData) == 0 {
|
||||
return nil
|
||||
}
|
||||
return repository.NewFilter(repository.FieldEventData, factory.eventData, repository.OperationJSONContains)
|
||||
return repository.NewFilter(repository.FieldEventData, query.eventData, repository.OperationJSONContains)
|
||||
}
|
||||
|
@ -9,6 +9,16 @@ import (
|
||||
"github.com/caos/zitadel/internal/eventstore/repository"
|
||||
)
|
||||
|
||||
func testAddQuery(queryFuncs ...func(*SearchQuery) *SearchQuery) func(*SearchQueryBuilder) *SearchQueryBuilder {
|
||||
return func(builder *SearchQueryBuilder) *SearchQueryBuilder {
|
||||
query := builder.AddQuery()
|
||||
for _, queryFunc := range queryFuncs {
|
||||
queryFunc(query)
|
||||
}
|
||||
return query.Builder()
|
||||
}
|
||||
}
|
||||
|
||||
func testSetColumns(columns Columns) func(factory *SearchQueryBuilder) *SearchQueryBuilder {
|
||||
return func(factory *SearchQueryBuilder) *SearchQueryBuilder {
|
||||
factory = factory.Columns(columns)
|
||||
@ -23,49 +33,65 @@ func testSetLimit(limit uint64) func(factory *SearchQueryBuilder) *SearchQueryBu
|
||||
}
|
||||
}
|
||||
|
||||
func testSetSequence(sequence uint64) func(factory *SearchQueryBuilder) *SearchQueryBuilder {
|
||||
return func(factory *SearchQueryBuilder) *SearchQueryBuilder {
|
||||
factory = factory.SequenceGreater(sequence)
|
||||
return factory
|
||||
func testOr(queryFuncs ...func(*SearchQuery) *SearchQuery) func(*SearchQuery) *SearchQuery {
|
||||
return func(query *SearchQuery) *SearchQuery {
|
||||
subQuery := query.Or()
|
||||
for _, queryFunc := range queryFuncs {
|
||||
queryFunc(subQuery)
|
||||
}
|
||||
return subQuery
|
||||
}
|
||||
}
|
||||
|
||||
func testSetAggregateIDs(aggregateIDs ...string) func(factory *SearchQueryBuilder) *SearchQueryBuilder {
|
||||
return func(factory *SearchQueryBuilder) *SearchQueryBuilder {
|
||||
factory = factory.AggregateIDs(aggregateIDs...)
|
||||
return factory
|
||||
func testSetAggregateTypes(types ...AggregateType) func(*SearchQuery) *SearchQuery {
|
||||
return func(query *SearchQuery) *SearchQuery {
|
||||
query = query.AggregateTypes(types...)
|
||||
return query
|
||||
}
|
||||
}
|
||||
|
||||
func testSetEventTypes(eventTypes ...EventType) func(factory *SearchQueryBuilder) *SearchQueryBuilder {
|
||||
return func(factory *SearchQueryBuilder) *SearchQueryBuilder {
|
||||
factory = factory.EventTypes(eventTypes...)
|
||||
return factory
|
||||
func testSetSequence(sequence uint64) func(*SearchQuery) *SearchQuery {
|
||||
return func(query *SearchQuery) *SearchQuery {
|
||||
query = query.SequenceGreater(sequence)
|
||||
return query
|
||||
}
|
||||
}
|
||||
|
||||
func testSetResourceOwner(resourceOwner string) func(factory *SearchQueryBuilder) *SearchQueryBuilder {
|
||||
return func(factory *SearchQueryBuilder) *SearchQueryBuilder {
|
||||
factory = factory.ResourceOwner(resourceOwner)
|
||||
return factory
|
||||
func testSetAggregateIDs(aggregateIDs ...string) func(*SearchQuery) *SearchQuery {
|
||||
return func(query *SearchQuery) *SearchQuery {
|
||||
query = query.AggregateIDs(aggregateIDs...)
|
||||
return query
|
||||
}
|
||||
}
|
||||
|
||||
func testSetSortOrder(asc bool) func(factory *SearchQueryBuilder) *SearchQueryBuilder {
|
||||
return func(factory *SearchQueryBuilder) *SearchQueryBuilder {
|
||||
func testSetEventTypes(eventTypes ...EventType) func(*SearchQuery) *SearchQuery {
|
||||
return func(query *SearchQuery) *SearchQuery {
|
||||
query = query.EventTypes(eventTypes...)
|
||||
return query
|
||||
}
|
||||
}
|
||||
|
||||
func testSetResourceOwner(resourceOwner string) func(*SearchQueryBuilder) *SearchQueryBuilder {
|
||||
return func(builder *SearchQueryBuilder) *SearchQueryBuilder {
|
||||
builder = builder.ResourceOwner(resourceOwner)
|
||||
return builder
|
||||
}
|
||||
}
|
||||
|
||||
func testSetSortOrder(asc bool) func(*SearchQueryBuilder) *SearchQueryBuilder {
|
||||
return func(query *SearchQueryBuilder) *SearchQueryBuilder {
|
||||
if asc {
|
||||
factory = factory.OrderAsc()
|
||||
query = query.OrderAsc()
|
||||
} else {
|
||||
factory = factory.OrderDesc()
|
||||
query = query.OrderDesc()
|
||||
}
|
||||
return factory
|
||||
return query
|
||||
}
|
||||
}
|
||||
|
||||
func TestSearchQueryFactorySetters(t *testing.T) {
|
||||
type args struct {
|
||||
columns Columns
|
||||
aggregateTypes []AggregateType
|
||||
setters []func(*SearchQueryBuilder) *SearchQueryBuilder
|
||||
}
|
||||
tests := []struct {
|
||||
@ -77,11 +103,9 @@ func TestSearchQueryFactorySetters(t *testing.T) {
|
||||
name: "New factory",
|
||||
args: args{
|
||||
columns: ColumnsEvent,
|
||||
aggregateTypes: []AggregateType{"user", "org"},
|
||||
},
|
||||
res: &SearchQueryBuilder{
|
||||
columns: repository.Columns(ColumnsEvent),
|
||||
aggregateTypes: []AggregateType{"user", "org"},
|
||||
},
|
||||
},
|
||||
{
|
||||
@ -105,30 +129,42 @@ func TestSearchQueryFactorySetters(t *testing.T) {
|
||||
{
|
||||
name: "set sequence",
|
||||
args: args{
|
||||
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{testSetSequence(90)},
|
||||
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{testAddQuery(testSetSequence(90))},
|
||||
},
|
||||
res: &SearchQueryBuilder{
|
||||
queries: []*SearchQuery{
|
||||
{
|
||||
eventSequence: 90,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "set aggregateIDs",
|
||||
args: args{
|
||||
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{testSetAggregateIDs("1235", "09824")},
|
||||
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{testAddQuery(testSetAggregateIDs("1235", "09824"))},
|
||||
},
|
||||
res: &SearchQueryBuilder{
|
||||
queries: []*SearchQuery{
|
||||
{
|
||||
aggregateIDs: []string{"1235", "09824"},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "set eventTypes",
|
||||
args: args{
|
||||
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{testSetEventTypes("user.created", "user.updated")},
|
||||
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{testAddQuery(testSetEventTypes("user.created", "user.updated"))},
|
||||
},
|
||||
res: &SearchQueryBuilder{
|
||||
queries: []*SearchQuery{
|
||||
{
|
||||
eventTypes: []EventType{"user.created", "user.updated"},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "set resource owner",
|
||||
args: args{
|
||||
@ -141,25 +177,27 @@ func TestSearchQueryFactorySetters(t *testing.T) {
|
||||
{
|
||||
name: "default search query",
|
||||
args: args{
|
||||
aggregateTypes: []AggregateType{"user"},
|
||||
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{testSetAggregateIDs("1235", "024"), testSetSortOrder(false)},
|
||||
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{testAddQuery(testSetAggregateTypes("user"), testSetAggregateIDs("1235", "024")), testSetSortOrder(false)},
|
||||
},
|
||||
res: &SearchQueryBuilder{
|
||||
desc: true,
|
||||
queries: []*SearchQuery{
|
||||
{
|
||||
aggregateTypes: []AggregateType{"user"},
|
||||
aggregateIDs: []string{"1235", "024"},
|
||||
desc: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
factory := NewSearchQueryBuilder(tt.args.columns, tt.args.aggregateTypes...)
|
||||
builder := NewSearchQueryBuilder(tt.args.columns)
|
||||
for _, setter := range tt.args.setters {
|
||||
factory = setter(factory)
|
||||
}
|
||||
if !reflect.DeepEqual(factory, tt.res) {
|
||||
t.Errorf("NewSearchQueryFactory() = %v, want %v", factory, tt.res)
|
||||
builder = setter(builder)
|
||||
}
|
||||
|
||||
assertBuilder(t, tt.res, builder)
|
||||
})
|
||||
}
|
||||
}
|
||||
@ -167,7 +205,6 @@ func TestSearchQueryFactorySetters(t *testing.T) {
|
||||
func TestSearchQueryFactoryBuild(t *testing.T) {
|
||||
type args struct {
|
||||
columns Columns
|
||||
aggregateTypes []AggregateType
|
||||
setters []func(*SearchQueryBuilder) *SearchQueryBuilder
|
||||
}
|
||||
type res struct {
|
||||
@ -183,7 +220,6 @@ func TestSearchQueryFactoryBuild(t *testing.T) {
|
||||
name: "no aggregate types",
|
||||
args: args{
|
||||
columns: ColumnsEvent,
|
||||
aggregateTypes: []AggregateType{},
|
||||
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{},
|
||||
},
|
||||
res: res{
|
||||
@ -195,9 +231,9 @@ func TestSearchQueryFactoryBuild(t *testing.T) {
|
||||
name: "invalid column (too low)",
|
||||
args: args{
|
||||
columns: ColumnsEvent,
|
||||
aggregateTypes: []AggregateType{"user"},
|
||||
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{
|
||||
testSetColumns(Columns(-1)),
|
||||
testAddQuery(testSetAggregateTypes("user")),
|
||||
},
|
||||
},
|
||||
res: res{
|
||||
@ -208,9 +244,9 @@ func TestSearchQueryFactoryBuild(t *testing.T) {
|
||||
name: "invalid column (too high)",
|
||||
args: args{
|
||||
columns: ColumnsEvent,
|
||||
aggregateTypes: []AggregateType{"user"},
|
||||
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{
|
||||
testSetColumns(math.MaxInt32),
|
||||
testAddQuery(testSetAggregateTypes("uesr")),
|
||||
},
|
||||
},
|
||||
res: res{
|
||||
@ -221,8 +257,9 @@ func TestSearchQueryFactoryBuild(t *testing.T) {
|
||||
name: "filter aggregate type",
|
||||
args: args{
|
||||
columns: ColumnsEvent,
|
||||
aggregateTypes: []AggregateType{"user"},
|
||||
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{},
|
||||
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{
|
||||
testAddQuery(testSetAggregateTypes("user")),
|
||||
},
|
||||
},
|
||||
res: res{
|
||||
isErr: nil,
|
||||
@ -230,18 +267,21 @@ func TestSearchQueryFactoryBuild(t *testing.T) {
|
||||
Columns: repository.ColumnsEvent,
|
||||
Desc: false,
|
||||
Limit: 0,
|
||||
Filters: []*repository.Filter{
|
||||
Filters: [][]*repository.Filter{
|
||||
{
|
||||
repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "filter aggregate types",
|
||||
args: args{
|
||||
columns: ColumnsEvent,
|
||||
aggregateTypes: []AggregateType{"user", "org"},
|
||||
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{},
|
||||
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{
|
||||
testAddQuery(testSetAggregateTypes("user", "org")),
|
||||
},
|
||||
},
|
||||
res: res{
|
||||
isErr: nil,
|
||||
@ -249,21 +289,25 @@ func TestSearchQueryFactoryBuild(t *testing.T) {
|
||||
Columns: repository.ColumnsEvent,
|
||||
Desc: false,
|
||||
Limit: 0,
|
||||
Filters: []*repository.Filter{
|
||||
Filters: [][]*repository.Filter{
|
||||
{
|
||||
repository.NewFilter(repository.FieldAggregateType, []repository.AggregateType{"user", "org"}, repository.OperationIn),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "filter aggregate type, limit, desc",
|
||||
args: args{
|
||||
columns: ColumnsEvent,
|
||||
aggregateTypes: []AggregateType{"user"},
|
||||
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{
|
||||
testSetLimit(5),
|
||||
testSetSortOrder(false),
|
||||
testAddQuery(
|
||||
testSetSequence(100),
|
||||
testSetAggregateTypes("user"),
|
||||
),
|
||||
},
|
||||
},
|
||||
res: res{
|
||||
@ -272,22 +316,26 @@ func TestSearchQueryFactoryBuild(t *testing.T) {
|
||||
Columns: repository.ColumnsEvent,
|
||||
Desc: true,
|
||||
Limit: 5,
|
||||
Filters: []*repository.Filter{
|
||||
Filters: [][]*repository.Filter{
|
||||
{
|
||||
repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals),
|
||||
repository.NewFilter(repository.FieldSequence, uint64(100), repository.OperationLess),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "filter aggregate type, limit, asc",
|
||||
args: args{
|
||||
columns: ColumnsEvent,
|
||||
aggregateTypes: []AggregateType{"user"},
|
||||
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{
|
||||
testSetLimit(5),
|
||||
testSetSortOrder(true),
|
||||
testAddQuery(
|
||||
testSetSequence(100),
|
||||
testSetAggregateTypes("user"),
|
||||
),
|
||||
},
|
||||
},
|
||||
res: res{
|
||||
@ -296,23 +344,27 @@ func TestSearchQueryFactoryBuild(t *testing.T) {
|
||||
Columns: repository.ColumnsEvent,
|
||||
Desc: false,
|
||||
Limit: 5,
|
||||
Filters: []*repository.Filter{
|
||||
Filters: [][]*repository.Filter{
|
||||
{
|
||||
repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals),
|
||||
repository.NewFilter(repository.FieldSequence, uint64(100), repository.OperationGreater),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "filter aggregate type, limit, desc, max event sequence cols",
|
||||
args: args{
|
||||
columns: ColumnsEvent,
|
||||
aggregateTypes: []AggregateType{"user"},
|
||||
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{
|
||||
testSetLimit(5),
|
||||
testSetSortOrder(false),
|
||||
testSetSequence(100),
|
||||
testSetColumns(repository.ColumnsMaxSequence),
|
||||
testAddQuery(
|
||||
testSetSequence(100),
|
||||
testSetAggregateTypes("user"),
|
||||
),
|
||||
},
|
||||
},
|
||||
res: res{
|
||||
@ -321,20 +373,24 @@ func TestSearchQueryFactoryBuild(t *testing.T) {
|
||||
Columns: repository.ColumnsMaxSequence,
|
||||
Desc: true,
|
||||
Limit: 5,
|
||||
Filters: []*repository.Filter{
|
||||
Filters: [][]*repository.Filter{
|
||||
{
|
||||
repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals),
|
||||
repository.NewFilter(repository.FieldSequence, uint64(100), repository.OperationLess),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "filter aggregate type and aggregate id",
|
||||
args: args{
|
||||
columns: ColumnsEvent,
|
||||
aggregateTypes: []AggregateType{"user"},
|
||||
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{
|
||||
testAddQuery(
|
||||
testSetAggregateTypes("user"),
|
||||
testSetAggregateIDs("1234"),
|
||||
),
|
||||
},
|
||||
},
|
||||
res: res{
|
||||
@ -343,20 +399,58 @@ func TestSearchQueryFactoryBuild(t *testing.T) {
|
||||
Columns: repository.ColumnsEvent,
|
||||
Desc: false,
|
||||
Limit: 0,
|
||||
Filters: []*repository.Filter{
|
||||
Filters: [][]*repository.Filter{
|
||||
{
|
||||
repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals),
|
||||
repository.NewFilter(repository.FieldAggregateID, "1234", repository.OperationEquals),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "filter multiple aggregate type and aggregate id",
|
||||
args: args{
|
||||
columns: ColumnsEvent,
|
||||
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{
|
||||
testAddQuery(
|
||||
testSetAggregateTypes("user"),
|
||||
testSetAggregateIDs("1234"),
|
||||
testOr(
|
||||
testSetAggregateTypes("org"),
|
||||
testSetAggregateIDs("izu"),
|
||||
),
|
||||
),
|
||||
},
|
||||
},
|
||||
res: res{
|
||||
isErr: nil,
|
||||
query: &repository.SearchQuery{
|
||||
Columns: repository.ColumnsEvent,
|
||||
Desc: false,
|
||||
Limit: 0,
|
||||
Filters: [][]*repository.Filter{
|
||||
{
|
||||
repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals),
|
||||
repository.NewFilter(repository.FieldAggregateID, "1234", repository.OperationEquals),
|
||||
},
|
||||
{
|
||||
repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("org"), repository.OperationEquals),
|
||||
repository.NewFilter(repository.FieldAggregateID, "izu", repository.OperationEquals),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "filter aggregate type and aggregate ids",
|
||||
args: args{
|
||||
columns: ColumnsEvent,
|
||||
aggregateTypes: []AggregateType{"user"},
|
||||
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{
|
||||
testAddQuery(
|
||||
testSetAggregateTypes("user"),
|
||||
testSetAggregateIDs("1234", "0815"),
|
||||
),
|
||||
},
|
||||
},
|
||||
res: res{
|
||||
@ -365,20 +459,24 @@ func TestSearchQueryFactoryBuild(t *testing.T) {
|
||||
Columns: repository.ColumnsEvent,
|
||||
Desc: false,
|
||||
Limit: 0,
|
||||
Filters: []*repository.Filter{
|
||||
Filters: [][]*repository.Filter{
|
||||
{
|
||||
repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals),
|
||||
repository.NewFilter(repository.FieldAggregateID, []string{"1234", "0815"}, repository.OperationIn),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "filter aggregate type and sequence greater",
|
||||
args: args{
|
||||
columns: ColumnsEvent,
|
||||
aggregateTypes: []AggregateType{"user"},
|
||||
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{
|
||||
testAddQuery(
|
||||
testSetAggregateTypes("user"),
|
||||
testSetSequence(8),
|
||||
),
|
||||
},
|
||||
},
|
||||
res: res{
|
||||
@ -387,20 +485,24 @@ func TestSearchQueryFactoryBuild(t *testing.T) {
|
||||
Columns: repository.ColumnsEvent,
|
||||
Desc: false,
|
||||
Limit: 0,
|
||||
Filters: []*repository.Filter{
|
||||
Filters: [][]*repository.Filter{
|
||||
{
|
||||
repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals),
|
||||
repository.NewFilter(repository.FieldSequence, uint64(8), repository.OperationGreater),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "filter aggregate type and event type",
|
||||
args: args{
|
||||
columns: ColumnsEvent,
|
||||
aggregateTypes: []AggregateType{"user"},
|
||||
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{
|
||||
testAddQuery(
|
||||
testSetAggregateTypes("user"),
|
||||
testSetEventTypes("user.created"),
|
||||
),
|
||||
},
|
||||
},
|
||||
res: res{
|
||||
@ -409,20 +511,24 @@ func TestSearchQueryFactoryBuild(t *testing.T) {
|
||||
Columns: repository.ColumnsEvent,
|
||||
Desc: false,
|
||||
Limit: 0,
|
||||
Filters: []*repository.Filter{
|
||||
Filters: [][]*repository.Filter{
|
||||
{
|
||||
repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals),
|
||||
repository.NewFilter(repository.FieldEventType, repository.EventType("user.created"), repository.OperationEquals),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "filter aggregate type and event types",
|
||||
args: args{
|
||||
columns: ColumnsEvent,
|
||||
aggregateTypes: []AggregateType{"user"},
|
||||
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{
|
||||
testAddQuery(
|
||||
testSetAggregateTypes("user"),
|
||||
testSetEventTypes("user.created", "user.changed"),
|
||||
),
|
||||
},
|
||||
},
|
||||
res: res{
|
||||
@ -431,20 +537,24 @@ func TestSearchQueryFactoryBuild(t *testing.T) {
|
||||
Columns: repository.ColumnsEvent,
|
||||
Desc: false,
|
||||
Limit: 0,
|
||||
Filters: []*repository.Filter{
|
||||
Filters: [][]*repository.Filter{
|
||||
{
|
||||
repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals),
|
||||
repository.NewFilter(repository.FieldEventType, []repository.EventType{"user.created", "user.changed"}, repository.OperationIn),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "filter aggregate type resource owner",
|
||||
args: args{
|
||||
columns: ColumnsEvent,
|
||||
aggregateTypes: []AggregateType{"user"},
|
||||
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{
|
||||
testSetResourceOwner("hodor"),
|
||||
testAddQuery(
|
||||
testSetAggregateTypes("user"),
|
||||
),
|
||||
},
|
||||
},
|
||||
res: res{
|
||||
@ -453,18 +563,24 @@ func TestSearchQueryFactoryBuild(t *testing.T) {
|
||||
Columns: repository.ColumnsEvent,
|
||||
Desc: false,
|
||||
Limit: 0,
|
||||
Filters: []*repository.Filter{
|
||||
Filters: [][]*repository.Filter{
|
||||
{
|
||||
repository.NewFilter(repository.FieldAggregateType, repository.AggregateType("user"), repository.OperationEquals),
|
||||
repository.NewFilter(repository.FieldResourceOwner, "hodor", repository.OperationEquals),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "column invalid",
|
||||
args: args{
|
||||
columns: Columns(-1),
|
||||
aggregateTypes: []AggregateType{"user"},
|
||||
setters: []func(*SearchQueryBuilder) *SearchQueryBuilder{
|
||||
testAddQuery(
|
||||
testSetAggregateTypes("user"),
|
||||
),
|
||||
},
|
||||
},
|
||||
res: res{
|
||||
isErr: errors.IsPreconditionFailed,
|
||||
@ -473,7 +589,7 @@ func TestSearchQueryFactoryBuild(t *testing.T) {
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
factory := NewSearchQueryBuilder(tt.args.columns, tt.args.aggregateTypes...)
|
||||
factory := NewSearchQueryBuilder(tt.args.columns)
|
||||
for _, f := range tt.args.setters {
|
||||
factory = f(factory)
|
||||
}
|
||||
@ -487,9 +603,96 @@ func TestSearchQueryFactoryBuild(t *testing.T) {
|
||||
return
|
||||
}
|
||||
|
||||
if !reflect.DeepEqual(query, tt.res.query) {
|
||||
t.Errorf("NewSearchQueryFactory() = %+v, want %+v", factory, tt.res.query)
|
||||
}
|
||||
assertRepoQuery(t, tt.res.query, query)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func assertBuilder(t *testing.T, want, got *SearchQueryBuilder) {
|
||||
t.Helper()
|
||||
|
||||
if got.columns != want.columns {
|
||||
t.Errorf("wrong column: got: %v want: %v", got.columns, want.columns)
|
||||
}
|
||||
if got.desc != want.desc {
|
||||
t.Errorf("wrong desc: got: %v want: %v", got.desc, want.desc)
|
||||
}
|
||||
if got.limit != want.limit {
|
||||
t.Errorf("wrong limit: got: %v want: %v", got.limit, want.limit)
|
||||
}
|
||||
if got.resourceOwner != want.resourceOwner {
|
||||
t.Errorf("wrong : got: %v want: %v", got.resourceOwner, want.resourceOwner)
|
||||
}
|
||||
if len(got.queries) != len(want.queries) {
|
||||
t.Errorf("wrong length of queries: got: %v want: %v", len(got.queries), len(want.queries))
|
||||
}
|
||||
|
||||
for i, query := range got.queries {
|
||||
assertQuery(t, i, want.queries[i], query)
|
||||
}
|
||||
}
|
||||
|
||||
func assertQuery(t *testing.T, i int, want, got *SearchQuery) {
|
||||
t.Helper()
|
||||
|
||||
if !reflect.DeepEqual(got.aggregateIDs, want.aggregateIDs) {
|
||||
t.Errorf("wrong aggregateIDs in query %d : got: %v want: %v", i, got.aggregateIDs, want.aggregateIDs)
|
||||
}
|
||||
if !reflect.DeepEqual(got.aggregateTypes, want.aggregateTypes) {
|
||||
t.Errorf("wrong aggregateTypes in query %d : got: %v want: %v", i, got.aggregateTypes, want.aggregateTypes)
|
||||
}
|
||||
if !reflect.DeepEqual(got.eventData, want.eventData) {
|
||||
t.Errorf("wrong eventData in query %d : got: %v want: %v", i, got.eventData, want.eventData)
|
||||
}
|
||||
if got.eventSequence != want.eventSequence {
|
||||
t.Errorf("wrong eventSequence in query %d : got: %v want: %v", i, got.eventSequence, want.eventSequence)
|
||||
}
|
||||
if !reflect.DeepEqual(got.eventTypes, want.eventTypes) {
|
||||
t.Errorf("wrong eventTypes in query %d : got: %v want: %v", i, got.eventTypes, want.eventTypes)
|
||||
}
|
||||
}
|
||||
|
||||
func assertRepoQuery(t *testing.T, want, got *repository.SearchQuery) {
|
||||
t.Helper()
|
||||
|
||||
if want == nil && got == nil {
|
||||
return
|
||||
}
|
||||
|
||||
if !reflect.DeepEqual(got.Columns, want.Columns) {
|
||||
t.Errorf("wrong columns in query: got: %v want: %v", got.Columns, want.Columns)
|
||||
}
|
||||
if !reflect.DeepEqual(got.Desc, want.Desc) {
|
||||
t.Errorf("wrong desc in query: got: %v want: %v", got.Desc, want.Desc)
|
||||
}
|
||||
if !reflect.DeepEqual(got.Limit, want.Limit) {
|
||||
t.Errorf("wrong limit in query: got: %v want: %v", got.Limit, want.Limit)
|
||||
}
|
||||
|
||||
if len(got.Filters) != len(want.Filters) {
|
||||
t.Errorf("wrong length of filters: got: %v want: %v", len(got.Filters), len(want.Filters))
|
||||
}
|
||||
|
||||
for filterIdx, filter := range got.Filters {
|
||||
if len(got.Filters) != len(want.Filters) {
|
||||
t.Errorf("wrong length of subfilters: got: %v want: %v", len(filter), len(want.Filters[filterIdx]))
|
||||
}
|
||||
for subFilterIdx, f := range filter {
|
||||
assertFilters(t, subFilterIdx, want.Filters[filterIdx][subFilterIdx], f)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func assertFilters(t *testing.T, i int, want, got *repository.Filter) {
|
||||
t.Helper()
|
||||
|
||||
if want.Field != got.Field {
|
||||
t.Errorf("wrong field in filter %d : got: %v want: %v", i, got.Field, want.Field)
|
||||
}
|
||||
if want.Operation != got.Operation {
|
||||
t.Errorf("wrong operation in filter %d : got: %v want: %v", i, got.Operation, want.Operation)
|
||||
}
|
||||
if !reflect.DeepEqual(want.Value, got.Value) {
|
||||
t.Errorf("wrong value in filter %d : got: %v want: %v", i, got.Value, want.Value)
|
||||
}
|
||||
}
|
||||
|
@ -1,9 +1,10 @@
|
||||
package eventstore
|
||||
|
||||
import (
|
||||
"sync"
|
||||
|
||||
v1 "github.com/caos/zitadel/internal/eventstore/v1"
|
||||
"github.com/caos/zitadel/internal/eventstore/v1/models"
|
||||
"sync"
|
||||
)
|
||||
|
||||
var (
|
||||
|
@ -16,8 +16,6 @@ type UniqueConstraintAction int32
|
||||
const (
|
||||
UniqueConstraintAdd UniqueConstraintAction = iota
|
||||
UniqueConstraintRemove
|
||||
|
||||
uniqueConstraintActionCount
|
||||
)
|
||||
|
||||
func NewAddEventUniqueConstraint(
|
||||
|
@ -7,7 +7,10 @@ import (
|
||||
)
|
||||
|
||||
func KeyPairQuery(latestSequence uint64) *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
AddQuery().
|
||||
AggregateTypes(iam.AggregateType).
|
||||
SequenceGreater(latestSequence).
|
||||
EventTypes(keypair.AddedEventType)
|
||||
EventTypes(keypair.AddedEventType).
|
||||
Builder()
|
||||
}
|
||||
|
@ -41,9 +41,11 @@ func (rm *IAMIDPConfigReadModel) AppendEvents(events ...eventstore.EventReader)
|
||||
}
|
||||
|
||||
func (rm *IAMIDPConfigReadModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
AddQuery().
|
||||
AggregateTypes(iam.AggregateType).
|
||||
AggregateIDs(rm.iamID).
|
||||
EventData(map[string]interface{}{
|
||||
"idpConfigId": rm.configID,
|
||||
})
|
||||
}).Builder()
|
||||
}
|
||||
|
@ -35,9 +35,11 @@ func (rm *IAMMemberReadModel) AppendEvents(events ...eventstore.EventReader) {
|
||||
}
|
||||
|
||||
func (rm *IAMMemberReadModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType).
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
AddQuery().
|
||||
AggregateTypes(iam.AggregateType).
|
||||
AggregateIDs(rm.iamID).
|
||||
EventData(map[string]interface{}{
|
||||
"userId": rm.userID,
|
||||
})
|
||||
}).Builder()
|
||||
}
|
||||
|
@ -128,5 +128,9 @@ func (rm *ReadModel) AppendAndReduce(events ...eventstore.EventReader) error {
|
||||
}
|
||||
|
||||
func (rm *ReadModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, iam.AggregateType).AggregateIDs(rm.AggregateID)
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
AddQuery().
|
||||
AggregateTypes(iam.AggregateType).
|
||||
AggregateIDs(rm.AggregateID).
|
||||
Builder()
|
||||
}
|
||||
|
@ -49,10 +49,19 @@ func (rm *UserReadModel) AppendAndReduce(events ...eventstore.EventReader) error
|
||||
}
|
||||
|
||||
func (rm *UserReadModel) Query() *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType).AggregateIDs(rm.AggregateID)
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
AddQuery().
|
||||
AggregateTypes(user.AggregateType).
|
||||
AggregateIDs(rm.AggregateID).
|
||||
Builder()
|
||||
}
|
||||
|
||||
func NewUserEventSearchQuery(userID, orgID string, sequence uint64) *eventstore.SearchQueryBuilder {
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent, user.AggregateType).
|
||||
AggregateIDs(userID).ResourceOwner(orgID).SequenceGreater(sequence)
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
ResourceOwner(orgID).
|
||||
AddQuery().
|
||||
AggregateTypes(user.AggregateType).
|
||||
AggregateIDs(userID).
|
||||
SequenceGreater(sequence).
|
||||
Builder()
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user