diff --git a/internal/eventstore/handler/v2/statement.go b/internal/eventstore/handler/v2/statement.go index bad8a97b3..3aeb043c6 100644 --- a/internal/eventstore/handler/v2/statement.go +++ b/internal/eventstore/handler/v2/statement.go @@ -367,6 +367,12 @@ func AddNoOpStatement() func(eventstore.Event) Exec { } } +func AddStatement(e Exec) func(eventstore.Event) Exec { + return func(event eventstore.Event) Exec { + return NewStatement(event, e).Execute + } +} + func AddCreateStatement(columns []Column, opts ...execOption) func(eventstore.Event) Exec { return func(event eventstore.Event) Exec { return NewCreateStatement(event, columns, opts...).Execute diff --git a/internal/query/projection/authorization_relational.go b/internal/query/projection/authorization_relational.go index b537e53e1..fd8c0ed76 100644 --- a/internal/query/projection/authorization_relational.go +++ b/internal/query/projection/authorization_relational.go @@ -15,59 +15,7 @@ import ( "github.com/zitadel/zitadel/internal/zerrors" ) -const ( - AuthorizationRelationalProjectionTable = "zitadel.authorizations" -) - -type authorizationRelationalProjection struct{} - -func (*authorizationRelationalProjection) Name() string { - return AuthorizationRelationalProjectionTable -} - -func newAuthorizationRelationalProjection(ctx context.Context, config handler.Config) *handler.Handler { - return handler.NewHandler(ctx, &config, new(authorizationRelationalProjection)) -} - -func (a *authorizationRelationalProjection) Reducers() []handler.AggregateReducer { - return []handler.AggregateReducer{ - { - Aggregate: usergrant.AggregateType, - EventReducers: []handler.EventReducer{ - { - Event: usergrant.UserGrantAddedType, - Reduce: a.reduceUserGrantAdded, - }, - { - Event: usergrant.UserGrantChangedType, - Reduce: a.reduceUserGrantChanged, - }, - { - Event: usergrant.UserGrantCascadeChangedType, - Reduce: a.reduceUserGrantChanged, - }, - { - Event: usergrant.UserGrantCascadeRemovedType, - Reduce: a.reduceUserGrantRemoved, - }, - { - Event: usergrant.UserGrantRemovedType, - Reduce: a.reduceUserGrantRemoved, - }, - { - Event: usergrant.UserGrantDeactivatedType, - Reduce: a.reduceUserGrantDeactivated, - }, - { - Event: usergrant.UserGrantReactivatedType, - Reduce: a.reduceUserGrantReactivated, - }, - }, - }, - } -} - -func (a *authorizationRelationalProjection) reduceUserGrantAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceAuthorizationAdded(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*usergrant.UserGrantAddedEvent) if !ok { return nil, zerrors.ThrowInternalf(nil, "HANDL-an0k9a", "reduce.wrong.event.type %s", usergrant.UserGrantAddedType) @@ -97,7 +45,7 @@ func (a *authorizationRelationalProjection) reduceUserGrantAdded(event eventstor }), nil } -func (a *authorizationRelationalProjection) reduceUserGrantChanged(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceAuthorizationChanged(event eventstore.Event) (*handler.Statement, error) { var roles []string switch e := event.(type) { case *usergrant.UserGrantChangedEvent: @@ -124,7 +72,7 @@ func (a *authorizationRelationalProjection) reduceUserGrantChanged(event eventst }), nil } -func (a *authorizationRelationalProjection) reduceUserGrantRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceAuthorizationRemoved(event eventstore.Event) (*handler.Statement, error) { switch event.(type) { case *usergrant.UserGrantRemovedEvent, *usergrant.UserGrantCascadeRemovedEvent: // ok @@ -145,7 +93,7 @@ func (a *authorizationRelationalProjection) reduceUserGrantRemoved(event eventst }), nil } -func (a *authorizationRelationalProjection) reduceUserGrantDeactivated(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceAuthorizationDeactivated(event eventstore.Event) (*handler.Statement, error) { _, ok := event.(*usergrant.UserGrantDeactivatedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-dFtRl0", "reduce.wrong.event.type %s", usergrant.UserGrantDeactivatedType) @@ -166,7 +114,7 @@ func (a *authorizationRelationalProjection) reduceUserGrantDeactivated(event eve }), nil } -func (a *authorizationRelationalProjection) reduceUserGrantReactivated(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceAuthorizationReactivated(event eventstore.Event) (*handler.Statement, error) { _, ok := event.(*usergrant.UserGrantReactivatedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-dFtRl1", "reduce.wrong.event.type %s", usergrant.UserGrantReactivatedType) diff --git a/internal/query/projection/idp_apple_relational.go b/internal/query/projection/idp_apple_relational.go new file mode 100644 index 000000000..a8dc98a2c --- /dev/null +++ b/internal/query/projection/idp_apple_relational.go @@ -0,0 +1,145 @@ +package projection + +import ( + "context" + "database/sql" + "encoding/json" + "slices" + + "github.com/muhlemmer/gu" + + "github.com/zitadel/zitadel/backend/v3/domain" + "github.com/zitadel/zitadel/backend/v3/storage/database" + v3_sql "github.com/zitadel/zitadel/backend/v3/storage/database/dialect/sql" + "github.com/zitadel/zitadel/backend/v3/storage/database/repository" + "github.com/zitadel/zitadel/internal/eventstore" + "github.com/zitadel/zitadel/internal/eventstore/handler/v2" + "github.com/zitadel/zitadel/internal/repository/idp" + "github.com/zitadel/zitadel/internal/repository/instance" + "github.com/zitadel/zitadel/internal/repository/org" + "github.com/zitadel/zitadel/internal/zerrors" +) + +func (p *relationalTablesProjection) reduceAppleIDPAdded(event eventstore.Event) (*handler.Statement, error) { + var orgId *string + var idpEvent idp.AppleIDPAddedEvent + switch e := event.(type) { + case *org.AppleIDPAddedEvent: + idpEvent = e.AppleIDPAddedEvent + orgId = &idpEvent.Aggregate().ResourceOwner + case *instance.AppleIDPAddedEvent: + idpEvent = e.AppleIDPAddedEvent + default: + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-YFvg3", "reduce.wrong.event.type %v", []eventstore.EventType{org.AppleIDPAddedEventType /*, instance.AppleIDPAddedEventType*/}) + } + + apple := domain.Apple{ + ClientID: idpEvent.ClientID, + TeamID: idpEvent.TeamID, + KeyID: idpEvent.KeyID, + PrivateKey: idpEvent.PrivateKey, + Scopes: idpEvent.Scopes, + } + + payloadJSON, err := json.Marshal(apple) + if err != nil { + return nil, err + } + + return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInvalidArgumentf(nil, "HANDL-Ku2YB", "reduce.wrong.db.pool %T", ex) + } + + repo := repository.IDProviderRepository() + return repo.Create(ctx, v3_sql.SQLTx(tx), &domain.IdentityProvider{ + InstanceID: idpEvent.Aggregate().InstanceID, + OrgID: orgId, + ID: idpEvent.ID, + State: domain.IDPStateActive, + Name: idpEvent.Name, + Type: gu.Ptr(domain.IDPTypeApple), + AllowCreation: idpEvent.IsCreationAllowed, + AllowAutoCreation: idpEvent.IsAutoCreation, + AllowAutoUpdate: idpEvent.IsAutoUpdate, + AllowLinking: idpEvent.IsLinkingAllowed, + AutoLinkingField: mapAutoLinkingField(idpEvent.AutoLinkingOption), + Payload: payloadJSON, + CreatedAt: event.CreatedAt(), + UpdatedAt: event.CreatedAt(), + }) + }), nil +} + +func (p *relationalTablesProjection) reduceAppleIDPChanged(event eventstore.Event) (*handler.Statement, error) { + var orgId *string + var idpEvent idp.AppleIDPChangedEvent + switch e := event.(type) { + case *org.AppleIDPChangedEvent: + idpEvent = e.AppleIDPChangedEvent + orgId = &idpEvent.Aggregate().ResourceOwner + case *instance.AppleIDPChangedEvent: + idpEvent = e.AppleIDPChangedEvent + default: + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-YBez3", "reduce.wrong.event.type %v", []eventstore.EventType{org.AppleIDPChangedEventType /*, instance.AppleIDPChangedEventType*/}) + } + + return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInternal(nil, "HANDL-HX6ed", "unable to cast to tx executer") + } + idpRepo := repository.IDProviderRepository() + apple, err := idpRepo.GetApple(ctx, v3_sql.SQLTx(tx), database.WithCondition(idpScopedCondition(idpRepo, idpEvent.Agg.InstanceID, idpEvent.ID, orgId))) + if err != nil { + return err + } + + changes := p.reduceIDPChangedTemplateColumns(idpRepo, idpEvent.Name, idpEvent.OptionChanges) + + payload := &apple.Apple + payloadChanged := p.reduceAppleIDPChangedColumns(payload, &idpEvent) + if payloadChanged { + payloadJSON, err := json.Marshal(payload) + if err != nil { + return err + } + changes = append(changes, idpRepo.SetPayload(string(payloadJSON))) + } + + changes = append(changes, idpRepo.SetUpdatedAt(gu.Ptr(event.CreatedAt()))) + _, err = idpRepo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(idpRepo, idpEvent.Aggregate().InstanceID, idpEvent.ID, orgId), changes...) + return err + + }), nil +} + +func (p *relationalTablesProjection) reduceAppleIDPChangedColumns(payload *domain.Apple, idpEvent *idp.AppleIDPChangedEvent) bool { + payloadChanged := false + if payload == nil || idpEvent == nil { + return payloadChanged + } + + if idpEvent.ClientID != nil && *idpEvent.ClientID != payload.ClientID { + payloadChanged = true + payload.ClientID = *idpEvent.ClientID + } + if idpEvent.TeamID != nil && *idpEvent.TeamID != payload.TeamID { + payloadChanged = true + payload.TeamID = *idpEvent.TeamID + } + if idpEvent.KeyID != nil && *idpEvent.KeyID != payload.KeyID { + payloadChanged = true + payload.KeyID = *idpEvent.KeyID + } + if idpEvent.PrivateKey != nil { + payloadChanged = true + payload.PrivateKey = idpEvent.PrivateKey + } + if idpEvent.Scopes != nil && !slices.Equal(idpEvent.Scopes, payload.Scopes) { + payloadChanged = true + payload.Scopes = idpEvent.Scopes + } + return payloadChanged +} diff --git a/internal/query/projection/idp_azure_relational.go b/internal/query/projection/idp_azure_relational.go new file mode 100644 index 000000000..49f672cc4 --- /dev/null +++ b/internal/query/projection/idp_azure_relational.go @@ -0,0 +1,215 @@ +package projection + +import ( + "context" + "database/sql" + "encoding/json" + "slices" + + "github.com/muhlemmer/gu" + + "github.com/zitadel/zitadel/backend/v3/domain" + "github.com/zitadel/zitadel/backend/v3/storage/database" + v3_sql "github.com/zitadel/zitadel/backend/v3/storage/database/dialect/sql" + "github.com/zitadel/zitadel/backend/v3/storage/database/repository" + "github.com/zitadel/zitadel/internal/eventstore" + "github.com/zitadel/zitadel/internal/eventstore/handler/v2" + "github.com/zitadel/zitadel/internal/repository/idp" + "github.com/zitadel/zitadel/internal/repository/instance" + "github.com/zitadel/zitadel/internal/repository/org" + "github.com/zitadel/zitadel/internal/zerrors" +) + +func (p *relationalTablesProjection) reduceOIDCIDPMigratedAzureAD(event eventstore.Event) (*handler.Statement, error) { + var orgID *string + var idpEvent idp.OIDCIDPMigratedAzureADEvent + switch e := event.(type) { + case *org.OIDCIDPMigratedAzureADEvent: + idpEvent = e.OIDCIDPMigratedAzureADEvent + orgID = gu.Ptr(idpEvent.Aggregate().ResourceOwner) + case *instance.OIDCIDPMigratedAzureADEvent: + idpEvent = e.OIDCIDPMigratedAzureADEvent + default: + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Yb582ks", "reduce.wrong.event.type %v", []eventstore.EventType{org.OIDCIDPMigratedAzureADEventType, instance.OIDCIDPMigratedAzureADEventType}) + } + + azureTenant, err := domain.AzureTenantTypeString(idpEvent.Tenant) + if err != nil { + return nil, err + } + + azure := domain.Azure{ + ClientID: idpEvent.ClientID, + ClientSecret: idpEvent.ClientSecret, + Scopes: idpEvent.Scopes, + Tenant: azureTenant, + IsEmailVerified: idpEvent.IsEmailVerified, + } + + payloadJSON, err := json.Marshal(azure) + if err != nil { + return nil, err + } + + return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInvalidArgumentf(nil, "HANDL-mj7LQ", "reduce.wrong.db.pool %T", ex) + } + + repo := repository.IDProviderRepository() + changes := database.Changes{ + repo.SetName(idpEvent.Name), + repo.SetType(domain.IDPTypeAzure), + repo.SetAllowCreation(idpEvent.IsCreationAllowed), + repo.SetAllowLinking(idpEvent.IsLinkingAllowed), + repo.SetAllowAutoCreation(idpEvent.IsAutoCreation), + repo.SetAllowAutoUpdate(idpEvent.IsAutoUpdate), + repo.SetAutoLinkingField(mapAutoLinkingField(idpEvent.AutoLinkingOption)), + repo.SetPayload(string(payloadJSON)), + repo.SetUpdatedAt(gu.Ptr(event.CreatedAt())), + } + + _, err = repo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(repo, idpEvent.Aggregate().InstanceID, idpEvent.ID, orgID), changes...) + return err + }), nil +} + +func (p *relationalTablesProjection) reduceAzureADIDPAdded(event eventstore.Event) (*handler.Statement, error) { + var orgId *string + var idpEvent idp.AzureADIDPAddedEvent + switch e := event.(type) { + case *org.AzureADIDPAddedEvent: + idpEvent = e.AzureADIDPAddedEvent + orgId = &idpEvent.Aggregate().ResourceOwner + case *instance.AzureADIDPAddedEvent: + idpEvent = e.AzureADIDPAddedEvent + default: + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Y9a022b", "reduce.wrong.event.type %v", []eventstore.EventType{org.AzureADIDPAddedEventType, instance.AzureADIDPAddedEventType}) + } + + azureTenant, err := domain.AzureTenantTypeString(idpEvent.Tenant) + if err != nil { + return nil, err + } + + azure := domain.Azure{ + ClientID: idpEvent.ClientID, + ClientSecret: idpEvent.ClientSecret, + Scopes: idpEvent.Scopes, + Tenant: azureTenant, + IsEmailVerified: idpEvent.IsEmailVerified, + } + + payloadJSON, err := json.Marshal(azure) + if err != nil { + return nil, err + } + + return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInvalidArgumentf(nil, "HANDL-GJ4Kb", "reduce.wrong.db.pool %T", ex) + } + + repo := repository.IDProviderRepository() + return repo.Create(ctx, v3_sql.SQLTx(tx), &domain.IdentityProvider{ + InstanceID: idpEvent.Aggregate().InstanceID, + OrgID: orgId, + ID: idpEvent.ID, + State: domain.IDPStateActive, + Name: idpEvent.Name, + Type: gu.Ptr(domain.IDPTypeAzure), + AllowCreation: idpEvent.IsCreationAllowed, + AllowAutoCreation: idpEvent.IsAutoCreation, + AllowAutoUpdate: idpEvent.IsAutoUpdate, + AllowLinking: idpEvent.IsLinkingAllowed, + AutoLinkingField: mapAutoLinkingField(idpEvent.AutoLinkingOption), + Payload: payloadJSON, + CreatedAt: event.CreatedAt(), + UpdatedAt: event.CreatedAt(), + }) + }), nil +} + +func (p *relationalTablesProjection) reduceAzureADIDPChanged(event eventstore.Event) (*handler.Statement, error) { + var orgId *string + var idpEvent idp.AzureADIDPChangedEvent + switch e := event.(type) { + case *org.AzureADIDPChangedEvent: + idpEvent = e.AzureADIDPChangedEvent + orgId = &idpEvent.Aggregate().ResourceOwner + case *instance.AzureADIDPChangedEvent: + idpEvent = e.AzureADIDPChangedEvent + default: + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-YZ5x25s", "reduce.wrong.event.type %v", []eventstore.EventType{org.AzureADIDPChangedEventType, instance.AzureADIDPChangedEventType}) + } + + return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInternal(nil, "HANDL-HX6ed", "unable to cast to tx executer") + } + idpRepo := repository.IDProviderRepository() + azure, err := idpRepo.GetAzureAD(ctx, v3_sql.SQLTx(tx), database.WithCondition(idpScopedCondition(idpRepo, idpEvent.Agg.InstanceID, idpEvent.ID, orgId))) + if err != nil { + return err + } + + changes := p.reduceIDPChangedTemplateColumns(idpRepo, idpEvent.Name, idpEvent.OptionChanges) + + payload := &azure.Azure + payloadChanged, err := p.reduceAzureADIDPChangedColumns(payload, &idpEvent) + if err != nil { + return err + } + + if payloadChanged { + payloadJSON, err := json.Marshal(payload) + if err != nil { + return err + } + changes = append(changes, idpRepo.SetPayload(string(payloadJSON))) + } + + changes = append(changes, idpRepo.SetUpdatedAt(gu.Ptr(event.CreatedAt()))) + _, err = idpRepo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(idpRepo, idpEvent.Aggregate().InstanceID, idpEvent.ID, orgId), changes...) + return err + + }), nil +} + +func (p *relationalTablesProjection) reduceAzureADIDPChangedColumns(payload *domain.Azure, idpEvent *idp.AzureADIDPChangedEvent) (bool, error) { + payloadChanged := false + if payload == nil || idpEvent == nil { + return payloadChanged, nil + } + + if idpEvent.ClientID != nil && *idpEvent.ClientID != payload.ClientID { + payloadChanged = true + payload.ClientID = *idpEvent.ClientID + } + if idpEvent.ClientSecret != nil { + payloadChanged = true + payload.ClientSecret = idpEvent.ClientSecret + } + if idpEvent.Scopes != nil && !slices.Equal(idpEvent.Scopes, payload.Scopes) { + payloadChanged = true + payload.Scopes = idpEvent.Scopes + } + if idpEvent.Tenant != nil && *idpEvent.Tenant != payload.Tenant.String() { + payloadChanged = true + + azureTenant, err := domain.AzureTenantTypeString(*idpEvent.Tenant) + if err != nil { + return false, err + } + + payload.Tenant = azureTenant + } + if idpEvent.IsEmailVerified != nil && *idpEvent.IsEmailVerified != payload.IsEmailVerified { + payloadChanged = true + payload.IsEmailVerified = *idpEvent.IsEmailVerified + } + return payloadChanged, nil +} diff --git a/internal/query/projection/idp_github_relational.go b/internal/query/projection/idp_github_relational.go new file mode 100644 index 000000000..0f755323d --- /dev/null +++ b/internal/query/projection/idp_github_relational.go @@ -0,0 +1,264 @@ +package projection + +import ( + "context" + "database/sql" + "encoding/json" + "slices" + + "github.com/muhlemmer/gu" + + "github.com/zitadel/zitadel/backend/v3/domain" + "github.com/zitadel/zitadel/backend/v3/storage/database" + v3_sql "github.com/zitadel/zitadel/backend/v3/storage/database/dialect/sql" + "github.com/zitadel/zitadel/backend/v3/storage/database/repository" + "github.com/zitadel/zitadel/internal/eventstore" + "github.com/zitadel/zitadel/internal/eventstore/handler/v2" + "github.com/zitadel/zitadel/internal/repository/idp" + "github.com/zitadel/zitadel/internal/repository/instance" + "github.com/zitadel/zitadel/internal/repository/org" + "github.com/zitadel/zitadel/internal/zerrors" +) + +func (p *relationalTablesProjection) reduceGitHubIDPAdded(event eventstore.Event) (*handler.Statement, error) { + var orgId *string + var idpEvent idp.GitHubIDPAddedEvent + switch e := event.(type) { + case *org.GitHubIDPAddedEvent: + idpEvent = e.GitHubIDPAddedEvent + orgId = &idpEvent.Aggregate().ResourceOwner + case *instance.GitHubIDPAddedEvent: + idpEvent = e.GitHubIDPAddedEvent + default: + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-x9a022b", "reduce.wrong.event.type %v", []eventstore.EventType{org.GitHubIDPAddedEventType, instance.GitHubIDPAddedEventType}) + } + + github := domain.Github{ + ClientID: idpEvent.ClientID, + ClientSecret: idpEvent.ClientSecret, + Scopes: idpEvent.Scopes, + } + + payloadJSON, err := json.Marshal(github) + if err != nil { + return nil, err + } + + return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInvalidArgumentf(nil, "HANDL-HNpgd", "reduce.wrong.db.pool %T", ex) + } + + repo := repository.IDProviderRepository() + return repo.Create(ctx, v3_sql.SQLTx(tx), &domain.IdentityProvider{ + InstanceID: idpEvent.Aggregate().InstanceID, + OrgID: orgId, + ID: idpEvent.ID, + State: domain.IDPStateActive, + Name: idpEvent.Name, + Type: gu.Ptr(domain.IDPTypeGitHub), + AllowCreation: idpEvent.IsCreationAllowed, + AllowAutoCreation: idpEvent.IsAutoCreation, + AllowAutoUpdate: idpEvent.IsAutoUpdate, + AllowLinking: idpEvent.IsLinkingAllowed, + AutoLinkingField: mapAutoLinkingField(idpEvent.AutoLinkingOption), + Payload: payloadJSON, + CreatedAt: event.CreatedAt(), + UpdatedAt: event.CreatedAt(), + }) + }), nil +} + +func (p *relationalTablesProjection) reduceGitHubIDPChanged(event eventstore.Event) (*handler.Statement, error) { + var orgId *string + var idpEvent idp.GitHubIDPChangedEvent + switch e := event.(type) { + case *org.GitHubIDPChangedEvent: + idpEvent = e.GitHubIDPChangedEvent + orgId = &idpEvent.Aggregate().ResourceOwner + case *instance.GitHubIDPChangedEvent: + idpEvent = e.GitHubIDPChangedEvent + default: + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-L1U89ks", "reduce.wrong.event.type %v", []eventstore.EventType{org.GitHubIDPChangedEventType, instance.GitHubIDPChangedEventType}) + } + + return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInternal(nil, "HANDL-HX6ed", "unable to cast to tx executer") + } + idpRepo := repository.IDProviderRepository() + github, err := idpRepo.GetGithub(ctx, v3_sql.SQLTx(tx), database.WithCondition(idpScopedCondition(idpRepo, idpEvent.Agg.InstanceID, idpEvent.ID, orgId))) + if err != nil { + return err + } + + changes := p.reduceIDPChangedTemplateColumns(idpRepo, idpEvent.Name, idpEvent.OptionChanges) + + payload := &github.Github + payloadChanged := p.reduceGitHubIDPChangedColumns(payload, &idpEvent) + if payloadChanged { + payloadJSON, err := json.Marshal(payload) + if err != nil { + return err + } + changes = append(changes, idpRepo.SetPayload(string(payloadJSON))) + } + + changes = append(changes, idpRepo.SetUpdatedAt(gu.Ptr(event.CreatedAt()))) + _, err = idpRepo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(idpRepo, idpEvent.Aggregate().InstanceID, idpEvent.ID, orgId), changes...) + return err + + }), nil +} + +func (p *relationalTablesProjection) reduceGitHubEnterpriseIDPAdded(event eventstore.Event) (*handler.Statement, error) { + var orgId *string + var idpEvent idp.GitHubEnterpriseIDPAddedEvent + switch e := event.(type) { + case *org.GitHubEnterpriseIDPAddedEvent: + idpEvent = e.GitHubEnterpriseIDPAddedEvent + orgId = &idpEvent.Aggregate().ResourceOwner + case *instance.GitHubEnterpriseIDPAddedEvent: + idpEvent = e.GitHubEnterpriseIDPAddedEvent + default: + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Yf3g2a", "reduce.wrong.event.type %v", []eventstore.EventType{org.GitHubEnterpriseIDPAddedEventType, instance.GitHubEnterpriseIDPAddedEventType}) + } + + githubEnterprise := domain.GithubEnterprise{ + ClientID: idpEvent.ClientID, + ClientSecret: idpEvent.ClientSecret, + AuthorizationEndpoint: idpEvent.AuthorizationEndpoint, + TokenEndpoint: idpEvent.TokenEndpoint, + UserEndpoint: idpEvent.UserEndpoint, + Scopes: idpEvent.Scopes, + } + + payloadJSON, err := json.Marshal(githubEnterprise) + if err != nil { + return nil, err + } + + return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInvalidArgumentf(nil, "HANDL-Kv4Fu", "reduce.wrong.db.pool %T", ex) + } + + repo := repository.IDProviderRepository() + return repo.Create(ctx, v3_sql.SQLTx(tx), &domain.IdentityProvider{ + InstanceID: idpEvent.Aggregate().InstanceID, + OrgID: orgId, + ID: idpEvent.ID, + State: domain.IDPStateActive, + Name: idpEvent.Name, + Type: gu.Ptr(domain.IDPTypeGitHubEnterprise), + AllowCreation: idpEvent.IsCreationAllowed, + AllowAutoCreation: idpEvent.IsAutoCreation, + AllowAutoUpdate: idpEvent.IsAutoUpdate, + AllowLinking: idpEvent.IsLinkingAllowed, + AutoLinkingField: mapAutoLinkingField(idpEvent.AutoLinkingOption), + Payload: payloadJSON, + CreatedAt: event.CreatedAt(), + UpdatedAt: event.CreatedAt(), + }) + }), nil +} + +func (p *relationalTablesProjection) reduceGitHubEnterpriseIDPChanged(event eventstore.Event) (*handler.Statement, error) { + var orgId *string + var idpEvent idp.GitHubEnterpriseIDPChangedEvent + switch e := event.(type) { + case *org.GitHubEnterpriseIDPChangedEvent: + idpEvent = e.GitHubEnterpriseIDPChangedEvent + orgId = &idpEvent.Aggregate().ResourceOwner + case *instance.GitHubEnterpriseIDPChangedEvent: + idpEvent = e.GitHubEnterpriseIDPChangedEvent + default: + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-YDg3g", "reduce.wrong.event.type %v", []eventstore.EventType{org.GitHubEnterpriseIDPChangedEventType, instance.GitHubEnterpriseIDPChangedEventType}) + } + + return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInternal(nil, "HANDL-HX6ed", "unable to cast to tx executer") + } + idpRepo := repository.IDProviderRepository() + githubEnterprise, err := idpRepo.GetGithubEnterprise(ctx, v3_sql.SQLTx(tx), database.WithCondition(idpScopedCondition(idpRepo, idpEvent.Agg.InstanceID, idpEvent.ID, orgId))) + if err != nil { + return err + } + + changes := p.reduceIDPChangedTemplateColumns(idpRepo, idpEvent.Name, idpEvent.OptionChanges) + + payload := &githubEnterprise.GithubEnterprise + payloadChanged := p.reduceGitHubEnterpriseIDPChangedColumns(payload, &idpEvent) + if payloadChanged { + payloadJSON, err := json.Marshal(payload) + if err != nil { + return err + } + changes = append(changes, idpRepo.SetPayload(string(payloadJSON))) + } + + changes = append(changes, idpRepo.SetUpdatedAt(gu.Ptr(event.CreatedAt()))) + _, err = idpRepo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(idpRepo, idpEvent.Aggregate().InstanceID, idpEvent.ID, orgId), changes...) + return err + + }), nil +} + +func (p *relationalTablesProjection) reduceGitHubIDPChangedColumns(payload *domain.Github, idpEvent *idp.GitHubIDPChangedEvent) bool { + payloadChanged := false + if payload == nil || idpEvent == nil { + return payloadChanged + } + + if idpEvent.ClientID != nil && *idpEvent.ClientID != payload.ClientID { + payloadChanged = true + payload.ClientID = *idpEvent.ClientID + } + if idpEvent.ClientSecret != nil { + payloadChanged = true + payload.ClientSecret = idpEvent.ClientSecret + } + if idpEvent.Scopes != nil && !slices.Equal(idpEvent.Scopes, payload.Scopes) { + payloadChanged = true + payload.Scopes = idpEvent.Scopes + } + return payloadChanged +} + +func (p *relationalTablesProjection) reduceGitHubEnterpriseIDPChangedColumns(payload *domain.GithubEnterprise, idpEvent *idp.GitHubEnterpriseIDPChangedEvent) bool { + payloadChanged := false + if payload == nil || idpEvent == nil { + return payloadChanged + } + + if idpEvent.ClientID != nil && *idpEvent.ClientID != payload.ClientID { + payloadChanged = true + payload.ClientID = *idpEvent.ClientID + } + if idpEvent.ClientSecret != nil { + payloadChanged = true + payload.ClientSecret = idpEvent.ClientSecret + } + if idpEvent.AuthorizationEndpoint != nil && *idpEvent.AuthorizationEndpoint != payload.AuthorizationEndpoint { + payloadChanged = true + payload.AuthorizationEndpoint = *idpEvent.AuthorizationEndpoint + } + if idpEvent.TokenEndpoint != nil && *idpEvent.TokenEndpoint != payload.TokenEndpoint { + payloadChanged = true + payload.TokenEndpoint = *idpEvent.TokenEndpoint + } + if idpEvent.UserEndpoint != nil && *idpEvent.UserEndpoint != payload.UserEndpoint { + payloadChanged = true + payload.UserEndpoint = *idpEvent.UserEndpoint + } + if idpEvent.Scopes != nil && !slices.Equal(idpEvent.Scopes, payload.Scopes) { + payloadChanged = true + payload.Scopes = idpEvent.Scopes + } + return payloadChanged +} diff --git a/internal/query/projection/idp_gitlab_relational.go b/internal/query/projection/idp_gitlab_relational.go new file mode 100644 index 000000000..6b2653f76 --- /dev/null +++ b/internal/query/projection/idp_gitlab_relational.go @@ -0,0 +1,254 @@ +package projection + +import ( + "context" + "database/sql" + "encoding/json" + "slices" + + "github.com/muhlemmer/gu" + + "github.com/zitadel/zitadel/backend/v3/domain" + "github.com/zitadel/zitadel/backend/v3/storage/database" + v3_sql "github.com/zitadel/zitadel/backend/v3/storage/database/dialect/sql" + "github.com/zitadel/zitadel/backend/v3/storage/database/repository" + "github.com/zitadel/zitadel/internal/eventstore" + "github.com/zitadel/zitadel/internal/eventstore/handler/v2" + "github.com/zitadel/zitadel/internal/repository/idp" + "github.com/zitadel/zitadel/internal/repository/instance" + "github.com/zitadel/zitadel/internal/repository/org" + "github.com/zitadel/zitadel/internal/zerrors" +) + +func (p *relationalTablesProjection) reduceGitLabIDPAdded(event eventstore.Event) (*handler.Statement, error) { + var orgId *string + var idpEvent idp.GitLabIDPAddedEvent + switch e := event.(type) { + case *org.GitLabIDPAddedEvent: + idpEvent = e.GitLabIDPAddedEvent + orgId = &idpEvent.Aggregate().ResourceOwner + case *instance.GitLabIDPAddedEvent: + idpEvent = e.GitLabIDPAddedEvent + default: + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Y9a022b", "reduce.wrong.event.type %v", []eventstore.EventType{org.GitLabIDPAddedEventType, instance.GitLabIDPAddedEventType}) + } + + gitlab := domain.Gitlab{ + ClientID: idpEvent.ClientID, + ClientSecret: idpEvent.ClientSecret, + Scopes: idpEvent.Scopes, + } + + payloadJSON, err := json.Marshal(gitlab) + if err != nil { + return nil, err + } + + return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInvalidArgumentf(nil, "HANDL-kN8Qx", "reduce.wrong.db.pool %T", ex) + } + + repo := repository.IDProviderRepository() + return repo.Create(ctx, v3_sql.SQLTx(tx), &domain.IdentityProvider{ + InstanceID: idpEvent.Aggregate().InstanceID, + OrgID: orgId, + ID: idpEvent.ID, + State: domain.IDPStateActive, + Name: idpEvent.Name, + Type: gu.Ptr(domain.IDPTypeGitLab), + AllowCreation: idpEvent.IsCreationAllowed, + AllowAutoCreation: idpEvent.IsAutoCreation, + AllowAutoUpdate: idpEvent.IsAutoUpdate, + AllowLinking: idpEvent.IsLinkingAllowed, + AutoLinkingField: mapAutoLinkingField(idpEvent.AutoLinkingOption), + Payload: payloadJSON, + CreatedAt: event.CreatedAt(), + UpdatedAt: event.CreatedAt(), + }) + }), nil +} + +func (p *relationalTablesProjection) reduceGitLabIDPChanged(event eventstore.Event) (*handler.Statement, error) { + var orgId *string + var idpEvent idp.GitLabIDPChangedEvent + switch e := event.(type) { + case *org.GitLabIDPChangedEvent: + idpEvent = e.GitLabIDPChangedEvent + orgId = &idpEvent.Aggregate().ResourceOwner + case *instance.GitLabIDPChangedEvent: + idpEvent = e.GitLabIDPChangedEvent + default: + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-mT5827b", "reduce.wrong.event.type %v", []eventstore.EventType{org.GitLabIDPChangedEventType, instance.GitLabIDPChangedEventType}) + } + + return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInternal(nil, "HANDL-HX6ed", "unable to cast to tx executer") + } + idpRepo := repository.IDProviderRepository() + gitlab, err := idpRepo.GetGitlab(ctx, v3_sql.SQLTx(tx), database.WithCondition(idpScopedCondition(idpRepo, idpEvent.Agg.InstanceID, idpEvent.ID, orgId))) + if err != nil { + return err + } + + changes := p.reduceIDPChangedTemplateColumns(idpRepo, idpEvent.Name, idpEvent.OptionChanges) + + payload := &gitlab.Gitlab + payloadChanged := p.reduceGitLabIDPChangedColumns(payload, &idpEvent) + if payloadChanged { + payloadJSON, err := json.Marshal(payload) + if err != nil { + return err + } + changes = append(changes, idpRepo.SetPayload(string(payloadJSON))) + } + + changes = append(changes, idpRepo.SetUpdatedAt(gu.Ptr(event.CreatedAt()))) + _, err = idpRepo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(idpRepo, idpEvent.Aggregate().InstanceID, idpEvent.ID, orgId), changes...) + return err + + }), nil +} + +func (p *relationalTablesProjection) reduceGitLabSelfHostedIDPAdded(event eventstore.Event) (*handler.Statement, error) { + var orgId *string + var idpEvent idp.GitLabSelfHostedIDPAddedEvent + switch e := event.(type) { + case *org.GitLabSelfHostedIDPAddedEvent: + idpEvent = e.GitLabSelfHostedIDPAddedEvent + orgId = &idpEvent.Aggregate().ResourceOwner + case *instance.GitLabSelfHostedIDPAddedEvent: + idpEvent = e.GitLabSelfHostedIDPAddedEvent + default: + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-YAF3gw", "reduce.wrong.event.type %v", []eventstore.EventType{org.GitLabSelfHostedIDPAddedEventType, instance.GitLabSelfHostedIDPAddedEventType}) + } + + gitlabSelfHosted := domain.GitlabSelfHosted{ + Issuer: idpEvent.Issuer, + ClientID: idpEvent.ClientID, + ClientSecret: idpEvent.ClientSecret, + Scopes: idpEvent.Scopes, + } + + payloadJSON, err := json.Marshal(gitlabSelfHosted) + if err != nil { + return nil, err + } + + return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInvalidArgumentf(nil, "HANDL-FQrtw", "reduce.wrong.db.pool %T", ex) + } + + repo := repository.IDProviderRepository() + return repo.Create(ctx, v3_sql.SQLTx(tx), &domain.IdentityProvider{ + InstanceID: idpEvent.Aggregate().InstanceID, + OrgID: orgId, + ID: idpEvent.ID, + State: domain.IDPStateActive, + Name: idpEvent.Name, + Type: gu.Ptr(domain.IDPTypeGitLabSelfHosted), + AllowCreation: idpEvent.IsCreationAllowed, + AllowAutoCreation: idpEvent.IsAutoCreation, + AllowAutoUpdate: idpEvent.IsAutoUpdate, + AllowLinking: idpEvent.IsLinkingAllowed, + AutoLinkingField: mapAutoLinkingField(idpEvent.AutoLinkingOption), + Payload: payloadJSON, + CreatedAt: event.CreatedAt(), + UpdatedAt: event.CreatedAt(), + }) + }), nil +} + +func (p *relationalTablesProjection) reduceGitLabSelfHostedIDPChanged(event eventstore.Event) (*handler.Statement, error) { + var orgId *string + var idpEvent idp.GitLabSelfHostedIDPChangedEvent + switch e := event.(type) { + case *org.GitLabSelfHostedIDPChangedEvent: + idpEvent = e.GitLabSelfHostedIDPChangedEvent + orgId = &idpEvent.Aggregate().ResourceOwner + case *instance.GitLabSelfHostedIDPChangedEvent: + idpEvent = e.GitLabSelfHostedIDPChangedEvent + default: + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-YAf3g2", "reduce.wrong.event.type %v", []eventstore.EventType{org.GitLabSelfHostedIDPChangedEventType, instance.GitLabSelfHostedIDPChangedEventType}) + } + + return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInternal(nil, "HANDL-HX6ed", "unable to cast to tx executer") + } + idpRepo := repository.IDProviderRepository() + gitlabSelfHosted, err := idpRepo.GetGitlabSelfHosted(ctx, v3_sql.SQLTx(tx), database.WithCondition(idpScopedCondition(idpRepo, idpEvent.Agg.InstanceID, idpEvent.ID, orgId))) + if err != nil { + return err + } + + changes := p.reduceIDPChangedTemplateColumns(idpRepo, idpEvent.Name, idpEvent.OptionChanges) + + payload := &gitlabSelfHosted.GitlabSelfHosted + payloadChanged := p.reduceGitLabSelfHostedIDPChangedColumns(payload, &idpEvent) + if payloadChanged { + payloadJSON, err := json.Marshal(payload) + if err != nil { + return err + } + changes = append(changes, idpRepo.SetPayload(string(payloadJSON))) + } + + changes = append(changes, idpRepo.SetUpdatedAt(gu.Ptr(event.CreatedAt()))) + _, err = idpRepo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(idpRepo, idpEvent.Aggregate().InstanceID, idpEvent.ID, orgId), changes...) + return err + + }), nil +} + +func (p *relationalTablesProjection) reduceGitLabIDPChangedColumns(payload *domain.Gitlab, idpEvent *idp.GitLabIDPChangedEvent) bool { + payloadChanged := false + if payload == nil || idpEvent == nil { + return payloadChanged + } + + if idpEvent.ClientID != nil && *idpEvent.ClientID != payload.ClientID { + payloadChanged = true + payload.ClientID = *idpEvent.ClientID + } + if idpEvent.ClientSecret != nil { + payloadChanged = true + payload.ClientSecret = idpEvent.ClientSecret + } + if idpEvent.Scopes != nil && !slices.Equal(idpEvent.Scopes, payload.Scopes) { + payloadChanged = true + payload.Scopes = idpEvent.Scopes + } + return payloadChanged +} + +func (p *relationalTablesProjection) reduceGitLabSelfHostedIDPChangedColumns(payload *domain.GitlabSelfHosted, idpEvent *idp.GitLabSelfHostedIDPChangedEvent) bool { + payloadChanged := false + if payload == nil || idpEvent == nil { + return payloadChanged + } + + if idpEvent.ClientID != nil && *idpEvent.ClientID != payload.ClientID { + payloadChanged = true + payload.ClientID = *idpEvent.ClientID + } + if idpEvent.ClientSecret != nil { + payloadChanged = true + payload.ClientSecret = idpEvent.ClientSecret + } + if idpEvent.Issuer != nil && *idpEvent.Issuer != payload.Issuer { + payloadChanged = true + payload.Issuer = *idpEvent.Issuer + } + if idpEvent.Scopes != nil && !slices.Equal(idpEvent.Scopes, payload.Scopes) { + payloadChanged = true + payload.Scopes = idpEvent.Scopes + } + return payloadChanged +} diff --git a/internal/query/projection/idp_google_relational.go b/internal/query/projection/idp_google_relational.go new file mode 100644 index 000000000..c057d5d52 --- /dev/null +++ b/internal/query/projection/idp_google_relational.go @@ -0,0 +1,183 @@ +package projection + +import ( + "context" + "database/sql" + "encoding/json" + "slices" + + "github.com/muhlemmer/gu" + + "github.com/zitadel/zitadel/backend/v3/domain" + "github.com/zitadel/zitadel/backend/v3/storage/database" + v3_sql "github.com/zitadel/zitadel/backend/v3/storage/database/dialect/sql" + "github.com/zitadel/zitadel/backend/v3/storage/database/repository" + "github.com/zitadel/zitadel/internal/eventstore" + "github.com/zitadel/zitadel/internal/eventstore/handler/v2" + "github.com/zitadel/zitadel/internal/repository/idp" + "github.com/zitadel/zitadel/internal/repository/instance" + "github.com/zitadel/zitadel/internal/repository/org" + "github.com/zitadel/zitadel/internal/zerrors" +) + +func (p *relationalTablesProjection) reduceOIDCIDPMigratedGoogle(event eventstore.Event) (*handler.Statement, error) { + var orgID *string + var idpEvent idp.OIDCIDPMigratedGoogleEvent + switch e := event.(type) { + case *org.OIDCIDPMigratedGoogleEvent: + idpEvent = e.OIDCIDPMigratedGoogleEvent + orgID = gu.Ptr(idpEvent.Aggregate().ResourceOwner) + case *instance.OIDCIDPMigratedGoogleEvent: + idpEvent = e.OIDCIDPMigratedGoogleEvent + default: + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Y1502hk", "reduce.wrong.event.type %v", []eventstore.EventType{org.OIDCIDPMigratedGoogleEventType, instance.OIDCIDPMigratedGoogleEventType}) + } + + google := domain.Google{ + ClientID: idpEvent.ClientID, + ClientSecret: idpEvent.ClientSecret, + Scopes: idpEvent.Scopes, + } + + payloadJSON, err := json.Marshal(google) + if err != nil { + return nil, err + } + + return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInvalidArgumentf(nil, "HANDL-HDqk9", "reduce.wrong.db.pool %T", ex) + } + + repo := repository.IDProviderRepository() + changes := database.Changes{ + repo.SetName(idpEvent.Name), + repo.SetType(domain.IDPTypeGoogle), + repo.SetAllowCreation(idpEvent.IsCreationAllowed), + repo.SetAllowLinking(idpEvent.IsLinkingAllowed), + repo.SetAllowAutoCreation(idpEvent.IsAutoCreation), + repo.SetAllowAutoUpdate(idpEvent.IsAutoUpdate), + repo.SetAutoLinkingField(mapAutoLinkingField(idpEvent.AutoLinkingOption)), + repo.SetPayload(string(payloadJSON)), + repo.SetUpdatedAt(gu.Ptr(event.CreatedAt())), + } + + _, err = repo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(repo, idpEvent.Aggregate().InstanceID, idpEvent.ID, orgID), changes...) + return err + }), nil +} + +func (p *relationalTablesProjection) reduceGoogleIDPAdded(event eventstore.Event) (*handler.Statement, error) { + var orgId *string + var idpEvent idp.GoogleIDPAddedEvent + switch e := event.(type) { + case *org.GoogleIDPAddedEvent: + idpEvent = e.GoogleIDPAddedEvent + orgId = &idpEvent.Aggregate().ResourceOwner + case *instance.GoogleIDPAddedEvent: + idpEvent = e.GoogleIDPAddedEvent + default: + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Yp9ihb", "reduce.wrong.event.type %v", []eventstore.EventType{org.GoogleIDPAddedEventType, instance.GoogleIDPAddedEventType}) + } + + google := domain.Google{ + ClientID: idpEvent.ClientID, + ClientSecret: idpEvent.ClientSecret, + Scopes: idpEvent.Scopes, + } + + payloadJSON, err := json.Marshal(google) + if err != nil { + return nil, err + } + + return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInvalidArgumentf(nil, "HANDL-B9SPm", "reduce.wrong.db.pool %T", ex) + } + + repo := repository.IDProviderRepository() + return repo.Create(ctx, v3_sql.SQLTx(tx), &domain.IdentityProvider{ + InstanceID: idpEvent.Aggregate().InstanceID, + OrgID: orgId, + ID: idpEvent.ID, + State: domain.IDPStateActive, + Name: idpEvent.Name, + Type: gu.Ptr(domain.IDPTypeGoogle), + AllowCreation: idpEvent.IsCreationAllowed, + AllowAutoCreation: idpEvent.IsAutoCreation, + AllowAutoUpdate: idpEvent.IsAutoUpdate, + AllowLinking: idpEvent.IsLinkingAllowed, + AutoLinkingField: mapAutoLinkingField(idpEvent.AutoLinkingOption), + Payload: payloadJSON, + CreatedAt: event.CreatedAt(), + UpdatedAt: event.CreatedAt(), + }) + }), nil +} + +func (p *relationalTablesProjection) reduceGoogleIDPChanged(event eventstore.Event) (*handler.Statement, error) { + var orgId *string + var idpEvent idp.GoogleIDPChangedEvent + switch e := event.(type) { + case *org.GoogleIDPChangedEvent: + idpEvent = e.GoogleIDPChangedEvent + orgId = &idpEvent.Aggregate().ResourceOwner + case *instance.GoogleIDPChangedEvent: + idpEvent = e.GoogleIDPChangedEvent + default: + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-YN58hml", "reduce.wrong.event.type %v", []eventstore.EventType{org.GoogleIDPChangedEventType, instance.GoogleIDPChangedEventType}) + } + + return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInternal(nil, "HANDL-HX6ed", "unable to cast to tx executer") + } + idpRepo := repository.IDProviderRepository() + google, err := idpRepo.GetGoogle(ctx, v3_sql.SQLTx(tx), database.WithCondition(idpScopedCondition(idpRepo, idpEvent.Agg.InstanceID, idpEvent.ID, orgId))) + if err != nil { + return err + } + + changes := p.reduceIDPChangedTemplateColumns(idpRepo, idpEvent.Name, idpEvent.OptionChanges) + + payload := &google.Google + payloadChanged := p.reduceGoogleIDPChangedColumns(payload, &idpEvent) + if payloadChanged { + payloadJSON, err := json.Marshal(payload) + if err != nil { + return err + } + changes = append(changes, idpRepo.SetPayload(string(payloadJSON))) + } + + changes = append(changes, idpRepo.SetUpdatedAt(gu.Ptr(event.CreatedAt()))) + _, err = idpRepo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(idpRepo, idpEvent.Aggregate().InstanceID, idpEvent.ID, orgId), changes...) + return err + + }), nil +} + +func (p *relationalTablesProjection) reduceGoogleIDPChangedColumns(payload *domain.Google, idpEvent *idp.GoogleIDPChangedEvent) bool { + payloadChanged := false + if payload == nil || idpEvent == nil { + return payloadChanged + } + + if idpEvent.ClientID != nil && *idpEvent.ClientID != payload.ClientID { + payloadChanged = true + payload.ClientID = *idpEvent.ClientID + } + if idpEvent.ClientSecret != nil { + payloadChanged = true + payload.ClientSecret = idpEvent.ClientSecret + } + if idpEvent.Scopes != nil && !slices.Equal(idpEvent.Scopes, payload.Scopes) { + payloadChanged = true + payload.Scopes = idpEvent.Scopes + } + return payloadChanged +} diff --git a/internal/query/projection/idp_intent_relational.go b/internal/query/projection/idp_intent_relational.go index d9fbf6558..7bcfd4b84 100644 --- a/internal/query/projection/idp_intent_relational.go +++ b/internal/query/projection/idp_intent_relational.go @@ -15,40 +15,7 @@ import ( "github.com/zitadel/zitadel/internal/zerrors" ) -const ( - IDPIntentRelationalProjectionTable = "zitadel.identity_provider_intents" -) - -type idpIntentRelationalProjection struct{} - -func (*idpIntentRelationalProjection) Name() string { - return IDPIntentRelationalProjectionTable -} - -func newIDPIntentRelationalProjection(ctx context.Context, config handler.Config) *handler.Handler { - return handler.NewHandler(ctx, &config, new(idpIntentRelationalProjection)) -} - -// Reducers implements [handler.Projection]. -func (i *idpIntentRelationalProjection) Reducers() []handler.AggregateReducer { - return []handler.AggregateReducer{ - { - Aggregate: idpintent.AggregateType, - EventReducers: []handler.EventReducer{ - {Event: idpintent.StartedEventType, Reduce: i.reduceStartedEvent}, - {Event: idpintent.SucceededEventType, Reduce: i.reduceSucceededEvent}, - {Event: idpintent.SAMLSucceededEventType, Reduce: i.reduceSAMLSucceededEvent}, - {Event: idpintent.SAMLRequestEventType, Reduce: i.reduceSAMLRequestEvent}, - {Event: idpintent.LDAPSucceededEventType, Reduce: i.reduceLDAPSucceededEvent}, - {Event: idpintent.FailedEventType, Reduce: i.reduceFailedEvent}, - {Event: idpintent.ConsumedEventType, Reduce: i.reduceConsumedEvent}, - }, - }, - } - -} - -func (i *idpIntentRelationalProjection) reduceStartedEvent(evt eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceIDPIntentStartedEvent(evt eventstore.Event) (*handler.Statement, error) { e, ok := evt.(*idpintent.StartedEvent) if !ok { return nil, zerrors.ThrowInternalf(nil, "HANDL-Lqj3HB", "reduce.wrong.event.type %s", idpintent.StartedEventType) @@ -74,7 +41,7 @@ func (i *idpIntentRelationalProjection) reduceStartedEvent(evt eventstore.Event) }), nil } -func (i *idpIntentRelationalProjection) reduceSucceededEvent(evt eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceIDPIntentSucceededEvent(evt eventstore.Event) (*handler.Statement, error) { e, ok := evt.(*idpintent.SucceededEvent) if !ok { return nil, zerrors.ThrowInternalf(nil, "HANDL-hQSxj0", "reduce.wrong.event.type %s", idpintent.SucceededEventType) @@ -116,7 +83,7 @@ func (i *idpIntentRelationalProjection) reduceSucceededEvent(evt eventstore.Even }), nil } -func (i *idpIntentRelationalProjection) reduceSAMLSucceededEvent(evt eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceIDPIntentSAMLSucceededEvent(evt eventstore.Event) (*handler.Statement, error) { e, ok := evt.(*idpintent.SAMLSucceededEvent) if !ok { return nil, zerrors.ThrowInternalf(nil, "HANDL-t2uaiv", "reduce.wrong.event.type %s", idpintent.SAMLSucceededEventType) @@ -153,7 +120,7 @@ func (i *idpIntentRelationalProjection) reduceSAMLSucceededEvent(evt eventstore. }), nil } -func (i *idpIntentRelationalProjection) reduceSAMLRequestEvent(evt eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceIDPIntentSAMLRequestEvent(evt eventstore.Event) (*handler.Statement, error) { e, ok := evt.(*idpintent.SAMLRequestEvent) if !ok { return nil, zerrors.ThrowInternalf(nil, "HANDL-f7O6K2", "reduce.wrong.event.type %s", idpintent.SAMLRequestEventType) @@ -175,7 +142,7 @@ func (i *idpIntentRelationalProjection) reduceSAMLRequestEvent(evt eventstore.Ev }), nil } -func (i *idpIntentRelationalProjection) reduceLDAPSucceededEvent(evt eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceIDPIntentLDAPSucceededEvent(evt eventstore.Event) (*handler.Statement, error) { e, ok := evt.(*idpintent.LDAPSucceededEvent) if !ok { return nil, zerrors.ThrowInternalf(nil, "HANDL-Gw8ddW", "reduce.wrong.event.type %s", idpintent.LDAPSucceededEventType) @@ -209,7 +176,7 @@ func (i *idpIntentRelationalProjection) reduceLDAPSucceededEvent(evt eventstore. }), nil } -func (i *idpIntentRelationalProjection) reduceFailedEvent(evt eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceIDPIntentFailedEvent(evt eventstore.Event) (*handler.Statement, error) { e, ok := evt.(*idpintent.FailedEvent) if !ok { return nil, zerrors.ThrowInternalf(nil, "HANDL-x3o9LZ", "reduce.wrong.event.type %s", idpintent.FailedEventType) @@ -233,7 +200,7 @@ func (i *idpIntentRelationalProjection) reduceFailedEvent(evt eventstore.Event) }), nil } -func (i *idpIntentRelationalProjection) reduceConsumedEvent(evt eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceIDPIntentConsumedEvent(evt eventstore.Event) (*handler.Statement, error) { e, ok := evt.(*idpintent.ConsumedEvent) if !ok { return nil, zerrors.ThrowInternalf(nil, "HANDL-jHZs6T", "reduce.wrong.event.type %s", idpintent.ConsumedEventType) diff --git a/internal/query/projection/idp_jwt_relational.go b/internal/query/projection/idp_jwt_relational.go new file mode 100644 index 000000000..367585921 --- /dev/null +++ b/internal/query/projection/idp_jwt_relational.go @@ -0,0 +1,225 @@ +package projection + +import ( + "context" + "database/sql" + "encoding/json" + + "github.com/muhlemmer/gu" + + "github.com/zitadel/zitadel/backend/v3/domain" + "github.com/zitadel/zitadel/backend/v3/storage/database" + v3_sql "github.com/zitadel/zitadel/backend/v3/storage/database/dialect/sql" + "github.com/zitadel/zitadel/backend/v3/storage/database/repository" + "github.com/zitadel/zitadel/internal/eventstore" + "github.com/zitadel/zitadel/internal/eventstore/handler/v2" + "github.com/zitadel/zitadel/internal/repository/idp" + "github.com/zitadel/zitadel/internal/repository/idpconfig" + "github.com/zitadel/zitadel/internal/repository/instance" + "github.com/zitadel/zitadel/internal/repository/org" + "github.com/zitadel/zitadel/internal/zerrors" +) + +func (p *relationalTablesProjection) reduceJWTConfigAdded(event eventstore.Event) (*handler.Statement, error) { + var orgID *string + var idpEvent idpconfig.JWTConfigAddedEvent + switch e := event.(type) { + case *org.IDPJWTConfigAddedEvent: + idpEvent = e.JWTConfigAddedEvent + orgID = gu.Ptr(idpEvent.Aggregate().ResourceOwner) + case *instance.IDPJWTConfigAddedEvent: + idpEvent = e.JWTConfigAddedEvent + default: + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-YvPdb", "reduce.wrong.event.type %v", []eventstore.EventType{org.IDPJWTConfigAddedEventType, instance.IDPJWTConfigAddedEventType}) + } + + payloadJSON, err := json.Marshal(idpEvent) + if err != nil { + return nil, err + } + + return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInvalidArgumentf(nil, "HANDL-tJQ8V", "reduce.wrong.db.pool %T", ex) + } + + repo := repository.IDProviderRepository() + _, err = repo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(repo, idpEvent.Aggregate().InstanceID, idpEvent.IDPConfigID, orgID), + repo.SetPayload(string(payloadJSON)), + repo.SetType(domain.IDPTypeJWT), + repo.SetUpdatedAt(gu.Ptr(event.CreatedAt())), + ) + return err + }), nil +} + +func (p *relationalTablesProjection) reduceJWTConfigChanged(event eventstore.Event) (*handler.Statement, error) { + var orgId *string + var idpEvent idpconfig.JWTConfigChangedEvent + switch e := event.(type) { + case *org.IDPJWTConfigChangedEvent: + idpEvent = e.JWTConfigChangedEvent + orgId = &idpEvent.Aggregate().ResourceOwner + case *instance.IDPJWTConfigChangedEvent: + idpEvent = e.JWTConfigChangedEvent + default: + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Y2IVI", "reduce.wrong.event.type %v", []eventstore.EventType{org.IDPJWTConfigChangedEventType, instance.IDPJWTConfigChangedEventType}) + } + + return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInternal(nil, "HANDL-sh6Lp", "unable to cast to tx executer") + } + + idpRepo := repository.IDProviderRepository() + jwt, err := idpRepo.GetJWT(ctx, v3_sql.SQLTx(tx), database.WithCondition(idpScopedCondition(idpRepo, idpEvent.Agg.InstanceID, idpEvent.IDPConfigID, orgId))) + if err != nil { + return err + } + + if idpEvent.JWTEndpoint != nil && *idpEvent.JWTEndpoint != jwt.JWTEndpoint { + jwt.JWTEndpoint = *idpEvent.JWTEndpoint + } + if idpEvent.Issuer != nil && *idpEvent.Issuer != jwt.Issuer { + jwt.Issuer = *idpEvent.Issuer + } + if idpEvent.KeysEndpoint != nil && *idpEvent.KeysEndpoint != jwt.KeysEndpoint { + jwt.KeysEndpoint = *idpEvent.KeysEndpoint + } + if idpEvent.HeaderName != nil && *idpEvent.HeaderName != jwt.HeaderName { + jwt.HeaderName = *idpEvent.HeaderName + } + + payloadJSON, err := json.Marshal(jwt.JWT) + if err != nil { + return err + } + + _, err = idpRepo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(idpRepo, idpEvent.Aggregate().InstanceID, idpEvent.IDPConfigID, orgId), + idpRepo.SetPayload(string(payloadJSON)), + idpRepo.SetType(domain.IDPTypeJWT), + idpRepo.SetUpdatedAt(gu.Ptr(event.CreatedAt())), + ) + return err + }), nil +} + +func (p *relationalTablesProjection) reduceJWTIDPAdded(event eventstore.Event) (*handler.Statement, error) { + var orgId *string + var idpEvent idp.JWTIDPAddedEvent + switch e := event.(type) { + case *org.JWTIDPAddedEvent: + idpEvent = e.JWTIDPAddedEvent + orgId = &idpEvent.Aggregate().ResourceOwner + case *instance.JWTIDPAddedEvent: + idpEvent = e.JWTIDPAddedEvent + default: + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Yopi2s", "reduce.wrong.event.type %v", []eventstore.EventType{org.JWTIDPAddedEventType, instance.JWTIDPAddedEventType}) + } + + jwt := domain.JWT{ + JWTEndpoint: idpEvent.JWTEndpoint, + Issuer: idpEvent.Issuer, + KeysEndpoint: idpEvent.KeysEndpoint, + HeaderName: idpEvent.HeaderName, + } + + payloadJSON, err := json.Marshal(jwt) + if err != nil { + return nil, err + } + + return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInvalidArgumentf(nil, "HANDL-ZYYyQ", "reduce.wrong.db.pool %T", ex) + } + + repo := repository.IDProviderRepository() + return repo.Create(ctx, v3_sql.SQLTx(tx), &domain.IdentityProvider{ + InstanceID: idpEvent.Aggregate().InstanceID, + OrgID: orgId, + ID: idpEvent.ID, + State: domain.IDPStateActive, + Name: idpEvent.Name, + Type: gu.Ptr(domain.IDPTypeJWT), + AllowCreation: idpEvent.IsCreationAllowed, + AllowAutoCreation: idpEvent.IsAutoCreation, + AllowAutoUpdate: idpEvent.IsAutoUpdate, + AllowLinking: idpEvent.IsLinkingAllowed, + AutoLinkingField: mapAutoLinkingField(idpEvent.AutoLinkingOption), + Payload: payloadJSON, + CreatedAt: event.CreatedAt(), + UpdatedAt: event.CreatedAt(), + }) + }), nil +} + +func (p *relationalTablesProjection) reduceJWTIDPChanged(event eventstore.Event) (*handler.Statement, error) { + var orgId *string + var idpEvent idp.JWTIDPChangedEvent + switch e := event.(type) { + case *org.JWTIDPChangedEvent: + idpEvent = e.JWTIDPChangedEvent + orgId = &idpEvent.Aggregate().ResourceOwner + case *instance.JWTIDPChangedEvent: + idpEvent = e.JWTIDPChangedEvent + default: + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-H15j2il", "reduce.wrong.event.type %v", []eventstore.EventType{org.JWTIDPChangedEventType, instance.JWTIDPChangedEventType}) + } + + return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInternal(nil, "HANDL-HX6ed", "unable to cast to tx executer") + } + idpRepo := repository.IDProviderRepository() + jwt, err := idpRepo.GetJWT(ctx, v3_sql.SQLTx(tx), database.WithCondition(idpScopedCondition(idpRepo, idpEvent.Agg.InstanceID, idpEvent.ID, orgId))) + if err != nil { + return err + } + + changes := p.reduceIDPChangedTemplateColumns(idpRepo, idpEvent.Name, idpEvent.OptionChanges) + + payload := &jwt.JWT + payloadChanged := p.reduceJWTIDPChangedColumns(payload, &idpEvent) + if payloadChanged { + payloadJSON, err := json.Marshal(payload) + if err != nil { + return err + } + changes = append(changes, idpRepo.SetPayload(string(payloadJSON))) + } + + changes = append(changes, idpRepo.SetUpdatedAt(gu.Ptr(event.CreatedAt()))) + _, err = idpRepo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(idpRepo, idpEvent.Aggregate().InstanceID, idpEvent.ID, orgId), changes...) + return err + }), nil +} + +func (p *relationalTablesProjection) reduceJWTIDPChangedColumns(payload *domain.JWT, idpEvent *idp.JWTIDPChangedEvent) bool { + payloadChanged := false + if payload == nil || idpEvent == nil { + return payloadChanged + } + + if idpEvent.JWTEndpoint != nil && *idpEvent.JWTEndpoint != payload.JWTEndpoint { + payloadChanged = true + payload.JWTEndpoint = *idpEvent.JWTEndpoint + } + if idpEvent.KeysEndpoint != nil && *idpEvent.KeysEndpoint != payload.KeysEndpoint { + payloadChanged = true + payload.KeysEndpoint = *idpEvent.KeysEndpoint + } + if idpEvent.HeaderName != nil && *idpEvent.HeaderName != payload.HeaderName { + payloadChanged = true + payload.HeaderName = *idpEvent.HeaderName + } + if idpEvent.Issuer != nil && *idpEvent.Issuer != payload.Issuer { + payloadChanged = true + payload.Issuer = *idpEvent.Issuer + } + return payloadChanged +} diff --git a/internal/query/projection/idp_ldap_relational.go b/internal/query/projection/idp_ldap_relational.go new file mode 100644 index 000000000..4c877f360 --- /dev/null +++ b/internal/query/projection/idp_ldap_relational.go @@ -0,0 +1,237 @@ +package projection + +import ( + "context" + "database/sql" + "encoding/json" + "slices" + + "github.com/muhlemmer/gu" + + "github.com/zitadel/zitadel/backend/v3/domain" + "github.com/zitadel/zitadel/backend/v3/storage/database" + v3_sql "github.com/zitadel/zitadel/backend/v3/storage/database/dialect/sql" + "github.com/zitadel/zitadel/backend/v3/storage/database/repository" + "github.com/zitadel/zitadel/internal/eventstore" + "github.com/zitadel/zitadel/internal/eventstore/handler/v2" + "github.com/zitadel/zitadel/internal/repository/idp" + "github.com/zitadel/zitadel/internal/repository/instance" + "github.com/zitadel/zitadel/internal/repository/org" + "github.com/zitadel/zitadel/internal/zerrors" +) + +func (p *relationalTablesProjection) reduceLDAPIDPAdded(event eventstore.Event) (*handler.Statement, error) { + var orgId *string + var idpEvent idp.LDAPIDPAddedEvent + switch e := event.(type) { + case *org.LDAPIDPAddedEvent: + idpEvent = e.LDAPIDPAddedEvent + orgId = &idpEvent.Aggregate().ResourceOwner + case *instance.LDAPIDPAddedEvent: + idpEvent = e.LDAPIDPAddedEvent + default: + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-9s02m1", "reduce.wrong.event.type %v", []eventstore.EventType{org.LDAPIDPAddedEventType, instance.LDAPIDPAddedEventType}) + } + + ldap := domain.LDAP{ + Servers: idpEvent.Servers, + StartTLS: idpEvent.StartTLS, + BaseDN: idpEvent.BaseDN, + BindDN: idpEvent.BindDN, + BindPassword: idpEvent.BindPassword, + UserBase: idpEvent.UserBase, + UserObjectClasses: idpEvent.UserObjectClasses, + UserFilters: idpEvent.UserFilters, + Timeout: idpEvent.Timeout, + LDAPAttributes: domain.LDAPAttributes{ + IDAttribute: idpEvent.IDAttribute, + FirstNameAttribute: idpEvent.FirstNameAttribute, + LastNameAttribute: idpEvent.LastNameAttribute, + DisplayNameAttribute: idpEvent.DisplayNameAttribute, + NickNameAttribute: idpEvent.NickNameAttribute, + PreferredUsernameAttribute: idpEvent.PreferredUsernameAttribute, + EmailAttribute: idpEvent.EmailAttribute, + EmailVerifiedAttribute: idpEvent.EmailVerifiedAttribute, + PhoneAttribute: idpEvent.PhoneAttribute, + PhoneVerifiedAttribute: idpEvent.PhoneVerifiedAttribute, + PreferredLanguageAttribute: idpEvent.PreferredLanguageAttribute, + AvatarURLAttribute: idpEvent.AvatarURLAttribute, + ProfileAttribute: idpEvent.ProfileAttribute, + }, + } + + payloadJSON, err := json.Marshal(ldap) + if err != nil { + return nil, err + } + + return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInvalidArgumentf(nil, "HANDL-XCJ8w", "reduce.wrong.db.pool %T", ex) + } + + repo := repository.IDProviderRepository() + return repo.Create(ctx, v3_sql.SQLTx(tx), &domain.IdentityProvider{ + InstanceID: idpEvent.Aggregate().InstanceID, + OrgID: orgId, + ID: idpEvent.ID, + State: domain.IDPStateActive, + Name: idpEvent.Name, + Type: gu.Ptr(domain.IDPTypeLDAP), + AllowCreation: idpEvent.IsCreationAllowed, + AllowAutoCreation: idpEvent.IsAutoCreation, + AllowAutoUpdate: idpEvent.IsAutoUpdate, + AllowLinking: idpEvent.IsLinkingAllowed, + AutoLinkingField: mapAutoLinkingField(idpEvent.AutoLinkingOption), + Payload: payloadJSON, + CreatedAt: event.CreatedAt(), + UpdatedAt: event.CreatedAt(), + }) + }), nil +} + +func (p *relationalTablesProjection) reduceLDAPIDPChanged(event eventstore.Event) (*handler.Statement, error) { + var orgId *string + var idpEvent idp.LDAPIDPChangedEvent + switch e := event.(type) { + case *org.LDAPIDPChangedEvent: + idpEvent = e.LDAPIDPChangedEvent + orgId = &idpEvent.Aggregate().ResourceOwner + case *instance.LDAPIDPChangedEvent: + idpEvent = e.LDAPIDPChangedEvent + default: + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-p1582ks", "reduce.wrong.event.type %v", []eventstore.EventType{org.LDAPIDPChangedEventType, instance.LDAPIDPChangedEventType}) + } + + return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInternal(nil, "HANDL-HX6ed", "unable to cast to tx executer") + } + idpRepo := repository.IDProviderRepository() + ldap, err := idpRepo.GetLDAP(ctx, v3_sql.SQLTx(tx), database.WithCondition(idpScopedCondition(idpRepo, idpEvent.Agg.InstanceID, idpEvent.ID, orgId))) + if err != nil { + return err + } + + changes := p.reduceIDPChangedTemplateColumns(idpRepo, idpEvent.Name, idpEvent.OptionChanges) + + payload := &ldap.LDAP + payloadChanged := p.reduceLDAPIDPChangedColumns(payload, &idpEvent) + if payloadChanged { + payloadJSON, err := json.Marshal(payload) + if err != nil { + return err + } + changes = append(changes, idpRepo.SetPayload(string(payloadJSON))) + } + + changes = append(changes, idpRepo.SetUpdatedAt(gu.Ptr(event.CreatedAt()))) + _, err = idpRepo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(idpRepo, idpEvent.Aggregate().InstanceID, idpEvent.ID, orgId), changes...) + return err + + }), nil +} + +//nolint:gocognit +func (p *relationalTablesProjection) reduceLDAPIDPChangedColumns(payload *domain.LDAP, idpEvent *idp.LDAPIDPChangedEvent) bool { + payloadChanged := false + if payload == nil || idpEvent == nil { + return payloadChanged + } + + if idpEvent.Servers != nil && !slices.Equal(idpEvent.Servers, payload.Servers) { + payloadChanged = true + payload.Servers = idpEvent.Servers + } + if idpEvent.StartTLS != nil && *idpEvent.StartTLS != payload.StartTLS { + payloadChanged = true + payload.StartTLS = *idpEvent.StartTLS + } + if idpEvent.BaseDN != nil && *idpEvent.BaseDN != payload.BaseDN { + payloadChanged = true + payload.BaseDN = *idpEvent.BaseDN + } + if idpEvent.BindDN != nil && *idpEvent.BindDN != payload.BindDN { + payloadChanged = true + payload.BindDN = *idpEvent.BindDN + } + if idpEvent.BindPassword != nil { + payloadChanged = true + payload.BindPassword = idpEvent.BindPassword + } + if idpEvent.UserBase != nil && *idpEvent.UserBase != payload.UserBase { + payloadChanged = true + payload.UserBase = *idpEvent.UserBase + } + if idpEvent.UserObjectClasses != nil && !slices.Equal(idpEvent.UserObjectClasses, payload.UserObjectClasses) { + payloadChanged = true + payload.UserObjectClasses = idpEvent.UserObjectClasses + } + if idpEvent.UserFilters != nil && !slices.Equal(idpEvent.UserFilters, payload.UserFilters) { + payloadChanged = true + payload.UserFilters = idpEvent.UserFilters + } + if idpEvent.Timeout != nil && *idpEvent.Timeout != payload.Timeout { + payloadChanged = true + payload.Timeout = *idpEvent.Timeout + } + if idpEvent.RootCA != nil && !slices.Equal(idpEvent.RootCA, payload.RootCA) { + payloadChanged = true + payload.RootCA = idpEvent.RootCA + } + if idpEvent.IDAttribute != nil && *idpEvent.IDAttribute != payload.IDAttribute { + payloadChanged = true + payload.IDAttribute = *idpEvent.IDAttribute + } + if idpEvent.FirstNameAttribute != nil && *idpEvent.FirstNameAttribute != payload.FirstNameAttribute { + payloadChanged = true + payload.FirstNameAttribute = *idpEvent.FirstNameAttribute + } + if idpEvent.LastNameAttribute != nil && *idpEvent.LastNameAttribute != payload.LastNameAttribute { + payloadChanged = true + payload.LastNameAttribute = *idpEvent.LastNameAttribute + } + if idpEvent.DisplayNameAttribute != nil && *idpEvent.DisplayNameAttribute != payload.DisplayNameAttribute { + payloadChanged = true + payload.DisplayNameAttribute = *idpEvent.DisplayNameAttribute + } + if idpEvent.NickNameAttribute != nil && *idpEvent.NickNameAttribute != payload.NickNameAttribute { + payloadChanged = true + payload.NickNameAttribute = *idpEvent.NickNameAttribute + } + if idpEvent.PreferredUsernameAttribute != nil && *idpEvent.PreferredUsernameAttribute != payload.PreferredUsernameAttribute { + payloadChanged = true + payload.PreferredUsernameAttribute = *idpEvent.PreferredUsernameAttribute + } + if idpEvent.EmailAttribute != nil && *idpEvent.EmailAttribute != payload.EmailAttribute { + payloadChanged = true + payload.EmailAttribute = *idpEvent.EmailAttribute + } + if idpEvent.EmailVerifiedAttribute != nil && *idpEvent.EmailVerifiedAttribute != payload.EmailVerifiedAttribute { + payloadChanged = true + payload.EmailVerifiedAttribute = *idpEvent.EmailVerifiedAttribute + } + if idpEvent.PhoneAttribute != nil && *idpEvent.PhoneAttribute != payload.PhoneAttribute { + payloadChanged = true + payload.PhoneAttribute = *idpEvent.PhoneAttribute + } + if idpEvent.PhoneVerifiedAttribute != nil && *idpEvent.PhoneVerifiedAttribute != payload.PhoneVerifiedAttribute { + payloadChanged = true + payload.PhoneVerifiedAttribute = *idpEvent.PhoneVerifiedAttribute + } + if idpEvent.PreferredLanguageAttribute != nil && *idpEvent.PreferredLanguageAttribute != payload.PreferredLanguageAttribute { + payloadChanged = true + payload.PreferredLanguageAttribute = *idpEvent.PreferredLanguageAttribute + } + if idpEvent.AvatarURLAttribute != nil && *idpEvent.AvatarURLAttribute != payload.AvatarURLAttribute { + payloadChanged = true + payload.AvatarURLAttribute = *idpEvent.AvatarURLAttribute + } + if idpEvent.ProfileAttribute != nil && *idpEvent.ProfileAttribute != payload.ProfileAttribute { + payloadChanged = true + payload.ProfileAttribute = *idpEvent.ProfileAttribute + } + return payloadChanged +} diff --git a/internal/query/projection/idp_oauth_relational.go b/internal/query/projection/idp_oauth_relational.go new file mode 100644 index 000000000..41325a9e2 --- /dev/null +++ b/internal/query/projection/idp_oauth_relational.go @@ -0,0 +1,160 @@ +package projection + +import ( + "context" + "database/sql" + "encoding/json" + "slices" + + "github.com/muhlemmer/gu" + + "github.com/zitadel/zitadel/backend/v3/domain" + "github.com/zitadel/zitadel/backend/v3/storage/database" + v3_sql "github.com/zitadel/zitadel/backend/v3/storage/database/dialect/sql" + "github.com/zitadel/zitadel/backend/v3/storage/database/repository" + "github.com/zitadel/zitadel/internal/eventstore" + "github.com/zitadel/zitadel/internal/eventstore/handler/v2" + "github.com/zitadel/zitadel/internal/repository/idp" + "github.com/zitadel/zitadel/internal/repository/instance" + "github.com/zitadel/zitadel/internal/repository/org" + "github.com/zitadel/zitadel/internal/zerrors" +) + +func (p *relationalTablesProjection) reduceOAuthIDPAdded(event eventstore.Event) (*handler.Statement, error) { + var orgId *string + var idpEvent idp.OAuthIDPAddedEvent + switch e := event.(type) { + case *org.OAuthIDPAddedEvent: + idpEvent = e.OAuthIDPAddedEvent + orgId = &idpEvent.Aggregate().ResourceOwner + case *instance.OAuthIDPAddedEvent: + idpEvent = e.OAuthIDPAddedEvent + default: + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Yap9ihb", "reduce.wrong.event.type %v", []eventstore.EventType{org.OAuthIDPAddedEventType, instance.OAuthIDPAddedEventType}) + } + + oauth := domain.OAuth{ + ClientID: idpEvent.ClientID, + ClientSecret: idpEvent.ClientSecret, + AuthorizationEndpoint: idpEvent.AuthorizationEndpoint, + TokenEndpoint: idpEvent.TokenEndpoint, + UserEndpoint: idpEvent.UserEndpoint, + Scopes: idpEvent.Scopes, + IDAttribute: idpEvent.IDAttribute, + UsePKCE: idpEvent.UsePKCE, + } + + payloadJSON, err := json.Marshal(oauth) + if err != nil { + return nil, err + } + + return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInvalidArgumentf(nil, "HANDL-mB2hq", "reduce.wrong.db.pool %T", ex) + } + + repo := repository.IDProviderRepository() + return repo.Create(ctx, v3_sql.SQLTx(tx), &domain.IdentityProvider{ + InstanceID: idpEvent.Aggregate().InstanceID, + OrgID: orgId, + ID: idpEvent.ID, + State: domain.IDPStateActive, + Name: idpEvent.Name, + Type: gu.Ptr(domain.IDPTypeOAuth), + AllowCreation: idpEvent.IsCreationAllowed, + AllowLinking: idpEvent.IsLinkingAllowed, + AllowAutoCreation: idpEvent.IsAutoCreation, + AllowAutoUpdate: idpEvent.IsAutoUpdate, + AutoLinkingField: mapAutoLinkingField(idpEvent.AutoLinkingOption), + Payload: payloadJSON, + CreatedAt: event.CreatedAt(), + UpdatedAt: event.CreatedAt(), + }) + }), nil +} + +func (p *relationalTablesProjection) reduceOAuthIDPChanged(event eventstore.Event) (*handler.Statement, error) { + var orgId *string + var idpEvent idp.OAuthIDPChangedEvent + switch e := event.(type) { + case *org.OAuthIDPChangedEvent: + idpEvent = e.OAuthIDPChangedEvent + orgId = &idpEvent.Aggregate().ResourceOwner + case *instance.OAuthIDPChangedEvent: + idpEvent = e.OAuthIDPChangedEvent + default: + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-K1582ks", "reduce.wrong.event.type %v", []eventstore.EventType{org.OAuthIDPChangedEventType, instance.OAuthIDPChangedEventType}) + } + + return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInternal(nil, "HANDL-HX6ed", "unable to cast to tx executer") + } + idpRepo := repository.IDProviderRepository() + oauth, err := idpRepo.GetOAuth(ctx, v3_sql.SQLTx(tx), database.WithCondition(idpScopedCondition(idpRepo, idpEvent.Agg.InstanceID, idpEvent.ID, orgId))) + if err != nil { + return err + } + + changes := p.reduceIDPChangedTemplateColumns(idpRepo, idpEvent.Name, idpEvent.OptionChanges) + + payload := &oauth.OAuth + payloadChanged := p.reduceOAuthIDPChangedColumns(payload, &idpEvent) + if payloadChanged { + payloadJSON, err := json.Marshal(payload) + if err != nil { + return err + } + changes = append(changes, idpRepo.SetPayload(string(payloadJSON))) + } + + changes = append(changes, idpRepo.SetUpdatedAt(gu.Ptr(event.CreatedAt()))) + _, err = idpRepo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(idpRepo, idpEvent.Aggregate().InstanceID, idpEvent.ID, orgId), changes...) + return err + + }), nil +} + +func (p *relationalTablesProjection) reduceOAuthIDPChangedColumns(payload *domain.OAuth, idpEvent *idp.OAuthIDPChangedEvent) bool { + payloadChanged := false + if payload == nil || idpEvent == nil { + return payloadChanged + } + + if idpEvent.ClientID != nil && *idpEvent.ClientID != payload.ClientID { + payloadChanged = true + payload.ClientID = *idpEvent.ClientID + } + if idpEvent.ClientSecret != nil { + payloadChanged = true + payload.ClientSecret = idpEvent.ClientSecret + } + if idpEvent.AuthorizationEndpoint != nil && *idpEvent.AuthorizationEndpoint != payload.AuthorizationEndpoint { + payloadChanged = true + payload.AuthorizationEndpoint = *idpEvent.AuthorizationEndpoint + } + if idpEvent.TokenEndpoint != nil && *idpEvent.TokenEndpoint != payload.TokenEndpoint { + payloadChanged = true + payload.TokenEndpoint = *idpEvent.TokenEndpoint + } + if idpEvent.UserEndpoint != nil && *idpEvent.UserEndpoint != payload.UserEndpoint { + payloadChanged = true + payload.UserEndpoint = *idpEvent.UserEndpoint + } + if idpEvent.Scopes != nil && !slices.Equal(idpEvent.Scopes, payload.Scopes) { + payloadChanged = true + payload.Scopes = idpEvent.Scopes + } + if idpEvent.IDAttribute != nil && *idpEvent.IDAttribute != payload.IDAttribute { + payloadChanged = true + payload.IDAttribute = *idpEvent.IDAttribute + } + if idpEvent.UsePKCE != nil && *idpEvent.UsePKCE != payload.UsePKCE { + payloadChanged = true + payload.UsePKCE = *idpEvent.UsePKCE + } + return payloadChanged +} diff --git a/internal/query/projection/idp_oidc_relational.go b/internal/query/projection/idp_oidc_relational.go new file mode 100644 index 000000000..ed07e6dbb --- /dev/null +++ b/internal/query/projection/idp_oidc_relational.go @@ -0,0 +1,253 @@ +package projection + +import ( + "context" + "database/sql" + "encoding/json" + "slices" + + "github.com/muhlemmer/gu" + + "github.com/zitadel/zitadel/backend/v3/domain" + "github.com/zitadel/zitadel/backend/v3/storage/database" + v3_sql "github.com/zitadel/zitadel/backend/v3/storage/database/dialect/sql" + "github.com/zitadel/zitadel/backend/v3/storage/database/repository" + internal_domain "github.com/zitadel/zitadel/internal/domain" + "github.com/zitadel/zitadel/internal/eventstore" + "github.com/zitadel/zitadel/internal/eventstore/handler/v2" + "github.com/zitadel/zitadel/internal/repository/idp" + "github.com/zitadel/zitadel/internal/repository/idpconfig" + "github.com/zitadel/zitadel/internal/repository/instance" + "github.com/zitadel/zitadel/internal/repository/org" + "github.com/zitadel/zitadel/internal/zerrors" +) + +func (p *relationalTablesProjection) reduceOIDCConfigAdded(event eventstore.Event) (*handler.Statement, error) { + var orgID *string + var idpEvent idpconfig.OIDCConfigAddedEvent + switch e := event.(type) { + case *org.IDPOIDCConfigAddedEvent: + idpEvent = e.OIDCConfigAddedEvent + orgID = gu.Ptr(idpEvent.Aggregate().ResourceOwner) + case *instance.IDPOIDCConfigAddedEvent: + idpEvent = e.OIDCConfigAddedEvent + default: + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-YFuAA", "reduce.wrong.event.type %v", []eventstore.EventType{org.IDPOIDCConfigAddedEventType, instance.IDPOIDCConfigAddedEventType}) + } + + payloadJSON, err := json.Marshal(idpEvent) + if err != nil { + return nil, err + } + + return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInvalidArgumentf(nil, "HANDL-5cvzY", "reduce.wrong.db.pool %T", ex) + } + + repo := repository.IDProviderRepository() + _, err = repo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(repo, idpEvent.Aggregate().InstanceID, idpEvent.IDPConfigID, orgID), + repo.SetPayload(string(payloadJSON)), + repo.SetType(domain.IDPTypeOIDC), + repo.SetUpdatedAt(gu.Ptr(event.CreatedAt())), + ) + return err + }), nil +} + +func (p *relationalTablesProjection) reduceOIDCConfigChanged(event eventstore.Event) (*handler.Statement, error) { + var orgId *string + var idpEvent idpconfig.OIDCConfigChangedEvent + switch e := event.(type) { + case *org.IDPOIDCConfigChangedEvent: + idpEvent = e.OIDCConfigChangedEvent + orgId = &idpEvent.Aggregate().ResourceOwner + case *instance.IDPOIDCConfigChangedEvent: + idpEvent = e.OIDCConfigChangedEvent + default: + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Y2IVI", "reduce.wrong.event.type %v", []eventstore.EventType{org.IDPOIDCConfigChangedEventType, instance.IDPOIDCConfigChangedEventType}) + } + + return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInternal(nil, "HANDL-sh6Lp", "unable to cast to tx executer") + } + + idpRepo := repository.IDProviderRepository() + oidc, err := idpRepo.GetOIDC(ctx, v3_sql.SQLTx(tx), database.WithCondition(idpScopedCondition(idpRepo, idpEvent.Agg.InstanceID, idpEvent.IDPConfigID, orgId))) + if err != nil { + return err + } + + if idpEvent.ClientID != nil && *idpEvent.ClientID != oidc.ClientID { + oidc.ClientID = *idpEvent.ClientID + } + if idpEvent.ClientSecret != nil { + oidc.ClientSecret = idpEvent.ClientSecret + } + if idpEvent.Issuer != nil && *idpEvent.Issuer != oidc.Issuer { + oidc.Issuer = *idpEvent.Issuer + } + if idpEvent.AuthorizationEndpoint != nil && *idpEvent.AuthorizationEndpoint != oidc.AuthorizationEndpoint { + oidc.AuthorizationEndpoint = *idpEvent.AuthorizationEndpoint + } + if idpEvent.TokenEndpoint != nil && *idpEvent.TokenEndpoint != oidc.TokenEndpoint { + oidc.TokenEndpoint = *idpEvent.TokenEndpoint + } + if idpEvent.Scopes != nil && !slices.Equal(idpEvent.Scopes, oidc.Scopes) { + oidc.Scopes = idpEvent.Scopes + } + if idpEvent.IDPDisplayNameMapping != nil { + oidc.IDPDisplayNameMapping = mapOIDCMappingField(*idpEvent.IDPDisplayNameMapping) + } + if idpEvent.UserNameMapping != nil { + oidc.UserNameMapping = mapOIDCMappingField(*idpEvent.UserNameMapping) + } + + payloadJSON, err := json.Marshal(oidc.OIDC) + if err != nil { + return err + } + + _, err = idpRepo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(idpRepo, idpEvent.Aggregate().InstanceID, idpEvent.IDPConfigID, orgId), + idpRepo.SetPayload(string(payloadJSON)), + idpRepo.SetType(domain.IDPTypeOIDC), + idpRepo.SetUpdatedAt(gu.Ptr(event.CreatedAt())), + ) + return err + }), nil +} + +func mapOIDCMappingField(field internal_domain.OIDCMappingField) domain.OIDCMappingField { + switch field { + case internal_domain.OIDCMappingFieldEmail: + return domain.OIDCMappingFieldEmail + case internal_domain.OIDCMappingFieldPreferredLoginName: + return domain.OIDCMappingFieldPreferredLoginName + case internal_domain.OIDCMappingFieldUnspecified: + fallthrough + default: + return domain.OIDCMappingFieldUnspecified + } +} + +func (p *relationalTablesProjection) reduceOIDCIDPAdded(event eventstore.Event) (*handler.Statement, error) { + var orgId *string + var idpEvent idp.OIDCIDPAddedEvent + switch e := event.(type) { + case *org.OIDCIDPAddedEvent: + idpEvent = e.OIDCIDPAddedEvent + orgId = &idpEvent.Aggregate().ResourceOwner + case *instance.OIDCIDPAddedEvent: + idpEvent = e.OIDCIDPAddedEvent + default: + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Ys02m1", "reduce.wrong.event.type %v", []eventstore.EventType{org.OIDCIDPAddedEventType, instance.OIDCIDPAddedEventType}) + } + + payloadJSON, err := json.Marshal(idpEvent) + if err != nil { + return nil, err + } + + return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInvalidArgumentf(nil, "HANDL-C9ju3", "reduce.wrong.db.pool %T", ex) + } + + repo := repository.IDProviderRepository() + return repo.Create(ctx, v3_sql.SQLTx(tx), &domain.IdentityProvider{ + InstanceID: idpEvent.Aggregate().InstanceID, + OrgID: orgId, + ID: idpEvent.ID, + State: domain.IDPStateActive, + Name: idpEvent.Name, + Type: gu.Ptr(domain.IDPTypeOIDC), + AllowCreation: idpEvent.IsCreationAllowed, + AllowAutoCreation: idpEvent.IsAutoCreation, + AllowAutoUpdate: idpEvent.IsAutoUpdate, + AllowLinking: idpEvent.IsLinkingAllowed, + AutoLinkingField: mapAutoLinkingField(idpEvent.AutoLinkingOption), + Payload: payloadJSON, + CreatedAt: event.CreatedAt(), + UpdatedAt: event.CreatedAt(), + }) + }), nil +} + +func (p *relationalTablesProjection) reduceOIDCIDPChanged(event eventstore.Event) (*handler.Statement, error) { + var orgId *string + var idpEvent idp.OIDCIDPChangedEvent + switch e := event.(type) { + case *org.OIDCIDPChangedEvent: + idpEvent = e.OIDCIDPChangedEvent + orgId = &idpEvent.Aggregate().ResourceOwner + case *instance.OIDCIDPChangedEvent: + idpEvent = e.OIDCIDPChangedEvent + default: + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Y1K82ks", "reduce.wrong.event.type %v", []eventstore.EventType{org.OIDCIDPChangedEventType, instance.OIDCIDPChangedEventType}) + } + + return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInternal(nil, "HANDL-L8CQt", "unable to cast to tx executer") + } + idpRepo := repository.IDProviderRepository() + oidc, err := idpRepo.GetOIDC(ctx, v3_sql.SQLTx(tx), database.WithCondition(idpScopedCondition(idpRepo, idpEvent.Agg.InstanceID, idpEvent.ID, orgId))) + if err != nil { + return err + } + + changes := p.reduceIDPChangedTemplateColumns(idpRepo, idpEvent.Name, idpEvent.OptionChanges) + + payload := &oidc.OIDC + payloadChanged := p.reduceOIDCIDPChangedColumns(payload, &idpEvent) + if payloadChanged { + payloadJSON, err := json.Marshal(payload) + if err != nil { + return err + } + changes = append(changes, idpRepo.SetPayload(string(payloadJSON))) + } + + changes = append(changes, idpRepo.SetUpdatedAt(gu.Ptr(event.CreatedAt()))) + _, err = idpRepo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(idpRepo, idpEvent.Aggregate().InstanceID, idpEvent.ID, orgId), changes...) + return err + }), nil +} + +func (p *relationalTablesProjection) reduceOIDCIDPChangedColumns(payload *domain.OIDC, idpEvent *idp.OIDCIDPChangedEvent) bool { + payloadChanged := false + if payload == nil || idpEvent == nil { + return payloadChanged + } + + if idpEvent.ClientID != nil && *idpEvent.ClientID != payload.ClientID { + payloadChanged = true + payload.ClientID = *idpEvent.ClientID + } + if idpEvent.ClientSecret != nil { + payloadChanged = true + payload.ClientSecret = idpEvent.ClientSecret + } + if idpEvent.Issuer != nil && *idpEvent.Issuer != payload.Issuer { + payloadChanged = true + payload.Issuer = *idpEvent.Issuer + } + if idpEvent.Scopes != nil && !slices.Equal(idpEvent.Scopes, payload.Scopes) { + payloadChanged = true + payload.Scopes = idpEvent.Scopes + } + if idpEvent.IsIDTokenMapping != nil && *idpEvent.IsIDTokenMapping != payload.IsIDTokenMapping { + payloadChanged = true + payload.IsIDTokenMapping = *idpEvent.IsIDTokenMapping + } + if idpEvent.UsePKCE != nil && *idpEvent.UsePKCE != payload.UsePKCE { + payloadChanged = true + payload.UsePKCE = *idpEvent.UsePKCE + } + return payloadChanged +} diff --git a/internal/query/projection/idp_relational.go b/internal/query/projection/idp_relational.go new file mode 100644 index 000000000..407281fdf --- /dev/null +++ b/internal/query/projection/idp_relational.go @@ -0,0 +1,246 @@ +package projection + +import ( + "context" + "database/sql" + + "github.com/muhlemmer/gu" + + "github.com/zitadel/zitadel/backend/v3/domain" + "github.com/zitadel/zitadel/backend/v3/storage/database" + v3_sql "github.com/zitadel/zitadel/backend/v3/storage/database/dialect/sql" + "github.com/zitadel/zitadel/backend/v3/storage/database/repository" + internal_domain "github.com/zitadel/zitadel/internal/domain" + "github.com/zitadel/zitadel/internal/eventstore" + "github.com/zitadel/zitadel/internal/eventstore/handler/v2" + "github.com/zitadel/zitadel/internal/repository/idp" + "github.com/zitadel/zitadel/internal/repository/idpconfig" + "github.com/zitadel/zitadel/internal/repository/instance" + "github.com/zitadel/zitadel/internal/repository/org" + "github.com/zitadel/zitadel/internal/zerrors" +) + +func (p *relationalTablesProjection) reduceIDPAdded(event eventstore.Event) (*handler.Statement, error) { + var orgId *string + var idpEvent idpconfig.IDPConfigAddedEvent + switch e := event.(type) { + case *org.IDPConfigAddedEvent: + idpEvent = e.IDPConfigAddedEvent + orgId = &idpEvent.Aggregate().ResourceOwner + case *instance.IDPConfigAddedEvent: + idpEvent = e.IDPConfigAddedEvent + default: + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-YcUdQ", "reduce.wrong.event.type %v", []eventstore.EventType{org.IDPConfigAddedEventType, instance.IDPConfigAddedEventType}) + } + + return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) + } + repo := repository.IDProviderRepository() + return repo.Create(ctx, v3_sql.SQLTx(tx), &domain.IdentityProvider{ + InstanceID: event.Aggregate().InstanceID, + OrgID: orgId, + ID: idpEvent.ConfigID, + State: domain.IDPStateActive, + Name: idpEvent.Name, + Type: mapIDPConfigType(idpEvent.Typ), + AllowAutoCreation: idpEvent.AutoRegister, + AllowLinking: true, + AllowCreation: true, + CreatedAt: event.CreatedAt(), + UpdatedAt: event.CreatedAt(), + }) + + }), nil +} + +func mapIDPConfigType(typ internal_domain.IDPConfigType) *domain.IDPType { + switch typ { + case internal_domain.IDPConfigTypeOIDC: + return gu.Ptr(domain.IDPTypeOIDC) + case internal_domain.IDPConfigTypeSAML: + return gu.Ptr(domain.IDPTypeSAML) + case internal_domain.IDPConfigTypeJWT: + return gu.Ptr(domain.IDPTypeJWT) + case internal_domain.IDPConfigTypeUnspecified: + fallthrough + default: + return nil + } +} + +func mapAutoLinkingField(option internal_domain.AutoLinkingOption) *domain.IDPAutoLinkingField { + if option == internal_domain.AutoLinkingOptionUnspecified { + return nil + } + switch option { + case internal_domain.AutoLinkingOptionEmail: + return gu.Ptr(domain.IDPAutoLinkingFieldEmail) + case internal_domain.AutoLinkingOptionUsername: + return gu.Ptr(domain.IDPAutoLinkingFieldUsername) + case internal_domain.AutoLinkingOptionUnspecified: + fallthrough + default: + return nil + } +} + +func idpScopedCondition(repo domain.IDProviderRepository, instanceID, id string, orgID *string) database.Condition { + return database.And( + repo.PrimaryKeyCondition(instanceID, id), + repo.OrgIDCondition(orgID), + ) +} + +func (p *relationalTablesProjection) reduceIDPChanged(event eventstore.Event) (*handler.Statement, error) { + var orgID *string + var idpEvent idpconfig.IDPConfigChangedEvent + switch e := event.(type) { + case *org.IDPConfigChangedEvent: + idpEvent = e.IDPConfigChangedEvent + orgID = gu.Ptr(idpEvent.Aggregate().ResourceOwner) + case *instance.IDPConfigChangedEvent: + idpEvent = e.IDPConfigChangedEvent + default: + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-YVvJD", "reduce.wrong.event.type %v", []eventstore.EventType{org.IDPConfigChangedEventType, instance.IDPConfigChangedEventType}) + } + + repo := repository.IDProviderRepository() + + changes := make(database.Changes, 0, 3) + if idpEvent.Name != nil { + changes = append(changes, repo.SetName(*idpEvent.Name)) + } + if idpEvent.AutoRegister != nil { + changes = append(changes, repo.SetAllowAutoCreation(*idpEvent.AutoRegister)) + } + if len(changes) == 0 { + return handler.NewNoOpStatement(&idpEvent), nil + } + changes = append(changes, repo.SetUpdatedAt(gu.Ptr(event.CreatedAt()))) + + return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInvalidArgumentf(nil, "HANDL-9sX8h", "reduce.wrong.db.pool %T", ex) + } + + _, err := repo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(repo, event.Aggregate().InstanceID, idpEvent.ConfigID, orgID), changes...) + return err + }), nil +} + +func (p *relationalTablesProjection) reduceIDPDeactivated(event eventstore.Event) (*handler.Statement, error) { + var orgID *string + var idpEvent idpconfig.IDPConfigDeactivatedEvent + switch e := event.(type) { + case *org.IDPConfigDeactivatedEvent: + idpEvent = e.IDPConfigDeactivatedEvent + orgID = gu.Ptr(idpEvent.Aggregate().ResourceOwner) + case *instance.IDPConfigDeactivatedEvent: + idpEvent = e.IDPConfigDeactivatedEvent + default: + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Y4O5l", "reduce.wrong.event.type %v", []eventstore.EventType{org.IDPConfigDeactivatedEventType, instance.IDPConfigDeactivatedEventType}) + } + + return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInvalidArgumentf(nil, "HANDL-9sX8h", "reduce.wrong.db.pool %T", ex) + } + + repo := repository.IDProviderRepository() + + _, err := repo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(repo, event.Aggregate().InstanceID, idpEvent.ConfigID, orgID), + repo.SetState(domain.IDPStateInactive), + repo.SetUpdatedAt(gu.Ptr(event.CreatedAt())), + ) + return err + }), nil +} + +func (p *relationalTablesProjection) reduceIDPReactivated(event eventstore.Event) (*handler.Statement, error) { + var orgID *string + var idpEvent idpconfig.IDPConfigReactivatedEvent + switch e := event.(type) { + case *org.IDPConfigReactivatedEvent: + idpEvent = e.IDPConfigReactivatedEvent + orgID = gu.Ptr(idpEvent.Aggregate().ResourceOwner) + case *instance.IDPConfigReactivatedEvent: + idpEvent = e.IDPConfigReactivatedEvent + default: + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Y8QyS", "reduce.wrong.event.type %v", []eventstore.EventType{org.IDPConfigReactivatedEventType, instance.IDPConfigReactivatedEventType}) + } + + return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInvalidArgumentf(nil, "HANDL-2Db9P", "reduce.wrong.db.pool %T", ex) + } + + repo := repository.IDProviderRepository() + _, err := repo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(repo, idpEvent.Aggregate().InstanceID, idpEvent.ConfigID, orgID), + repo.SetState(domain.IDPStateActive), + repo.SetUpdatedAt(gu.Ptr(event.CreatedAt())), + ) + return err + }), nil +} + +func (p *relationalTablesProjection) reduceIDPRemoved(event eventstore.Event) (*handler.Statement, error) { + var ( + orgID *string + idpID string + ) + switch e := event.(type) { + case *org.IDPRemovedEvent: + idpID = e.ID + orgID = gu.Ptr(e.RemovedEvent.Aggregate().ResourceOwner) + case *instance.IDPRemovedEvent: + idpID = e.ID + case *org.IDPConfigRemovedEvent: + idpID = e.ConfigID + orgID = gu.Ptr(e.IDPConfigRemovedEvent.Aggregate().ResourceOwner) + case *instance.IDPConfigRemovedEvent: + idpID = e.ConfigID + default: + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Ybcvwin2", "reduce.wrong.event.type %v", []eventstore.EventType{org.IDPRemovedEventType, instance.IDPRemovedEventType, org.IDPConfigRemovedEventType, instance.IDPConfigRemovedEventType}) + } + + return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInvalidArgumentf(nil, "HANDL-PSj7F", "reduce.wrong.db.pool %T", ex) + } + + repo := repository.IDProviderRepository() + _, err := repo.Delete(ctx, v3_sql.SQLTx(tx), idpScopedCondition(repo, event.Aggregate().InstanceID, idpID, orgID)) + return err + }), nil +} + +func (p *relationalTablesProjection) reduceIDPChangedTemplateColumns(repo domain.IDProviderRepository, name *string, optionChanges idp.OptionChanges) database.Changes { + changes := make(database.Changes, 0, 8) + if name != nil { + changes = append(changes, repo.SetName(*name)) + } + if optionChanges.IsCreationAllowed != nil { + changes = append(changes, repo.SetAllowCreation(*optionChanges.IsCreationAllowed)) + } + if optionChanges.IsLinkingAllowed != nil { + changes = append(changes, repo.SetAllowLinking(*optionChanges.IsLinkingAllowed)) + } + if optionChanges.IsAutoCreation != nil { + changes = append(changes, repo.SetAllowAutoCreation(*optionChanges.IsAutoCreation)) + } + if optionChanges.IsAutoUpdate != nil { + changes = append(changes, repo.SetAllowAutoUpdate(*optionChanges.IsAutoUpdate)) + } + if optionChanges.AutoLinkingOption != nil { + changes = append(changes, repo.SetAutoLinkingField(mapAutoLinkingField(*optionChanges.AutoLinkingOption))) + } + + return changes +} diff --git a/internal/query/projection/idp_saml_relational.go b/internal/query/projection/idp_saml_relational.go new file mode 100644 index 000000000..ac79f5142 --- /dev/null +++ b/internal/query/projection/idp_saml_relational.go @@ -0,0 +1,164 @@ +package projection + +import ( + "context" + "database/sql" + "encoding/json" + "slices" + + "github.com/muhlemmer/gu" + + "github.com/zitadel/zitadel/backend/v3/domain" + "github.com/zitadel/zitadel/backend/v3/storage/database" + v3_sql "github.com/zitadel/zitadel/backend/v3/storage/database/dialect/sql" + "github.com/zitadel/zitadel/backend/v3/storage/database/repository" + "github.com/zitadel/zitadel/internal/eventstore" + "github.com/zitadel/zitadel/internal/eventstore/handler/v2" + "github.com/zitadel/zitadel/internal/repository/idp" + "github.com/zitadel/zitadel/internal/repository/instance" + "github.com/zitadel/zitadel/internal/repository/org" + "github.com/zitadel/zitadel/internal/zerrors" +) + +func (p *relationalTablesProjection) reduceSAMLIDPAdded(event eventstore.Event) (*handler.Statement, error) { + var orgId *string + var idpEvent idp.SAMLIDPAddedEvent + switch e := event.(type) { + case *org.SAMLIDPAddedEvent: + idpEvent = e.SAMLIDPAddedEvent + orgId = &idpEvent.Aggregate().ResourceOwner + case *instance.SAMLIDPAddedEvent: + idpEvent = e.SAMLIDPAddedEvent + default: + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Ys02m1", "reduce.wrong.event.type %v", []eventstore.EventType{org.SAMLIDPAddedEventType, instance.SAMLIDPAddedEventType}) + } + + saml := domain.SAML{ + Metadata: idpEvent.Metadata, + Key: idpEvent.Key, + Certificate: idpEvent.Certificate, + Binding: idpEvent.Binding, + WithSignedRequest: idpEvent.WithSignedRequest, + NameIDFormat: idpEvent.NameIDFormat, + TransientMappingAttributeName: idpEvent.TransientMappingAttributeName, + SignatureAlgorithm: idpEvent.SignatureAlgorithm, + } + + payloadJSON, err := json.Marshal(saml) + if err != nil { + return nil, err + } + + return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInvalidArgumentf(nil, "HANDL-ksJ3N", "reduce.wrong.db.pool %T", ex) + } + + repo := repository.IDProviderRepository() + return repo.Create(ctx, v3_sql.SQLTx(tx), &domain.IdentityProvider{ + InstanceID: idpEvent.Aggregate().InstanceID, + OrgID: orgId, + ID: idpEvent.ID, + State: domain.IDPStateActive, + Name: idpEvent.Name, + Type: gu.Ptr(domain.IDPTypeSAML), + AllowCreation: idpEvent.IsCreationAllowed, + AllowAutoCreation: idpEvent.IsAutoCreation, + AllowAutoUpdate: idpEvent.IsAutoUpdate, + AllowLinking: idpEvent.IsLinkingAllowed, + AutoLinkingField: mapAutoLinkingField(idpEvent.AutoLinkingOption), + Payload: payloadJSON, + CreatedAt: event.CreatedAt(), + UpdatedAt: event.CreatedAt(), + }) + }), nil +} + +func (p *relationalTablesProjection) reduceSAMLIDPChanged(event eventstore.Event) (*handler.Statement, error) { + var orgId *string + var idpEvent idp.SAMLIDPChangedEvent + switch e := event.(type) { + case *org.SAMLIDPChangedEvent: + idpEvent = e.SAMLIDPChangedEvent + orgId = &idpEvent.Aggregate().ResourceOwner + case *instance.SAMLIDPChangedEvent: + idpEvent = e.SAMLIDPChangedEvent + default: + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Y7c0fii4ad", "reduce.wrong.event.type %v", []eventstore.EventType{org.SAMLIDPChangedEventType, instance.SAMLIDPChangedEventType}) + } + + return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInternal(nil, "HANDL-HX6ed", "unable to cast to tx executer") + } + idpRepo := repository.IDProviderRepository() + saml, err := idpRepo.GetSAML(ctx, v3_sql.SQLTx(tx), database.WithCondition(idpScopedCondition(idpRepo, idpEvent.Agg.InstanceID, idpEvent.ID, orgId))) + if err != nil { + return err + } + + changes := p.reduceIDPChangedTemplateColumns(idpRepo, idpEvent.Name, idpEvent.OptionChanges) + + payload := &saml.SAML + payloadChanged := p.reduceSAMLIDPChangedColumns(payload, &idpEvent) + if payloadChanged { + payloadJSON, err := json.Marshal(payload) + if err != nil { + return err + } + changes = append(changes, idpRepo.SetPayload(string(payloadJSON))) + } + + changes = append(changes, idpRepo.SetUpdatedAt(gu.Ptr(event.CreatedAt()))) + _, err = idpRepo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(idpRepo, idpEvent.Aggregate().InstanceID, idpEvent.ID, orgId), changes...) + return err + + }), nil +} + +func (p *relationalTablesProjection) reduceSAMLIDPChangedColumns(payload *domain.SAML, idpEvent *idp.SAMLIDPChangedEvent) bool { + payloadChanged := false + if payload == nil || idpEvent == nil { + return payloadChanged + } + + if idpEvent.Metadata != nil && !slices.Equal(idpEvent.Metadata, payload.Metadata) { + payloadChanged = true + payload.Metadata = idpEvent.Metadata + } + if idpEvent.Key != nil { + payloadChanged = true + payload.Key = idpEvent.Key + } + if idpEvent.Certificate != nil && !slices.Equal(idpEvent.Certificate, payload.Certificate) { + payloadChanged = true + payload.Certificate = idpEvent.Certificate + } + if idpEvent.Binding != nil && *idpEvent.Binding != payload.Binding { + payloadChanged = true + payload.Binding = *idpEvent.Binding + } + if idpEvent.WithSignedRequest != nil && *idpEvent.WithSignedRequest != payload.WithSignedRequest { + payloadChanged = true + payload.WithSignedRequest = *idpEvent.WithSignedRequest + } + if idpEvent.NameIDFormat != nil && (payload.NameIDFormat == nil || *idpEvent.NameIDFormat != *payload.NameIDFormat) { + payloadChanged = true + payload.NameIDFormat = idpEvent.NameIDFormat + } + if idpEvent.TransientMappingAttributeName != nil && *idpEvent.TransientMappingAttributeName != payload.TransientMappingAttributeName { + payloadChanged = true + payload.TransientMappingAttributeName = *idpEvent.TransientMappingAttributeName + } + if idpEvent.FederatedLogoutEnabled != nil && *idpEvent.FederatedLogoutEnabled != payload.FederatedLogoutEnabled { + payloadChanged = true + payload.FederatedLogoutEnabled = *idpEvent.FederatedLogoutEnabled + } + if idpEvent.SignatureAlgorithm != nil && *idpEvent.SignatureAlgorithm != payload.SignatureAlgorithm { + payloadChanged = true + payload.SignatureAlgorithm = *idpEvent.SignatureAlgorithm + } + return payloadChanged +} diff --git a/internal/query/projection/idp_template_relational.go b/internal/query/projection/idp_template_relational.go deleted file mode 100644 index 92b29c0c5..000000000 --- a/internal/query/projection/idp_template_relational.go +++ /dev/null @@ -1,2451 +0,0 @@ -package projection - -import ( - "context" - "database/sql" - "encoding/json" - "slices" - - "github.com/muhlemmer/gu" - - "github.com/zitadel/zitadel/backend/v3/domain" - "github.com/zitadel/zitadel/backend/v3/storage/database" - v3_sql "github.com/zitadel/zitadel/backend/v3/storage/database/dialect/sql" - "github.com/zitadel/zitadel/backend/v3/storage/database/repository" - internal_domain "github.com/zitadel/zitadel/internal/domain" - "github.com/zitadel/zitadel/internal/eventstore" - "github.com/zitadel/zitadel/internal/eventstore/handler/v2" - "github.com/zitadel/zitadel/internal/repository/idp" - "github.com/zitadel/zitadel/internal/repository/idpconfig" - "github.com/zitadel/zitadel/internal/repository/instance" - "github.com/zitadel/zitadel/internal/repository/org" - "github.com/zitadel/zitadel/internal/zerrors" -) - -type idpTemplateRelationalProjection struct { - idpRepo domain.IDProviderRepository -} - -func newIDPTemplateRelationalProjection(ctx context.Context, config handler.Config) *handler.Handler { - idpRepo := repository.IDProviderRepository() - return handler.NewHandler(ctx, &config, &idpTemplateRelationalProjection{ - idpRepo: idpRepo, - }) -} - -func (*idpTemplateRelationalProjection) Name() string { - return "zitadel.identity_providers" -} - -func (p *idpTemplateRelationalProjection) Reducers() []handler.AggregateReducer { - return []handler.AggregateReducer{ - { - Aggregate: instance.AggregateType, - EventReducers: []handler.EventReducer{ - { - Event: instance.IDPConfigAddedEventType, - Reduce: p.reduceIDPAdded, - }, - { - Event: instance.IDPConfigChangedEventType, - Reduce: p.reduceIDPChanged, - }, - { - Event: instance.IDPConfigDeactivatedEventType, - Reduce: p.reduceIDPDeactivated, - }, - { - Event: instance.IDPConfigReactivatedEventType, - Reduce: p.reduceIDPReactivated, - }, - { - Event: instance.IDPConfigRemovedEventType, - Reduce: p.reduceIDPRemoved, - }, - { - Event: instance.IDPOIDCConfigAddedEventType, - Reduce: p.reduceOIDCConfigAdded, - }, - { - Event: instance.IDPOIDCConfigChangedEventType, - Reduce: p.reduceOIDCConfigChanged, - }, - { - Event: instance.IDPJWTConfigAddedEventType, - Reduce: p.reduceJWTConfigAdded, - }, - { - Event: instance.IDPJWTConfigChangedEventType, - Reduce: p.reduceJWTConfigChanged, - }, - { - Event: instance.OAuthIDPAddedEventType, - Reduce: p.reduceOAuthIDPAdded, - }, - { - Event: instance.OAuthIDPChangedEventType, - Reduce: p.reduceOAuthIDPChanged, - }, - { - Event: instance.OIDCIDPAddedEventType, - Reduce: p.reduceOIDCIDPAdded, - }, - { - Event: instance.OIDCIDPChangedEventType, - Reduce: p.reduceOIDCIDPChanged, - }, - { - Event: instance.OIDCIDPMigratedAzureADEventType, - Reduce: p.reduceOIDCIDPMigratedAzureAD, - }, - { - Event: instance.OIDCIDPMigratedGoogleEventType, - Reduce: p.reduceOIDCIDPMigratedGoogle, - }, - { - Event: instance.JWTIDPAddedEventType, - Reduce: p.reduceJWTIDPAdded, - }, - { - Event: instance.JWTIDPChangedEventType, - Reduce: p.reduceJWTIDPChanged, - }, - { - Event: instance.AzureADIDPAddedEventType, - Reduce: p.reduceAzureADIDPAdded, - }, - { - Event: instance.AzureADIDPChangedEventType, - Reduce: p.reduceAzureADIDPChanged, - }, - { - Event: instance.GitHubIDPAddedEventType, - Reduce: p.reduceGitHubIDPAdded, - }, - { - Event: instance.GitHubIDPChangedEventType, - Reduce: p.reduceGitHubIDPChanged, - }, - { - Event: instance.GitHubEnterpriseIDPAddedEventType, - Reduce: p.reduceGitHubEnterpriseIDPAdded, - }, - { - Event: instance.GitHubEnterpriseIDPChangedEventType, - Reduce: p.reduceGitHubEnterpriseIDPChanged, - }, - { - Event: instance.GitLabIDPAddedEventType, - Reduce: p.reduceGitLabIDPAdded, - }, - { - Event: instance.GitLabIDPChangedEventType, - Reduce: p.reduceGitLabIDPChanged, - }, - { - Event: instance.GitLabSelfHostedIDPAddedEventType, - Reduce: p.reduceGitLabSelfHostedIDPAdded, - }, - { - Event: instance.GitLabSelfHostedIDPChangedEventType, - Reduce: p.reduceGitLabSelfHostedIDPChanged, - }, - { - Event: instance.GoogleIDPAddedEventType, - Reduce: p.reduceGoogleIDPAdded, - }, - { - Event: instance.GoogleIDPChangedEventType, - Reduce: p.reduceGoogleIDPChanged, - }, - { - Event: instance.LDAPIDPAddedEventType, - Reduce: p.reduceLDAPIDPAdded, - }, - { - Event: instance.LDAPIDPChangedEventType, - Reduce: p.reduceLDAPIDPChanged, - }, - { - Event: instance.AppleIDPAddedEventType, - Reduce: p.reduceAppleIDPAdded, - }, - { - Event: instance.AppleIDPChangedEventType, - Reduce: p.reduceAppleIDPChanged, - }, - { - Event: instance.SAMLIDPAddedEventType, - Reduce: p.reduceSAMLIDPAdded, - }, - { - Event: instance.SAMLIDPChangedEventType, - Reduce: p.reduceSAMLIDPChanged, - }, - { - Event: instance.IDPRemovedEventType, - Reduce: p.reduceIDPRemoved, - }, - }, - }, - { - Aggregate: org.AggregateType, - EventReducers: []handler.EventReducer{ - { - Event: org.IDPConfigAddedEventType, - Reduce: p.reduceIDPAdded, - }, - { - Event: org.IDPConfigChangedEventType, - Reduce: p.reduceIDPChanged, - }, - { - Event: org.IDPConfigDeactivatedEventType, - Reduce: p.reduceIDPDeactivated, - }, - { - Event: org.IDPConfigReactivatedEventType, - Reduce: p.reduceIDPReactivated, - }, - { - Event: org.IDPConfigRemovedEventType, - Reduce: p.reduceIDPRemoved, - }, - { - Event: org.IDPOIDCConfigAddedEventType, - Reduce: p.reduceOIDCConfigAdded, - }, - { - Event: org.IDPOIDCConfigChangedEventType, - Reduce: p.reduceOIDCConfigChanged, - }, - { - Event: org.IDPJWTConfigAddedEventType, - Reduce: p.reduceJWTConfigAdded, - }, - { - Event: org.IDPJWTConfigChangedEventType, - Reduce: p.reduceJWTConfigChanged, - }, - { - Event: org.OAuthIDPAddedEventType, - Reduce: p.reduceOAuthIDPAdded, - }, - { - Event: org.OAuthIDPChangedEventType, - Reduce: p.reduceOAuthIDPChanged, - }, - { - Event: org.OIDCIDPAddedEventType, - Reduce: p.reduceOIDCIDPAdded, - }, - { - Event: org.OIDCIDPChangedEventType, - Reduce: p.reduceOIDCIDPChanged, - }, - { - Event: org.OIDCIDPMigratedAzureADEventType, - Reduce: p.reduceOIDCIDPMigratedAzureAD, - }, - { - Event: org.OIDCIDPMigratedGoogleEventType, - Reduce: p.reduceOIDCIDPMigratedGoogle, - }, - { - Event: org.JWTIDPAddedEventType, - Reduce: p.reduceJWTIDPAdded, - }, - { - Event: org.JWTIDPChangedEventType, - Reduce: p.reduceJWTIDPChanged, - }, - { - Event: org.AzureADIDPAddedEventType, - Reduce: p.reduceAzureADIDPAdded, - }, - { - Event: org.AzureADIDPChangedEventType, - Reduce: p.reduceAzureADIDPChanged, - }, - { - Event: org.GitHubIDPAddedEventType, - Reduce: p.reduceGitHubIDPAdded, - }, - { - Event: org.GitHubIDPChangedEventType, - Reduce: p.reduceGitHubIDPChanged, - }, - { - Event: org.GitHubEnterpriseIDPAddedEventType, - Reduce: p.reduceGitHubEnterpriseIDPAdded, - }, - { - Event: org.GitHubEnterpriseIDPChangedEventType, - Reduce: p.reduceGitHubEnterpriseIDPChanged, - }, - { - Event: org.GitLabIDPAddedEventType, - Reduce: p.reduceGitLabIDPAdded, - }, - { - Event: org.GitLabIDPChangedEventType, - Reduce: p.reduceGitLabIDPChanged, - }, - { - Event: org.GitLabSelfHostedIDPAddedEventType, - Reduce: p.reduceGitLabSelfHostedIDPAdded, - }, - { - Event: org.GitLabSelfHostedIDPChangedEventType, - Reduce: p.reduceGitLabSelfHostedIDPChanged, - }, - { - Event: org.GoogleIDPAddedEventType, - Reduce: p.reduceGoogleIDPAdded, - }, - { - Event: org.GoogleIDPChangedEventType, - Reduce: p.reduceGoogleIDPChanged, - }, - { - Event: org.LDAPIDPAddedEventType, - Reduce: p.reduceLDAPIDPAdded, - }, - { - Event: org.LDAPIDPChangedEventType, - Reduce: p.reduceLDAPIDPChanged, - }, - { - Event: org.AppleIDPAddedEventType, - Reduce: p.reduceAppleIDPAdded, - }, - { - Event: org.AppleIDPChangedEventType, - Reduce: p.reduceAppleIDPChanged, - }, - { - Event: org.SAMLIDPAddedEventType, - Reduce: p.reduceSAMLIDPAdded, - }, - { - Event: org.SAMLIDPChangedEventType, - Reduce: p.reduceSAMLIDPChanged, - }, - { - Event: org.IDPRemovedEventType, - Reduce: p.reduceIDPRemoved, - }, - }, - }, - } -} - -func (p *idpTemplateRelationalProjection) reduceIDPAdded(event eventstore.Event) (*handler.Statement, error) { - var orgId *string - var idpEvent idpconfig.IDPConfigAddedEvent - switch e := event.(type) { - case *org.IDPConfigAddedEvent: - idpEvent = e.IDPConfigAddedEvent - orgId = &idpEvent.Aggregate().ResourceOwner - case *instance.IDPConfigAddedEvent: - idpEvent = e.IDPConfigAddedEvent - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-YcUdQ", "reduce.wrong.event.type %v", []eventstore.EventType{org.IDPConfigAddedEventType, instance.IDPConfigAddedEventType}) - } - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) - } - repo := repository.IDProviderRepository() - return repo.Create(ctx, v3_sql.SQLTx(tx), &domain.IdentityProvider{ - InstanceID: event.Aggregate().InstanceID, - OrgID: orgId, - ID: idpEvent.ConfigID, - State: domain.IDPStateActive, - Name: idpEvent.Name, - Type: mapIDPConfigType(idpEvent.Typ), - AllowAutoCreation: idpEvent.AutoRegister, - AllowLinking: true, - AllowCreation: true, - CreatedAt: event.CreatedAt(), - UpdatedAt: event.CreatedAt(), - }) - - }), nil -} - -func mapIDPConfigType(typ internal_domain.IDPConfigType) *domain.IDPType { - switch typ { - case internal_domain.IDPConfigTypeOIDC: - return gu.Ptr(domain.IDPTypeOIDC) - case internal_domain.IDPConfigTypeSAML: - return gu.Ptr(domain.IDPTypeSAML) - case internal_domain.IDPConfigTypeJWT: - return gu.Ptr(domain.IDPTypeJWT) - case internal_domain.IDPConfigTypeUnspecified: - fallthrough - default: - return nil - } -} - -func mapAutoLinkingField(option internal_domain.AutoLinkingOption) *domain.IDPAutoLinkingField { - switch option { - case internal_domain.AutoLinkingOptionEmail: - return gu.Ptr(domain.IDPAutoLinkingFieldEmail) - case internal_domain.AutoLinkingOptionUsername: - return gu.Ptr(domain.IDPAutoLinkingFieldUsername) - case internal_domain.AutoLinkingOptionUnspecified: - fallthrough - default: - return nil - } -} - -func idpScopedCondition(repo domain.IDProviderRepository, instanceID, id string, orgID *string) database.Condition { - return database.And( - repo.PrimaryKeyCondition(instanceID, id), - repo.OrgIDCondition(orgID), - ) -} - -func (p *idpTemplateRelationalProjection) reduceIDPChanged(event eventstore.Event) (*handler.Statement, error) { - var orgID *string - var idpEvent idpconfig.IDPConfigChangedEvent - switch e := event.(type) { - case *org.IDPConfigChangedEvent: - idpEvent = e.IDPConfigChangedEvent - orgID = gu.Ptr(idpEvent.Aggregate().ResourceOwner) - case *instance.IDPConfigChangedEvent: - idpEvent = e.IDPConfigChangedEvent - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-YVvJD", "reduce.wrong.event.type %v", []eventstore.EventType{org.IDPConfigChangedEventType, instance.IDPConfigChangedEventType}) - } - - repo := repository.IDProviderRepository() - - changes := make(database.Changes, 0, 3) - if idpEvent.Name != nil { - changes = append(changes, repo.SetName(*idpEvent.Name)) - } - if idpEvent.AutoRegister != nil { - changes = append(changes, repo.SetAllowAutoCreation(*idpEvent.AutoRegister)) - } - if len(changes) == 0 { - return handler.NewNoOpStatement(&idpEvent), nil - } - changes = append(changes, repo.SetUpdatedAt(gu.Ptr(event.CreatedAt()))) - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInvalidArgumentf(nil, "HANDL-9sX8h", "reduce.wrong.db.pool %T", ex) - } - - _, err := repo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(repo, event.Aggregate().InstanceID, idpEvent.ConfigID, orgID), changes...) - return err - }), nil -} - -func (p *idpTemplateRelationalProjection) reduceIDPDeactivated(event eventstore.Event) (*handler.Statement, error) { - var orgID *string - var idpEvent idpconfig.IDPConfigDeactivatedEvent - switch e := event.(type) { - case *org.IDPConfigDeactivatedEvent: - idpEvent = e.IDPConfigDeactivatedEvent - orgID = gu.Ptr(idpEvent.Aggregate().ResourceOwner) - case *instance.IDPConfigDeactivatedEvent: - idpEvent = e.IDPConfigDeactivatedEvent - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Y4O5l", "reduce.wrong.event.type %v", []eventstore.EventType{org.IDPConfigDeactivatedEventType, instance.IDPConfigDeactivatedEventType}) - } - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInvalidArgumentf(nil, "HANDL-9sX8h", "reduce.wrong.db.pool %T", ex) - } - - repo := repository.IDProviderRepository() - - _, err := repo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(repo, event.Aggregate().InstanceID, idpEvent.ConfigID, orgID), - repo.SetState(domain.IDPStateInactive), - repo.SetUpdatedAt(gu.Ptr(event.CreatedAt())), - ) - return err - }), nil -} - -func (p *idpTemplateRelationalProjection) reduceIDPReactivated(event eventstore.Event) (*handler.Statement, error) { - var orgID *string - var idpEvent idpconfig.IDPConfigReactivatedEvent - switch e := event.(type) { - case *org.IDPConfigReactivatedEvent: - idpEvent = e.IDPConfigReactivatedEvent - orgID = gu.Ptr(idpEvent.Aggregate().ResourceOwner) - case *instance.IDPConfigReactivatedEvent: - idpEvent = e.IDPConfigReactivatedEvent - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Y8QyS", "reduce.wrong.event.type %v", []eventstore.EventType{org.IDPConfigReactivatedEventType, instance.IDPConfigReactivatedEventType}) - } - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInvalidArgumentf(nil, "HANDL-2Db9P", "reduce.wrong.db.pool %T", ex) - } - - repo := repository.IDProviderRepository() - _, err := repo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(repo, idpEvent.Aggregate().InstanceID, idpEvent.ConfigID, orgID), - repo.SetState(domain.IDPStateActive), - repo.SetUpdatedAt(gu.Ptr(event.CreatedAt())), - ) - return err - }), nil -} - -func (p *idpTemplateRelationalProjection) reduceIDPRemoved(event eventstore.Event) (*handler.Statement, error) { - var ( - orgID *string - idpID string - ) - switch e := event.(type) { - case *org.IDPRemovedEvent: - idpID = e.ID - orgID = gu.Ptr(e.RemovedEvent.Aggregate().ResourceOwner) - case *instance.IDPRemovedEvent: - idpID = e.ID - case *org.IDPConfigRemovedEvent: - idpID = e.ConfigID - orgID = gu.Ptr(e.IDPConfigRemovedEvent.Aggregate().ResourceOwner) - case *instance.IDPConfigRemovedEvent: - idpID = e.ConfigID - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Ybcvwin2", "reduce.wrong.event.type %v", []eventstore.EventType{org.IDPRemovedEventType, instance.IDPRemovedEventType, org.IDPConfigRemovedEventType, instance.IDPConfigRemovedEventType}) - } - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInvalidArgumentf(nil, "HANDL-PSj7F", "reduce.wrong.db.pool %T", ex) - } - - repo := repository.IDProviderRepository() - _, err := repo.Delete(ctx, v3_sql.SQLTx(tx), idpScopedCondition(repo, event.Aggregate().InstanceID, idpID, orgID)) - return err - }), nil -} - -func (p *idpTemplateRelationalProjection) reduceOIDCConfigAdded(event eventstore.Event) (*handler.Statement, error) { - var orgID *string - var idpEvent idpconfig.OIDCConfigAddedEvent - switch e := event.(type) { - case *org.IDPOIDCConfigAddedEvent: - idpEvent = e.OIDCConfigAddedEvent - orgID = gu.Ptr(idpEvent.Aggregate().ResourceOwner) - case *instance.IDPOIDCConfigAddedEvent: - idpEvent = e.OIDCConfigAddedEvent - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-YFuAA", "reduce.wrong.event.type %v", []eventstore.EventType{org.IDPOIDCConfigAddedEventType, instance.IDPOIDCConfigAddedEventType}) - } - - payloadJSON, err := json.Marshal(idpEvent) - if err != nil { - return nil, err - } - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInvalidArgumentf(nil, "HANDL-5cvzY", "reduce.wrong.db.pool %T", ex) - } - - repo := repository.IDProviderRepository() - _, err = repo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(repo, idpEvent.Aggregate().InstanceID, idpEvent.IDPConfigID, orgID), - repo.SetPayload(string(payloadJSON)), - repo.SetType(domain.IDPTypeOIDC), - repo.SetUpdatedAt(gu.Ptr(event.CreatedAt())), - ) - return err - }), nil -} - -func (p *idpTemplateRelationalProjection) reduceOIDCConfigChanged(event eventstore.Event) (*handler.Statement, error) { - var orgId *string - var idpEvent idpconfig.OIDCConfigChangedEvent - switch e := event.(type) { - case *org.IDPOIDCConfigChangedEvent: - idpEvent = e.OIDCConfigChangedEvent - orgId = &idpEvent.Aggregate().ResourceOwner - case *instance.IDPOIDCConfigChangedEvent: - idpEvent = e.OIDCConfigChangedEvent - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Y2IVI", "reduce.wrong.event.type %v", []eventstore.EventType{org.IDPOIDCConfigChangedEventType, instance.IDPOIDCConfigChangedEventType}) - } - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInternal(nil, "HANDL-sh6Lp", "unable to cast to tx executer") - } - - idpRepo := repository.IDProviderRepository() - oidc, err := idpRepo.GetOIDC(ctx, v3_sql.SQLTx(tx), database.WithCondition(idpScopedCondition(idpRepo, idpEvent.Agg.InstanceID, idpEvent.IDPConfigID, orgId))) - if err != nil { - return err - } - - if idpEvent.ClientID != nil && *idpEvent.ClientID != oidc.ClientID { - oidc.ClientID = *idpEvent.ClientID - } - if idpEvent.ClientSecret != nil { - oidc.ClientSecret = idpEvent.ClientSecret - } - if idpEvent.Issuer != nil && *idpEvent.Issuer != oidc.Issuer { - oidc.Issuer = *idpEvent.Issuer - } - if idpEvent.AuthorizationEndpoint != nil && *idpEvent.AuthorizationEndpoint != oidc.AuthorizationEndpoint { - oidc.AuthorizationEndpoint = *idpEvent.AuthorizationEndpoint - } - if idpEvent.TokenEndpoint != nil && *idpEvent.TokenEndpoint != oidc.TokenEndpoint { - oidc.TokenEndpoint = *idpEvent.TokenEndpoint - } - if idpEvent.Scopes != nil && !slices.Equal(idpEvent.Scopes, oidc.Scopes) { - oidc.Scopes = idpEvent.Scopes - } - if idpEvent.IDPDisplayNameMapping != nil { - oidc.IDPDisplayNameMapping = mapOIDCMappingField(*idpEvent.IDPDisplayNameMapping) - } - if idpEvent.UserNameMapping != nil { - oidc.UserNameMapping = mapOIDCMappingField(*idpEvent.UserNameMapping) - } - - payloadJSON, err := json.Marshal(oidc.OIDC) - if err != nil { - return err - } - - _, err = idpRepo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(idpRepo, idpEvent.Aggregate().InstanceID, idpEvent.IDPConfigID, orgId), - idpRepo.SetPayload(string(payloadJSON)), - idpRepo.SetType(domain.IDPTypeOIDC), - idpRepo.SetUpdatedAt(gu.Ptr(event.CreatedAt())), - ) - return err - }), nil -} - -func mapOIDCMappingField(field internal_domain.OIDCMappingField) domain.OIDCMappingField { - switch field { - case internal_domain.OIDCMappingFieldEmail: - return domain.OIDCMappingFieldEmail - case internal_domain.OIDCMappingFieldPreferredLoginName: - return domain.OIDCMappingFieldPreferredLoginName - case internal_domain.OIDCMappingFieldUnspecified: - fallthrough - default: - return domain.OIDCMappingFieldUnspecified - } -} - -func (p *idpTemplateRelationalProjection) reduceJWTConfigAdded(event eventstore.Event) (*handler.Statement, error) { - var orgID *string - var idpEvent idpconfig.JWTConfigAddedEvent - switch e := event.(type) { - case *org.IDPJWTConfigAddedEvent: - idpEvent = e.JWTConfigAddedEvent - orgID = gu.Ptr(idpEvent.Aggregate().ResourceOwner) - case *instance.IDPJWTConfigAddedEvent: - idpEvent = e.JWTConfigAddedEvent - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-YvPdb", "reduce.wrong.event.type %v", []eventstore.EventType{org.IDPJWTConfigAddedEventType, instance.IDPJWTConfigAddedEventType}) - } - - payloadJSON, err := json.Marshal(idpEvent) - if err != nil { - return nil, err - } - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInvalidArgumentf(nil, "HANDL-tJQ8V", "reduce.wrong.db.pool %T", ex) - } - - repo := repository.IDProviderRepository() - _, err = repo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(repo, idpEvent.Aggregate().InstanceID, idpEvent.IDPConfigID, orgID), - repo.SetPayload(string(payloadJSON)), - repo.SetType(domain.IDPTypeJWT), - repo.SetUpdatedAt(gu.Ptr(event.CreatedAt())), - ) - return err - }), nil -} - -func (p *idpTemplateRelationalProjection) reduceJWTConfigChanged(event eventstore.Event) (*handler.Statement, error) { - var orgId *string - var idpEvent idpconfig.JWTConfigChangedEvent - switch e := event.(type) { - case *org.IDPJWTConfigChangedEvent: - idpEvent = e.JWTConfigChangedEvent - orgId = &idpEvent.Aggregate().ResourceOwner - case *instance.IDPJWTConfigChangedEvent: - idpEvent = e.JWTConfigChangedEvent - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Y2IVI", "reduce.wrong.event.type %v", []eventstore.EventType{org.IDPJWTConfigChangedEventType, instance.IDPJWTConfigChangedEventType}) - } - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInternal(nil, "HANDL-sh6Lp", "unable to cast to tx executer") - } - - idpRepo := repository.IDProviderRepository() - jwt, err := idpRepo.GetJWT(ctx, v3_sql.SQLTx(tx), database.WithCondition(idpScopedCondition(idpRepo, idpEvent.Agg.InstanceID, idpEvent.IDPConfigID, orgId))) - if err != nil { - return err - } - - if idpEvent.JWTEndpoint != nil && *idpEvent.JWTEndpoint != jwt.JWTEndpoint { - jwt.JWTEndpoint = *idpEvent.JWTEndpoint - } - if idpEvent.Issuer != nil && *idpEvent.Issuer != jwt.Issuer { - jwt.Issuer = *idpEvent.Issuer - } - if idpEvent.KeysEndpoint != nil && *idpEvent.KeysEndpoint != jwt.KeysEndpoint { - jwt.KeysEndpoint = *idpEvent.KeysEndpoint - } - if idpEvent.HeaderName != nil && *idpEvent.HeaderName != jwt.HeaderName { - jwt.HeaderName = *idpEvent.HeaderName - } - - payloadJSON, err := json.Marshal(jwt.JWT) - if err != nil { - return err - } - - _, err = idpRepo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(idpRepo, idpEvent.Aggregate().InstanceID, idpEvent.IDPConfigID, orgId), - idpRepo.SetPayload(string(payloadJSON)), - idpRepo.SetType(domain.IDPTypeJWT), - idpRepo.SetUpdatedAt(gu.Ptr(event.CreatedAt())), - ) - return err - }), nil -} - -func (p *idpTemplateRelationalProjection) reduceOAuthIDPAdded(event eventstore.Event) (*handler.Statement, error) { - var orgId *string - var idpEvent idp.OAuthIDPAddedEvent - switch e := event.(type) { - case *org.OAuthIDPAddedEvent: - idpEvent = e.OAuthIDPAddedEvent - orgId = &idpEvent.Aggregate().ResourceOwner - case *instance.OAuthIDPAddedEvent: - idpEvent = e.OAuthIDPAddedEvent - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Yap9ihb", "reduce.wrong.event.type %v", []eventstore.EventType{org.OAuthIDPAddedEventType, instance.OAuthIDPAddedEventType}) - } - - oauth := domain.OAuth{ - ClientID: idpEvent.ClientID, - ClientSecret: idpEvent.ClientSecret, - AuthorizationEndpoint: idpEvent.AuthorizationEndpoint, - TokenEndpoint: idpEvent.TokenEndpoint, - UserEndpoint: idpEvent.UserEndpoint, - Scopes: idpEvent.Scopes, - IDAttribute: idpEvent.IDAttribute, - UsePKCE: idpEvent.UsePKCE, - } - - payloadJSON, err := json.Marshal(oauth) - if err != nil { - return nil, err - } - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInvalidArgumentf(nil, "HANDL-mB2hq", "reduce.wrong.db.pool %T", ex) - } - - repo := repository.IDProviderRepository() - return repo.Create(ctx, v3_sql.SQLTx(tx), &domain.IdentityProvider{ - InstanceID: idpEvent.Aggregate().InstanceID, - OrgID: orgId, - ID: idpEvent.ID, - State: domain.IDPStateActive, - Name: idpEvent.Name, - Type: gu.Ptr(domain.IDPTypeOAuth), - AllowCreation: idpEvent.IsCreationAllowed, - AllowLinking: idpEvent.IsLinkingAllowed, - AllowAutoCreation: idpEvent.IsAutoCreation, - AllowAutoUpdate: idpEvent.IsAutoUpdate, - AutoLinkingField: mapAutoLinkingField(idpEvent.AutoLinkingOption), - Payload: payloadJSON, - CreatedAt: event.CreatedAt(), - UpdatedAt: event.CreatedAt(), - }) - }), nil -} - -func (p *idpTemplateRelationalProjection) reduceOAuthIDPChanged(event eventstore.Event) (*handler.Statement, error) { - var orgId *string - var idpEvent idp.OAuthIDPChangedEvent - switch e := event.(type) { - case *org.OAuthIDPChangedEvent: - idpEvent = e.OAuthIDPChangedEvent - orgId = &idpEvent.Aggregate().ResourceOwner - case *instance.OAuthIDPChangedEvent: - idpEvent = e.OAuthIDPChangedEvent - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-K1582ks", "reduce.wrong.event.type %v", []eventstore.EventType{org.OAuthIDPChangedEventType, instance.OAuthIDPChangedEventType}) - } - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInternal(nil, "HANDL-HX6ed", "unable to cast to tx executer") - } - idpRepo := repository.IDProviderRepository() - oauth, err := idpRepo.GetOAuth(ctx, v3_sql.SQLTx(tx), database.WithCondition(idpScopedCondition(idpRepo, idpEvent.Agg.InstanceID, idpEvent.ID, orgId))) - if err != nil { - return err - } - - changes := p.reduceIDPChangedTemplateColumns(idpRepo, idpEvent.Name, idpEvent.OptionChanges) - - payload := &oauth.OAuth - payloadChanged := p.reduceOAuthIDPChangedColumns(payload, &idpEvent) - if payloadChanged { - payloadJSON, err := json.Marshal(payload) - if err != nil { - return err - } - changes = append(changes, idpRepo.SetPayload(string(payloadJSON))) - } - - changes = append(changes, idpRepo.SetUpdatedAt(gu.Ptr(event.CreatedAt()))) - _, err = idpRepo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(idpRepo, idpEvent.Aggregate().InstanceID, idpEvent.ID, orgId), changes...) - return err - - }), nil -} - -func (p *idpTemplateRelationalProjection) reduceOIDCIDPAdded(event eventstore.Event) (*handler.Statement, error) { - var orgId *string - var idpEvent idp.OIDCIDPAddedEvent - switch e := event.(type) { - case *org.OIDCIDPAddedEvent: - idpEvent = e.OIDCIDPAddedEvent - orgId = &idpEvent.Aggregate().ResourceOwner - case *instance.OIDCIDPAddedEvent: - idpEvent = e.OIDCIDPAddedEvent - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Ys02m1", "reduce.wrong.event.type %v", []eventstore.EventType{org.OIDCIDPAddedEventType, instance.OIDCIDPAddedEventType}) - } - - payloadJSON, err := json.Marshal(idpEvent) - if err != nil { - return nil, err - } - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInvalidArgumentf(nil, "HANDL-C9ju3", "reduce.wrong.db.pool %T", ex) - } - - repo := repository.IDProviderRepository() - return repo.Create(ctx, v3_sql.SQLTx(tx), &domain.IdentityProvider{ - InstanceID: idpEvent.Aggregate().InstanceID, - OrgID: orgId, - ID: idpEvent.ID, - State: domain.IDPStateActive, - Name: idpEvent.Name, - Type: gu.Ptr(domain.IDPTypeOIDC), - AllowCreation: idpEvent.IsCreationAllowed, - AllowAutoCreation: idpEvent.IsAutoCreation, - AllowAutoUpdate: idpEvent.IsAutoUpdate, - AllowLinking: idpEvent.IsLinkingAllowed, - AutoLinkingField: mapAutoLinkingField(idpEvent.AutoLinkingOption), - Payload: payloadJSON, - CreatedAt: event.CreatedAt(), - UpdatedAt: event.CreatedAt(), - }) - }), nil -} - -func (p *idpTemplateRelationalProjection) reduceOIDCIDPChanged(event eventstore.Event) (*handler.Statement, error) { - var orgId *string - var idpEvent idp.OIDCIDPChangedEvent - switch e := event.(type) { - case *org.OIDCIDPChangedEvent: - idpEvent = e.OIDCIDPChangedEvent - orgId = &idpEvent.Aggregate().ResourceOwner - case *instance.OIDCIDPChangedEvent: - idpEvent = e.OIDCIDPChangedEvent - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Y1K82ks", "reduce.wrong.event.type %v", []eventstore.EventType{org.OIDCIDPChangedEventType, instance.OIDCIDPChangedEventType}) - } - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInternal(nil, "HANDL-L8CQt", "unable to cast to tx executer") - } - idpRepo := repository.IDProviderRepository() - oidc, err := idpRepo.GetOIDC(ctx, v3_sql.SQLTx(tx), database.WithCondition(idpScopedCondition(idpRepo, idpEvent.Agg.InstanceID, idpEvent.ID, orgId))) - if err != nil { - return err - } - - changes := p.reduceIDPChangedTemplateColumns(idpRepo, idpEvent.Name, idpEvent.OptionChanges) - - payload := &oidc.OIDC - payloadChanged := p.reduceOIDCIDPChangedColumns(payload, &idpEvent) - if payloadChanged { - payloadJSON, err := json.Marshal(payload) - if err != nil { - return err - } - changes = append(changes, idpRepo.SetPayload(string(payloadJSON))) - } - - changes = append(changes, idpRepo.SetUpdatedAt(gu.Ptr(event.CreatedAt()))) - _, err = idpRepo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(idpRepo, idpEvent.Aggregate().InstanceID, idpEvent.ID, orgId), changes...) - return err - }), nil -} - -func (p *idpTemplateRelationalProjection) reduceOIDCIDPMigratedAzureAD(event eventstore.Event) (*handler.Statement, error) { - var orgID *string - var idpEvent idp.OIDCIDPMigratedAzureADEvent - switch e := event.(type) { - case *org.OIDCIDPMigratedAzureADEvent: - idpEvent = e.OIDCIDPMigratedAzureADEvent - orgID = gu.Ptr(idpEvent.Aggregate().ResourceOwner) - case *instance.OIDCIDPMigratedAzureADEvent: - idpEvent = e.OIDCIDPMigratedAzureADEvent - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Yb582ks", "reduce.wrong.event.type %v", []eventstore.EventType{org.OIDCIDPMigratedAzureADEventType, instance.OIDCIDPMigratedAzureADEventType}) - } - - azureTenant, err := domain.AzureTenantTypeString(idpEvent.Tenant) - if err != nil { - return nil, err - } - - azure := domain.Azure{ - ClientID: idpEvent.ClientID, - ClientSecret: idpEvent.ClientSecret, - Scopes: idpEvent.Scopes, - Tenant: azureTenant, - IsEmailVerified: idpEvent.IsEmailVerified, - } - - payloadJSON, err := json.Marshal(azure) - if err != nil { - return nil, err - } - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInvalidArgumentf(nil, "HANDL-mj7LQ", "reduce.wrong.db.pool %T", ex) - } - - repo := repository.IDProviderRepository() - changes := database.Changes{ - repo.SetName(idpEvent.Name), - repo.SetType(domain.IDPTypeAzure), - repo.SetAllowCreation(idpEvent.IsCreationAllowed), - repo.SetAllowLinking(idpEvent.IsLinkingAllowed), - repo.SetAllowAutoCreation(idpEvent.IsAutoCreation), - repo.SetAllowAutoUpdate(idpEvent.IsAutoUpdate), - repo.SetAutoLinkingField(mapAutoLinkingField(idpEvent.AutoLinkingOption)), - repo.SetPayload(string(payloadJSON)), - repo.SetUpdatedAt(gu.Ptr(event.CreatedAt())), - } - - _, err = repo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(repo, idpEvent.Aggregate().InstanceID, idpEvent.ID, orgID), changes...) - return err - }), nil -} - -func (p *idpTemplateRelationalProjection) reduceOIDCIDPMigratedGoogle(event eventstore.Event) (*handler.Statement, error) { - var orgID *string - var idpEvent idp.OIDCIDPMigratedGoogleEvent - switch e := event.(type) { - case *org.OIDCIDPMigratedGoogleEvent: - idpEvent = e.OIDCIDPMigratedGoogleEvent - orgID = gu.Ptr(idpEvent.Aggregate().ResourceOwner) - case *instance.OIDCIDPMigratedGoogleEvent: - idpEvent = e.OIDCIDPMigratedGoogleEvent - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Y1502hk", "reduce.wrong.event.type %v", []eventstore.EventType{org.OIDCIDPMigratedGoogleEventType, instance.OIDCIDPMigratedGoogleEventType}) - } - - google := domain.Google{ - ClientID: idpEvent.ClientID, - ClientSecret: idpEvent.ClientSecret, - Scopes: idpEvent.Scopes, - } - - payloadJSON, err := json.Marshal(google) - if err != nil { - return nil, err - } - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInvalidArgumentf(nil, "HANDL-HDqk9", "reduce.wrong.db.pool %T", ex) - } - - repo := repository.IDProviderRepository() - changes := database.Changes{ - repo.SetName(idpEvent.Name), - repo.SetType(domain.IDPTypeGoogle), - repo.SetAllowCreation(idpEvent.IsCreationAllowed), - repo.SetAllowLinking(idpEvent.IsLinkingAllowed), - repo.SetAllowAutoCreation(idpEvent.IsAutoCreation), - repo.SetAllowAutoUpdate(idpEvent.IsAutoUpdate), - repo.SetAutoLinkingField(mapAutoLinkingField(idpEvent.AutoLinkingOption)), - repo.SetPayload(string(payloadJSON)), - repo.SetUpdatedAt(gu.Ptr(event.CreatedAt())), - } - - _, err = repo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(repo, idpEvent.Aggregate().InstanceID, idpEvent.ID, orgID), changes...) - return err - }), nil -} - -func (p *idpTemplateRelationalProjection) reduceJWTIDPAdded(event eventstore.Event) (*handler.Statement, error) { - var orgId *string - var idpEvent idp.JWTIDPAddedEvent - switch e := event.(type) { - case *org.JWTIDPAddedEvent: - idpEvent = e.JWTIDPAddedEvent - orgId = &idpEvent.Aggregate().ResourceOwner - case *instance.JWTIDPAddedEvent: - idpEvent = e.JWTIDPAddedEvent - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Yopi2s", "reduce.wrong.event.type %v", []eventstore.EventType{org.JWTIDPAddedEventType, instance.JWTIDPAddedEventType}) - } - - jwt := domain.JWT{ - JWTEndpoint: idpEvent.JWTEndpoint, - Issuer: idpEvent.Issuer, - KeysEndpoint: idpEvent.KeysEndpoint, - HeaderName: idpEvent.HeaderName, - } - - payloadJSON, err := json.Marshal(jwt) - if err != nil { - return nil, err - } - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInvalidArgumentf(nil, "HANDL-ZYYyQ", "reduce.wrong.db.pool %T", ex) - } - - repo := repository.IDProviderRepository() - return repo.Create(ctx, v3_sql.SQLTx(tx), &domain.IdentityProvider{ - InstanceID: idpEvent.Aggregate().InstanceID, - OrgID: orgId, - ID: idpEvent.ID, - State: domain.IDPStateActive, - Name: idpEvent.Name, - Type: gu.Ptr(domain.IDPTypeJWT), - AllowCreation: idpEvent.IsCreationAllowed, - AllowAutoCreation: idpEvent.IsAutoCreation, - AllowAutoUpdate: idpEvent.IsAutoUpdate, - AllowLinking: idpEvent.IsLinkingAllowed, - AutoLinkingField: mapAutoLinkingField(idpEvent.AutoLinkingOption), - Payload: payloadJSON, - CreatedAt: event.CreatedAt(), - UpdatedAt: event.CreatedAt(), - }) - }), nil -} - -func (p *idpTemplateRelationalProjection) reduceJWTIDPChanged(event eventstore.Event) (*handler.Statement, error) { - var orgId *string - var idpEvent idp.JWTIDPChangedEvent - switch e := event.(type) { - case *org.JWTIDPChangedEvent: - idpEvent = e.JWTIDPChangedEvent - orgId = &idpEvent.Aggregate().ResourceOwner - case *instance.JWTIDPChangedEvent: - idpEvent = e.JWTIDPChangedEvent - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-H15j2il", "reduce.wrong.event.type %v", []eventstore.EventType{org.JWTIDPChangedEventType, instance.JWTIDPChangedEventType}) - } - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInternal(nil, "HANDL-HX6ed", "unable to cast to tx executer") - } - idpRepo := repository.IDProviderRepository() - jwt, err := idpRepo.GetJWT(ctx, v3_sql.SQLTx(tx), database.WithCondition(idpScopedCondition(idpRepo, idpEvent.Agg.InstanceID, idpEvent.ID, orgId))) - if err != nil { - return err - } - - changes := p.reduceIDPChangedTemplateColumns(idpRepo, idpEvent.Name, idpEvent.OptionChanges) - - payload := &jwt.JWT - payloadChanged := p.reduceJWTIDPChangedColumns(payload, &idpEvent) - if payloadChanged { - payloadJSON, err := json.Marshal(payload) - if err != nil { - return err - } - changes = append(changes, idpRepo.SetPayload(string(payloadJSON))) - } - - changes = append(changes, idpRepo.SetUpdatedAt(gu.Ptr(event.CreatedAt()))) - _, err = idpRepo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(idpRepo, idpEvent.Aggregate().InstanceID, idpEvent.ID, orgId), changes...) - return err - }), nil -} - -func (p *idpTemplateRelationalProjection) reduceAzureADIDPAdded(event eventstore.Event) (*handler.Statement, error) { - var orgId *string - var idpEvent idp.AzureADIDPAddedEvent - switch e := event.(type) { - case *org.AzureADIDPAddedEvent: - idpEvent = e.AzureADIDPAddedEvent - orgId = &idpEvent.Aggregate().ResourceOwner - case *instance.AzureADIDPAddedEvent: - idpEvent = e.AzureADIDPAddedEvent - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Y9a022b", "reduce.wrong.event.type %v", []eventstore.EventType{org.AzureADIDPAddedEventType, instance.AzureADIDPAddedEventType}) - } - - azureTenant, err := domain.AzureTenantTypeString(idpEvent.Tenant) - if err != nil { - return nil, err - } - - azure := domain.Azure{ - ClientID: idpEvent.ClientID, - ClientSecret: idpEvent.ClientSecret, - Scopes: idpEvent.Scopes, - Tenant: azureTenant, - IsEmailVerified: idpEvent.IsEmailVerified, - } - - payloadJSON, err := json.Marshal(azure) - if err != nil { - return nil, err - } - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInvalidArgumentf(nil, "HANDL-GJ4Kb", "reduce.wrong.db.pool %T", ex) - } - - repo := repository.IDProviderRepository() - return repo.Create(ctx, v3_sql.SQLTx(tx), &domain.IdentityProvider{ - InstanceID: idpEvent.Aggregate().InstanceID, - OrgID: orgId, - ID: idpEvent.ID, - State: domain.IDPStateActive, - Name: idpEvent.Name, - Type: gu.Ptr(domain.IDPTypeAzure), - AllowCreation: idpEvent.IsCreationAllowed, - AllowAutoCreation: idpEvent.IsAutoCreation, - AllowAutoUpdate: idpEvent.IsAutoUpdate, - AllowLinking: idpEvent.IsLinkingAllowed, - AutoLinkingField: mapAutoLinkingField(idpEvent.AutoLinkingOption), - Payload: payloadJSON, - CreatedAt: event.CreatedAt(), - UpdatedAt: event.CreatedAt(), - }) - }), nil -} - -func (p *idpTemplateRelationalProjection) reduceAzureADIDPChanged(event eventstore.Event) (*handler.Statement, error) { - var orgId *string - var idpEvent idp.AzureADIDPChangedEvent - switch e := event.(type) { - case *org.AzureADIDPChangedEvent: - idpEvent = e.AzureADIDPChangedEvent - orgId = &idpEvent.Aggregate().ResourceOwner - case *instance.AzureADIDPChangedEvent: - idpEvent = e.AzureADIDPChangedEvent - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-YZ5x25s", "reduce.wrong.event.type %v", []eventstore.EventType{org.AzureADIDPChangedEventType, instance.AzureADIDPChangedEventType}) - } - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInternal(nil, "HANDL-HX6ed", "unable to cast to tx executer") - } - idpRepo := repository.IDProviderRepository() - azure, err := idpRepo.GetAzureAD(ctx, v3_sql.SQLTx(tx), database.WithCondition(idpScopedCondition(idpRepo, idpEvent.Agg.InstanceID, idpEvent.ID, orgId))) - if err != nil { - return err - } - - changes := p.reduceIDPChangedTemplateColumns(idpRepo, idpEvent.Name, idpEvent.OptionChanges) - - payload := &azure.Azure - payloadChanged, err := p.reduceAzureADIDPChangedColumns(payload, &idpEvent) - if err != nil { - return err - } - - if payloadChanged { - payloadJSON, err := json.Marshal(payload) - if err != nil { - return err - } - changes = append(changes, idpRepo.SetPayload(string(payloadJSON))) - } - - changes = append(changes, idpRepo.SetUpdatedAt(gu.Ptr(event.CreatedAt()))) - _, err = idpRepo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(idpRepo, idpEvent.Aggregate().InstanceID, idpEvent.ID, orgId), changes...) - return err - - }), nil -} - -func (p *idpTemplateRelationalProjection) reduceGitHubIDPAdded(event eventstore.Event) (*handler.Statement, error) { - var orgId *string - var idpEvent idp.GitHubIDPAddedEvent - switch e := event.(type) { - case *org.GitHubIDPAddedEvent: - idpEvent = e.GitHubIDPAddedEvent - orgId = &idpEvent.Aggregate().ResourceOwner - case *instance.GitHubIDPAddedEvent: - idpEvent = e.GitHubIDPAddedEvent - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-x9a022b", "reduce.wrong.event.type %v", []eventstore.EventType{org.GitHubIDPAddedEventType, instance.GitHubIDPAddedEventType}) - } - - github := domain.Github{ - ClientID: idpEvent.ClientID, - ClientSecret: idpEvent.ClientSecret, - Scopes: idpEvent.Scopes, - } - - payloadJSON, err := json.Marshal(github) - if err != nil { - return nil, err - } - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInvalidArgumentf(nil, "HANDL-HNpgd", "reduce.wrong.db.pool %T", ex) - } - - repo := repository.IDProviderRepository() - return repo.Create(ctx, v3_sql.SQLTx(tx), &domain.IdentityProvider{ - InstanceID: idpEvent.Aggregate().InstanceID, - OrgID: orgId, - ID: idpEvent.ID, - State: domain.IDPStateActive, - Name: idpEvent.Name, - Type: gu.Ptr(domain.IDPTypeGitHub), - AllowCreation: idpEvent.IsCreationAllowed, - AllowAutoCreation: idpEvent.IsAutoCreation, - AllowAutoUpdate: idpEvent.IsAutoUpdate, - AllowLinking: idpEvent.IsLinkingAllowed, - AutoLinkingField: mapAutoLinkingField(idpEvent.AutoLinkingOption), - Payload: payloadJSON, - CreatedAt: event.CreatedAt(), - UpdatedAt: event.CreatedAt(), - }) - }), nil -} - -func (p *idpTemplateRelationalProjection) reduceGitHubIDPChanged(event eventstore.Event) (*handler.Statement, error) { - var orgId *string - var idpEvent idp.GitHubIDPChangedEvent - switch e := event.(type) { - case *org.GitHubIDPChangedEvent: - idpEvent = e.GitHubIDPChangedEvent - orgId = &idpEvent.Aggregate().ResourceOwner - case *instance.GitHubIDPChangedEvent: - idpEvent = e.GitHubIDPChangedEvent - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-L1U89ks", "reduce.wrong.event.type %v", []eventstore.EventType{org.GitHubIDPChangedEventType, instance.GitHubIDPChangedEventType}) - } - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInternal(nil, "HANDL-HX6ed", "unable to cast to tx executer") - } - idpRepo := repository.IDProviderRepository() - github, err := idpRepo.GetGithub(ctx, v3_sql.SQLTx(tx), database.WithCondition(idpScopedCondition(idpRepo, idpEvent.Agg.InstanceID, idpEvent.ID, orgId))) - if err != nil { - return err - } - - changes := p.reduceIDPChangedTemplateColumns(idpRepo, idpEvent.Name, idpEvent.OptionChanges) - - payload := &github.Github - payloadChanged := p.reduceGitHubIDPChangedColumns(payload, &idpEvent) - if payloadChanged { - payloadJSON, err := json.Marshal(payload) - if err != nil { - return err - } - changes = append(changes, idpRepo.SetPayload(string(payloadJSON))) - } - - changes = append(changes, idpRepo.SetUpdatedAt(gu.Ptr(event.CreatedAt()))) - _, err = idpRepo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(idpRepo, idpEvent.Aggregate().InstanceID, idpEvent.ID, orgId), changes...) - return err - - }), nil -} - -func (p *idpTemplateRelationalProjection) reduceGitHubEnterpriseIDPAdded(event eventstore.Event) (*handler.Statement, error) { - var orgId *string - var idpEvent idp.GitHubEnterpriseIDPAddedEvent - switch e := event.(type) { - case *org.GitHubEnterpriseIDPAddedEvent: - idpEvent = e.GitHubEnterpriseIDPAddedEvent - orgId = &idpEvent.Aggregate().ResourceOwner - case *instance.GitHubEnterpriseIDPAddedEvent: - idpEvent = e.GitHubEnterpriseIDPAddedEvent - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Yf3g2a", "reduce.wrong.event.type %v", []eventstore.EventType{org.GitHubEnterpriseIDPAddedEventType, instance.GitHubEnterpriseIDPAddedEventType}) - } - - githubEnterprise := domain.GithubEnterprise{ - ClientID: idpEvent.ClientID, - ClientSecret: idpEvent.ClientSecret, - AuthorizationEndpoint: idpEvent.AuthorizationEndpoint, - TokenEndpoint: idpEvent.TokenEndpoint, - UserEndpoint: idpEvent.UserEndpoint, - Scopes: idpEvent.Scopes, - } - - payloadJSON, err := json.Marshal(githubEnterprise) - if err != nil { - return nil, err - } - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInvalidArgumentf(nil, "HANDL-Kv4Fu", "reduce.wrong.db.pool %T", ex) - } - - repo := repository.IDProviderRepository() - return repo.Create(ctx, v3_sql.SQLTx(tx), &domain.IdentityProvider{ - InstanceID: idpEvent.Aggregate().InstanceID, - OrgID: orgId, - ID: idpEvent.ID, - State: domain.IDPStateActive, - Name: idpEvent.Name, - Type: gu.Ptr(domain.IDPTypeGitHubEnterprise), - AllowCreation: idpEvent.IsCreationAllowed, - AllowAutoCreation: idpEvent.IsAutoCreation, - AllowAutoUpdate: idpEvent.IsAutoUpdate, - AllowLinking: idpEvent.IsLinkingAllowed, - AutoLinkingField: mapAutoLinkingField(idpEvent.AutoLinkingOption), - Payload: payloadJSON, - CreatedAt: event.CreatedAt(), - UpdatedAt: event.CreatedAt(), - }) - }), nil -} - -func (p *idpTemplateRelationalProjection) reduceGitHubEnterpriseIDPChanged(event eventstore.Event) (*handler.Statement, error) { - var orgId *string - var idpEvent idp.GitHubEnterpriseIDPChangedEvent - switch e := event.(type) { - case *org.GitHubEnterpriseIDPChangedEvent: - idpEvent = e.GitHubEnterpriseIDPChangedEvent - orgId = &idpEvent.Aggregate().ResourceOwner - case *instance.GitHubEnterpriseIDPChangedEvent: - idpEvent = e.GitHubEnterpriseIDPChangedEvent - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-YDg3g", "reduce.wrong.event.type %v", []eventstore.EventType{org.GitHubEnterpriseIDPChangedEventType, instance.GitHubEnterpriseIDPChangedEventType}) - } - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInternal(nil, "HANDL-HX6ed", "unable to cast to tx executer") - } - idpRepo := repository.IDProviderRepository() - githubEnterprise, err := idpRepo.GetGithubEnterprise(ctx, v3_sql.SQLTx(tx), database.WithCondition(idpScopedCondition(idpRepo, idpEvent.Agg.InstanceID, idpEvent.ID, orgId))) - if err != nil { - return err - } - - changes := p.reduceIDPChangedTemplateColumns(idpRepo, idpEvent.Name, idpEvent.OptionChanges) - - payload := &githubEnterprise.GithubEnterprise - payloadChanged := p.reduceGitHubEnterpriseIDPChangedColumns(payload, &idpEvent) - if payloadChanged { - payloadJSON, err := json.Marshal(payload) - if err != nil { - return err - } - changes = append(changes, idpRepo.SetPayload(string(payloadJSON))) - } - - changes = append(changes, idpRepo.SetUpdatedAt(gu.Ptr(event.CreatedAt()))) - _, err = idpRepo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(idpRepo, idpEvent.Aggregate().InstanceID, idpEvent.ID, orgId), changes...) - return err - - }), nil -} - -func (p *idpTemplateRelationalProjection) reduceGitLabIDPAdded(event eventstore.Event) (*handler.Statement, error) { - var orgId *string - var idpEvent idp.GitLabIDPAddedEvent - switch e := event.(type) { - case *org.GitLabIDPAddedEvent: - idpEvent = e.GitLabIDPAddedEvent - orgId = &idpEvent.Aggregate().ResourceOwner - case *instance.GitLabIDPAddedEvent: - idpEvent = e.GitLabIDPAddedEvent - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Y9a022b", "reduce.wrong.event.type %v", []eventstore.EventType{org.GitLabIDPAddedEventType, instance.GitLabIDPAddedEventType}) - } - - gitlab := domain.Gitlab{ - ClientID: idpEvent.ClientID, - ClientSecret: idpEvent.ClientSecret, - Scopes: idpEvent.Scopes, - } - - payloadJSON, err := json.Marshal(gitlab) - if err != nil { - return nil, err - } - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInvalidArgumentf(nil, "HANDL-kN8Qx", "reduce.wrong.db.pool %T", ex) - } - - repo := repository.IDProviderRepository() - return repo.Create(ctx, v3_sql.SQLTx(tx), &domain.IdentityProvider{ - InstanceID: idpEvent.Aggregate().InstanceID, - OrgID: orgId, - ID: idpEvent.ID, - State: domain.IDPStateActive, - Name: idpEvent.Name, - Type: gu.Ptr(domain.IDPTypeGitLab), - AllowCreation: idpEvent.IsCreationAllowed, - AllowAutoCreation: idpEvent.IsAutoCreation, - AllowAutoUpdate: idpEvent.IsAutoUpdate, - AllowLinking: idpEvent.IsLinkingAllowed, - AutoLinkingField: mapAutoLinkingField(idpEvent.AutoLinkingOption), - Payload: payloadJSON, - CreatedAt: event.CreatedAt(), - UpdatedAt: event.CreatedAt(), - }) - }), nil -} - -func (p *idpTemplateRelationalProjection) reduceGitLabIDPChanged(event eventstore.Event) (*handler.Statement, error) { - var orgId *string - var idpEvent idp.GitLabIDPChangedEvent - switch e := event.(type) { - case *org.GitLabIDPChangedEvent: - idpEvent = e.GitLabIDPChangedEvent - orgId = &idpEvent.Aggregate().ResourceOwner - case *instance.GitLabIDPChangedEvent: - idpEvent = e.GitLabIDPChangedEvent - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-mT5827b", "reduce.wrong.event.type %v", []eventstore.EventType{org.GitLabIDPChangedEventType, instance.GitLabIDPChangedEventType}) - } - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInternal(nil, "HANDL-HX6ed", "unable to cast to tx executer") - } - idpRepo := repository.IDProviderRepository() - gitlab, err := idpRepo.GetGitlab(ctx, v3_sql.SQLTx(tx), database.WithCondition(idpScopedCondition(idpRepo, idpEvent.Agg.InstanceID, idpEvent.ID, orgId))) - if err != nil { - return err - } - - changes := p.reduceIDPChangedTemplateColumns(idpRepo, idpEvent.Name, idpEvent.OptionChanges) - - payload := &gitlab.Gitlab - payloadChanged := p.reduceGitLabIDPChangedColumns(payload, &idpEvent) - if payloadChanged { - payloadJSON, err := json.Marshal(payload) - if err != nil { - return err - } - changes = append(changes, idpRepo.SetPayload(string(payloadJSON))) - } - - changes = append(changes, idpRepo.SetUpdatedAt(gu.Ptr(event.CreatedAt()))) - _, err = idpRepo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(idpRepo, idpEvent.Aggregate().InstanceID, idpEvent.ID, orgId), changes...) - return err - - }), nil -} - -func (p *idpTemplateRelationalProjection) reduceGitLabSelfHostedIDPAdded(event eventstore.Event) (*handler.Statement, error) { - var orgId *string - var idpEvent idp.GitLabSelfHostedIDPAddedEvent - switch e := event.(type) { - case *org.GitLabSelfHostedIDPAddedEvent: - idpEvent = e.GitLabSelfHostedIDPAddedEvent - orgId = &idpEvent.Aggregate().ResourceOwner - case *instance.GitLabSelfHostedIDPAddedEvent: - idpEvent = e.GitLabSelfHostedIDPAddedEvent - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-YAF3gw", "reduce.wrong.event.type %v", []eventstore.EventType{org.GitLabSelfHostedIDPAddedEventType, instance.GitLabSelfHostedIDPAddedEventType}) - } - - gitlabSelfHosted := domain.GitlabSelfHosted{ - Issuer: idpEvent.Issuer, - ClientID: idpEvent.ClientID, - ClientSecret: idpEvent.ClientSecret, - Scopes: idpEvent.Scopes, - } - - payloadJSON, err := json.Marshal(gitlabSelfHosted) - if err != nil { - return nil, err - } - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInvalidArgumentf(nil, "HANDL-FQrtw", "reduce.wrong.db.pool %T", ex) - } - - repo := repository.IDProviderRepository() - return repo.Create(ctx, v3_sql.SQLTx(tx), &domain.IdentityProvider{ - InstanceID: idpEvent.Aggregate().InstanceID, - OrgID: orgId, - ID: idpEvent.ID, - State: domain.IDPStateActive, - Name: idpEvent.Name, - Type: gu.Ptr(domain.IDPTypeGitLabSelfHosted), - AllowCreation: idpEvent.IsCreationAllowed, - AllowAutoCreation: idpEvent.IsAutoCreation, - AllowAutoUpdate: idpEvent.IsAutoUpdate, - AllowLinking: idpEvent.IsLinkingAllowed, - AutoLinkingField: mapAutoLinkingField(idpEvent.AutoLinkingOption), - Payload: payloadJSON, - CreatedAt: event.CreatedAt(), - UpdatedAt: event.CreatedAt(), - }) - }), nil -} - -func (p *idpTemplateRelationalProjection) reduceGitLabSelfHostedIDPChanged(event eventstore.Event) (*handler.Statement, error) { - var orgId *string - var idpEvent idp.GitLabSelfHostedIDPChangedEvent - switch e := event.(type) { - case *org.GitLabSelfHostedIDPChangedEvent: - idpEvent = e.GitLabSelfHostedIDPChangedEvent - orgId = &idpEvent.Aggregate().ResourceOwner - case *instance.GitLabSelfHostedIDPChangedEvent: - idpEvent = e.GitLabSelfHostedIDPChangedEvent - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-YAf3g2", "reduce.wrong.event.type %v", []eventstore.EventType{org.GitLabSelfHostedIDPChangedEventType, instance.GitLabSelfHostedIDPChangedEventType}) - } - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInternal(nil, "HANDL-HX6ed", "unable to cast to tx executer") - } - idpRepo := repository.IDProviderRepository() - gitlabSelfHosted, err := idpRepo.GetGitlabSelfHosted(ctx, v3_sql.SQLTx(tx), database.WithCondition(idpScopedCondition(idpRepo, idpEvent.Agg.InstanceID, idpEvent.ID, orgId))) - if err != nil { - return err - } - - changes := p.reduceIDPChangedTemplateColumns(idpRepo, idpEvent.Name, idpEvent.OptionChanges) - - payload := &gitlabSelfHosted.GitlabSelfHosted - payloadChanged := p.reduceGitLabSelfHostedIDPChangedColumns(payload, &idpEvent) - if payloadChanged { - payloadJSON, err := json.Marshal(payload) - if err != nil { - return err - } - changes = append(changes, idpRepo.SetPayload(string(payloadJSON))) - } - - changes = append(changes, idpRepo.SetUpdatedAt(gu.Ptr(event.CreatedAt()))) - _, err = idpRepo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(idpRepo, idpEvent.Aggregate().InstanceID, idpEvent.ID, orgId), changes...) - return err - - }), nil -} - -func (p *idpTemplateRelationalProjection) reduceGoogleIDPAdded(event eventstore.Event) (*handler.Statement, error) { - var orgId *string - var idpEvent idp.GoogleIDPAddedEvent - switch e := event.(type) { - case *org.GoogleIDPAddedEvent: - idpEvent = e.GoogleIDPAddedEvent - orgId = &idpEvent.Aggregate().ResourceOwner - case *instance.GoogleIDPAddedEvent: - idpEvent = e.GoogleIDPAddedEvent - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Yp9ihb", "reduce.wrong.event.type %v", []eventstore.EventType{org.GoogleIDPAddedEventType, instance.GoogleIDPAddedEventType}) - } - - google := domain.Google{ - ClientID: idpEvent.ClientID, - ClientSecret: idpEvent.ClientSecret, - Scopes: idpEvent.Scopes, - } - - payloadJSON, err := json.Marshal(google) - if err != nil { - return nil, err - } - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInvalidArgumentf(nil, "HANDL-B9SPm", "reduce.wrong.db.pool %T", ex) - } - - repo := repository.IDProviderRepository() - return repo.Create(ctx, v3_sql.SQLTx(tx), &domain.IdentityProvider{ - InstanceID: idpEvent.Aggregate().InstanceID, - OrgID: orgId, - ID: idpEvent.ID, - State: domain.IDPStateActive, - Name: idpEvent.Name, - Type: gu.Ptr(domain.IDPTypeGoogle), - AllowCreation: idpEvent.IsCreationAllowed, - AllowAutoCreation: idpEvent.IsAutoCreation, - AllowAutoUpdate: idpEvent.IsAutoUpdate, - AllowLinking: idpEvent.IsLinkingAllowed, - AutoLinkingField: mapAutoLinkingField(idpEvent.AutoLinkingOption), - Payload: payloadJSON, - CreatedAt: event.CreatedAt(), - UpdatedAt: event.CreatedAt(), - }) - }), nil -} - -func (p *idpTemplateRelationalProjection) reduceGoogleIDPChanged(event eventstore.Event) (*handler.Statement, error) { - var orgId *string - var idpEvent idp.GoogleIDPChangedEvent - switch e := event.(type) { - case *org.GoogleIDPChangedEvent: - idpEvent = e.GoogleIDPChangedEvent - orgId = &idpEvent.Aggregate().ResourceOwner - case *instance.GoogleIDPChangedEvent: - idpEvent = e.GoogleIDPChangedEvent - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-YN58hml", "reduce.wrong.event.type %v", []eventstore.EventType{org.GoogleIDPChangedEventType, instance.GoogleIDPChangedEventType}) - } - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInternal(nil, "HANDL-HX6ed", "unable to cast to tx executer") - } - idpRepo := repository.IDProviderRepository() - google, err := idpRepo.GetGoogle(ctx, v3_sql.SQLTx(tx), database.WithCondition(idpScopedCondition(idpRepo, idpEvent.Agg.InstanceID, idpEvent.ID, orgId))) - if err != nil { - return err - } - - changes := p.reduceIDPChangedTemplateColumns(idpRepo, idpEvent.Name, idpEvent.OptionChanges) - - payload := &google.Google - payloadChanged := p.reduceGoogleIDPChangedColumns(payload, &idpEvent) - if payloadChanged { - payloadJSON, err := json.Marshal(payload) - if err != nil { - return err - } - changes = append(changes, idpRepo.SetPayload(string(payloadJSON))) - } - - changes = append(changes, idpRepo.SetUpdatedAt(gu.Ptr(event.CreatedAt()))) - _, err = idpRepo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(idpRepo, idpEvent.Aggregate().InstanceID, idpEvent.ID, orgId), changes...) - return err - - }), nil -} - -func (p *idpTemplateRelationalProjection) reduceLDAPIDPAdded(event eventstore.Event) (*handler.Statement, error) { - var orgId *string - var idpEvent idp.LDAPIDPAddedEvent - switch e := event.(type) { - case *org.LDAPIDPAddedEvent: - idpEvent = e.LDAPIDPAddedEvent - orgId = &idpEvent.Aggregate().ResourceOwner - case *instance.LDAPIDPAddedEvent: - idpEvent = e.LDAPIDPAddedEvent - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-9s02m1", "reduce.wrong.event.type %v", []eventstore.EventType{org.LDAPIDPAddedEventType, instance.LDAPIDPAddedEventType}) - } - - ldap := domain.LDAP{ - Servers: idpEvent.Servers, - StartTLS: idpEvent.StartTLS, - BaseDN: idpEvent.BaseDN, - BindDN: idpEvent.BindDN, - BindPassword: idpEvent.BindPassword, - UserBase: idpEvent.UserBase, - UserObjectClasses: idpEvent.UserObjectClasses, - UserFilters: idpEvent.UserFilters, - Timeout: idpEvent.Timeout, - LDAPAttributes: domain.LDAPAttributes{ - IDAttribute: idpEvent.IDAttribute, - FirstNameAttribute: idpEvent.FirstNameAttribute, - LastNameAttribute: idpEvent.LastNameAttribute, - DisplayNameAttribute: idpEvent.DisplayNameAttribute, - NickNameAttribute: idpEvent.NickNameAttribute, - PreferredUsernameAttribute: idpEvent.PreferredUsernameAttribute, - EmailAttribute: idpEvent.EmailAttribute, - EmailVerifiedAttribute: idpEvent.EmailVerifiedAttribute, - PhoneAttribute: idpEvent.PhoneAttribute, - PhoneVerifiedAttribute: idpEvent.PhoneVerifiedAttribute, - PreferredLanguageAttribute: idpEvent.PreferredLanguageAttribute, - AvatarURLAttribute: idpEvent.AvatarURLAttribute, - ProfileAttribute: idpEvent.ProfileAttribute, - }, - } - - payloadJSON, err := json.Marshal(ldap) - if err != nil { - return nil, err - } - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInvalidArgumentf(nil, "HANDL-XCJ8w", "reduce.wrong.db.pool %T", ex) - } - - repo := repository.IDProviderRepository() - return repo.Create(ctx, v3_sql.SQLTx(tx), &domain.IdentityProvider{ - InstanceID: idpEvent.Aggregate().InstanceID, - OrgID: orgId, - ID: idpEvent.ID, - State: domain.IDPStateActive, - Name: idpEvent.Name, - Type: gu.Ptr(domain.IDPTypeLDAP), - AllowCreation: idpEvent.IsCreationAllowed, - AllowAutoCreation: idpEvent.IsAutoCreation, - AllowAutoUpdate: idpEvent.IsAutoUpdate, - AllowLinking: idpEvent.IsLinkingAllowed, - AutoLinkingField: mapAutoLinkingField(idpEvent.AutoLinkingOption), - Payload: payloadJSON, - CreatedAt: event.CreatedAt(), - UpdatedAt: event.CreatedAt(), - }) - }), nil -} - -func (p *idpTemplateRelationalProjection) reduceLDAPIDPChanged(event eventstore.Event) (*handler.Statement, error) { - var orgId *string - var idpEvent idp.LDAPIDPChangedEvent - switch e := event.(type) { - case *org.LDAPIDPChangedEvent: - idpEvent = e.LDAPIDPChangedEvent - orgId = &idpEvent.Aggregate().ResourceOwner - case *instance.LDAPIDPChangedEvent: - idpEvent = e.LDAPIDPChangedEvent - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-p1582ks", "reduce.wrong.event.type %v", []eventstore.EventType{org.LDAPIDPChangedEventType, instance.LDAPIDPChangedEventType}) - } - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInternal(nil, "HANDL-HX6ed", "unable to cast to tx executer") - } - idpRepo := repository.IDProviderRepository() - ldap, err := idpRepo.GetLDAP(ctx, v3_sql.SQLTx(tx), database.WithCondition(idpScopedCondition(idpRepo, idpEvent.Agg.InstanceID, idpEvent.ID, orgId))) - if err != nil { - return err - } - - changes := p.reduceIDPChangedTemplateColumns(idpRepo, idpEvent.Name, idpEvent.OptionChanges) - - payload := &ldap.LDAP - payloadChanged := p.reduceLDAPIDPChangedColumns(payload, &idpEvent) - if payloadChanged { - payloadJSON, err := json.Marshal(payload) - if err != nil { - return err - } - changes = append(changes, idpRepo.SetPayload(string(payloadJSON))) - } - - changes = append(changes, idpRepo.SetUpdatedAt(gu.Ptr(event.CreatedAt()))) - _, err = idpRepo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(idpRepo, idpEvent.Aggregate().InstanceID, idpEvent.ID, orgId), changes...) - return err - - }), nil -} - -func (p *idpTemplateRelationalProjection) reduceAppleIDPAdded(event eventstore.Event) (*handler.Statement, error) { - var orgId *string - var idpEvent idp.AppleIDPAddedEvent - switch e := event.(type) { - case *org.AppleIDPAddedEvent: - idpEvent = e.AppleIDPAddedEvent - orgId = &idpEvent.Aggregate().ResourceOwner - case *instance.AppleIDPAddedEvent: - idpEvent = e.AppleIDPAddedEvent - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-YFvg3", "reduce.wrong.event.type %v", []eventstore.EventType{org.AppleIDPAddedEventType /*, instance.AppleIDPAddedEventType*/}) - } - - apple := domain.Apple{ - ClientID: idpEvent.ClientID, - TeamID: idpEvent.TeamID, - KeyID: idpEvent.KeyID, - PrivateKey: idpEvent.PrivateKey, - Scopes: idpEvent.Scopes, - } - - payloadJSON, err := json.Marshal(apple) - if err != nil { - return nil, err - } - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInvalidArgumentf(nil, "HANDL-Ku2YB", "reduce.wrong.db.pool %T", ex) - } - - repo := repository.IDProviderRepository() - return repo.Create(ctx, v3_sql.SQLTx(tx), &domain.IdentityProvider{ - InstanceID: idpEvent.Aggregate().InstanceID, - OrgID: orgId, - ID: idpEvent.ID, - State: domain.IDPStateActive, - Name: idpEvent.Name, - Type: gu.Ptr(domain.IDPTypeApple), - AllowCreation: idpEvent.IsCreationAllowed, - AllowAutoCreation: idpEvent.IsAutoCreation, - AllowAutoUpdate: idpEvent.IsAutoUpdate, - AllowLinking: idpEvent.IsLinkingAllowed, - AutoLinkingField: mapAutoLinkingField(idpEvent.AutoLinkingOption), - Payload: payloadJSON, - CreatedAt: event.CreatedAt(), - UpdatedAt: event.CreatedAt(), - }) - }), nil -} - -func (p *idpTemplateRelationalProjection) reduceAppleIDPChanged(event eventstore.Event) (*handler.Statement, error) { - var orgId *string - var idpEvent idp.AppleIDPChangedEvent - switch e := event.(type) { - case *org.AppleIDPChangedEvent: - idpEvent = e.AppleIDPChangedEvent - orgId = &idpEvent.Aggregate().ResourceOwner - case *instance.AppleIDPChangedEvent: - idpEvent = e.AppleIDPChangedEvent - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-YBez3", "reduce.wrong.event.type %v", []eventstore.EventType{org.AppleIDPChangedEventType /*, instance.AppleIDPChangedEventType*/}) - } - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInternal(nil, "HANDL-HX6ed", "unable to cast to tx executer") - } - idpRepo := repository.IDProviderRepository() - apple, err := idpRepo.GetApple(ctx, v3_sql.SQLTx(tx), database.WithCondition(idpScopedCondition(idpRepo, idpEvent.Agg.InstanceID, idpEvent.ID, orgId))) - if err != nil { - return err - } - - changes := p.reduceIDPChangedTemplateColumns(idpRepo, idpEvent.Name, idpEvent.OptionChanges) - - payload := &apple.Apple - payloadChanged := p.reduceAppleIDPChangedColumns(payload, &idpEvent) - if payloadChanged { - payloadJSON, err := json.Marshal(payload) - if err != nil { - return err - } - changes = append(changes, idpRepo.SetPayload(string(payloadJSON))) - } - - changes = append(changes, idpRepo.SetUpdatedAt(gu.Ptr(event.CreatedAt()))) - _, err = idpRepo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(idpRepo, idpEvent.Aggregate().InstanceID, idpEvent.ID, orgId), changes...) - return err - - }), nil -} - -func (p *idpTemplateRelationalProjection) reduceSAMLIDPAdded(event eventstore.Event) (*handler.Statement, error) { - var orgId *string - var idpEvent idp.SAMLIDPAddedEvent - switch e := event.(type) { - case *org.SAMLIDPAddedEvent: - idpEvent = e.SAMLIDPAddedEvent - orgId = &idpEvent.Aggregate().ResourceOwner - case *instance.SAMLIDPAddedEvent: - idpEvent = e.SAMLIDPAddedEvent - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Ys02m1", "reduce.wrong.event.type %v", []eventstore.EventType{org.SAMLIDPAddedEventType, instance.SAMLIDPAddedEventType}) - } - - saml := domain.SAML{ - Metadata: idpEvent.Metadata, - Key: idpEvent.Key, - Certificate: idpEvent.Certificate, - Binding: idpEvent.Binding, - WithSignedRequest: idpEvent.WithSignedRequest, - NameIDFormat: idpEvent.NameIDFormat, - TransientMappingAttributeName: idpEvent.TransientMappingAttributeName, - SignatureAlgorithm: idpEvent.SignatureAlgorithm, - } - - payloadJSON, err := json.Marshal(saml) - if err != nil { - return nil, err - } - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInvalidArgumentf(nil, "HANDL-ksJ3N", "reduce.wrong.db.pool %T", ex) - } - - repo := repository.IDProviderRepository() - return repo.Create(ctx, v3_sql.SQLTx(tx), &domain.IdentityProvider{ - InstanceID: idpEvent.Aggregate().InstanceID, - OrgID: orgId, - ID: idpEvent.ID, - State: domain.IDPStateActive, - Name: idpEvent.Name, - Type: gu.Ptr(domain.IDPTypeSAML), - AllowCreation: idpEvent.IsCreationAllowed, - AllowAutoCreation: idpEvent.IsAutoCreation, - AllowAutoUpdate: idpEvent.IsAutoUpdate, - AllowLinking: idpEvent.IsLinkingAllowed, - AutoLinkingField: mapAutoLinkingField(idpEvent.AutoLinkingOption), - Payload: payloadJSON, - CreatedAt: event.CreatedAt(), - UpdatedAt: event.CreatedAt(), - }) - }), nil -} - -func (p *idpTemplateRelationalProjection) reduceSAMLIDPChanged(event eventstore.Event) (*handler.Statement, error) { - var orgId *string - var idpEvent idp.SAMLIDPChangedEvent - switch e := event.(type) { - case *org.SAMLIDPChangedEvent: - idpEvent = e.SAMLIDPChangedEvent - orgId = &idpEvent.Aggregate().ResourceOwner - case *instance.SAMLIDPChangedEvent: - idpEvent = e.SAMLIDPChangedEvent - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Y7c0fii4ad", "reduce.wrong.event.type %v", []eventstore.EventType{org.SAMLIDPChangedEventType, instance.SAMLIDPChangedEventType}) - } - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, _ string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInternal(nil, "HANDL-HX6ed", "unable to cast to tx executer") - } - idpRepo := repository.IDProviderRepository() - saml, err := idpRepo.GetSAML(ctx, v3_sql.SQLTx(tx), database.WithCondition(idpScopedCondition(idpRepo, idpEvent.Agg.InstanceID, idpEvent.ID, orgId))) - if err != nil { - return err - } - - changes := p.reduceIDPChangedTemplateColumns(idpRepo, idpEvent.Name, idpEvent.OptionChanges) - - payload := &saml.SAML - payloadChanged := p.reduceSAMLIDPChangedColumns(payload, &idpEvent) - if payloadChanged { - payloadJSON, err := json.Marshal(payload) - if err != nil { - return err - } - changes = append(changes, idpRepo.SetPayload(string(payloadJSON))) - } - - changes = append(changes, idpRepo.SetUpdatedAt(gu.Ptr(event.CreatedAt()))) - _, err = idpRepo.Update(ctx, v3_sql.SQLTx(tx), idpScopedCondition(idpRepo, idpEvent.Aggregate().InstanceID, idpEvent.ID, orgId), changes...) - return err - - }), nil -} - -func (p *idpTemplateRelationalProjection) reduceIDPChangedTemplateColumns(repo domain.IDProviderRepository, name *string, optionChanges idp.OptionChanges) database.Changes { - changes := make(database.Changes, 0, 8) - if name != nil { - changes = append(changes, repo.SetName(*name)) - } - if optionChanges.IsCreationAllowed != nil { - changes = append(changes, repo.SetAllowCreation(*optionChanges.IsCreationAllowed)) - } - if optionChanges.IsLinkingAllowed != nil { - changes = append(changes, repo.SetAllowLinking(*optionChanges.IsLinkingAllowed)) - } - if optionChanges.IsAutoCreation != nil { - changes = append(changes, repo.SetAllowAutoCreation(*optionChanges.IsAutoCreation)) - } - if optionChanges.IsAutoUpdate != nil { - changes = append(changes, repo.SetAllowAutoUpdate(*optionChanges.IsAutoUpdate)) - } - if optionChanges.AutoLinkingOption != nil { - changes = append(changes, repo.SetAutoLinkingField(mapAutoLinkingField(*optionChanges.AutoLinkingOption))) - } - - return changes -} - -func (p *idpTemplateRelationalProjection) reduceOAuthIDPChangedColumns(payload *domain.OAuth, idpEvent *idp.OAuthIDPChangedEvent) bool { - payloadChanged := false - if payload == nil || idpEvent == nil { - return payloadChanged - } - - if idpEvent.ClientID != nil && *idpEvent.ClientID != payload.ClientID { - payloadChanged = true - payload.ClientID = *idpEvent.ClientID - } - if idpEvent.ClientSecret != nil { - payloadChanged = true - payload.ClientSecret = idpEvent.ClientSecret - } - if idpEvent.AuthorizationEndpoint != nil && *idpEvent.AuthorizationEndpoint != payload.AuthorizationEndpoint { - payloadChanged = true - payload.AuthorizationEndpoint = *idpEvent.AuthorizationEndpoint - } - if idpEvent.TokenEndpoint != nil && *idpEvent.TokenEndpoint != payload.TokenEndpoint { - payloadChanged = true - payload.TokenEndpoint = *idpEvent.TokenEndpoint - } - if idpEvent.UserEndpoint != nil && *idpEvent.UserEndpoint != payload.UserEndpoint { - payloadChanged = true - payload.UserEndpoint = *idpEvent.UserEndpoint - } - if idpEvent.Scopes != nil && !slices.Equal(idpEvent.Scopes, payload.Scopes) { - payloadChanged = true - payload.Scopes = idpEvent.Scopes - } - if idpEvent.IDAttribute != nil && *idpEvent.IDAttribute != payload.IDAttribute { - payloadChanged = true - payload.IDAttribute = *idpEvent.IDAttribute - } - if idpEvent.UsePKCE != nil && *idpEvent.UsePKCE != payload.UsePKCE { - payloadChanged = true - payload.UsePKCE = *idpEvent.UsePKCE - } - return payloadChanged -} - -func (p *idpTemplateRelationalProjection) reduceOIDCIDPChangedColumns(payload *domain.OIDC, idpEvent *idp.OIDCIDPChangedEvent) bool { - payloadChanged := false - if payload == nil || idpEvent == nil { - return payloadChanged - } - - if idpEvent.ClientID != nil && *idpEvent.ClientID != payload.ClientID { - payloadChanged = true - payload.ClientID = *idpEvent.ClientID - } - if idpEvent.ClientSecret != nil { - payloadChanged = true - payload.ClientSecret = idpEvent.ClientSecret - } - if idpEvent.Issuer != nil && *idpEvent.Issuer != payload.Issuer { - payloadChanged = true - payload.Issuer = *idpEvent.Issuer - } - if idpEvent.Scopes != nil && !slices.Equal(idpEvent.Scopes, payload.Scopes) { - payloadChanged = true - payload.Scopes = idpEvent.Scopes - } - if idpEvent.IsIDTokenMapping != nil && *idpEvent.IsIDTokenMapping != payload.IsIDTokenMapping { - payloadChanged = true - payload.IsIDTokenMapping = *idpEvent.IsIDTokenMapping - } - if idpEvent.UsePKCE != nil && *idpEvent.UsePKCE != payload.UsePKCE { - payloadChanged = true - payload.UsePKCE = *idpEvent.UsePKCE - } - return payloadChanged -} - -func (p *idpTemplateRelationalProjection) reduceJWTIDPChangedColumns(payload *domain.JWT, idpEvent *idp.JWTIDPChangedEvent) bool { - payloadChanged := false - if payload == nil || idpEvent == nil { - return payloadChanged - } - - if idpEvent.JWTEndpoint != nil && *idpEvent.JWTEndpoint != payload.JWTEndpoint { - payloadChanged = true - payload.JWTEndpoint = *idpEvent.JWTEndpoint - } - if idpEvent.KeysEndpoint != nil && *idpEvent.KeysEndpoint != payload.KeysEndpoint { - payloadChanged = true - payload.KeysEndpoint = *idpEvent.KeysEndpoint - } - if idpEvent.HeaderName != nil && *idpEvent.HeaderName != payload.HeaderName { - payloadChanged = true - payload.HeaderName = *idpEvent.HeaderName - } - if idpEvent.Issuer != nil && *idpEvent.Issuer != payload.Issuer { - payloadChanged = true - payload.Issuer = *idpEvent.Issuer - } - return payloadChanged -} - -func (p *idpTemplateRelationalProjection) reduceAzureADIDPChangedColumns(payload *domain.Azure, idpEvent *idp.AzureADIDPChangedEvent) (bool, error) { - payloadChanged := false - if payload == nil || idpEvent == nil { - return payloadChanged, nil - } - - if idpEvent.ClientID != nil && *idpEvent.ClientID != payload.ClientID { - payloadChanged = true - payload.ClientID = *idpEvent.ClientID - } - if idpEvent.ClientSecret != nil { - payloadChanged = true - payload.ClientSecret = idpEvent.ClientSecret - } - if idpEvent.Scopes != nil && !slices.Equal(idpEvent.Scopes, payload.Scopes) { - payloadChanged = true - payload.Scopes = idpEvent.Scopes - } - if idpEvent.Tenant != nil && *idpEvent.Tenant != payload.Tenant.String() { - payloadChanged = true - - azureTenant, err := domain.AzureTenantTypeString(*idpEvent.Tenant) - if err != nil { - return false, err - } - - payload.Tenant = azureTenant - } - if idpEvent.IsEmailVerified != nil && *idpEvent.IsEmailVerified != payload.IsEmailVerified { - payloadChanged = true - payload.IsEmailVerified = *idpEvent.IsEmailVerified - } - return payloadChanged, nil -} - -func (p *idpTemplateRelationalProjection) reduceGitHubIDPChangedColumns(payload *domain.Github, idpEvent *idp.GitHubIDPChangedEvent) bool { - payloadChanged := false - if payload == nil || idpEvent == nil { - return payloadChanged - } - - if idpEvent.ClientID != nil && *idpEvent.ClientID != payload.ClientID { - payloadChanged = true - payload.ClientID = *idpEvent.ClientID - } - if idpEvent.ClientSecret != nil { - payloadChanged = true - payload.ClientSecret = idpEvent.ClientSecret - } - if idpEvent.Scopes != nil && !slices.Equal(idpEvent.Scopes, payload.Scopes) { - payloadChanged = true - payload.Scopes = idpEvent.Scopes - } - return payloadChanged -} - -func (p *idpTemplateRelationalProjection) reduceGitHubEnterpriseIDPChangedColumns(payload *domain.GithubEnterprise, idpEvent *idp.GitHubEnterpriseIDPChangedEvent) bool { - payloadChanged := false - if payload == nil || idpEvent == nil { - return payloadChanged - } - - if idpEvent.ClientID != nil && *idpEvent.ClientID != payload.ClientID { - payloadChanged = true - payload.ClientID = *idpEvent.ClientID - } - if idpEvent.ClientSecret != nil { - payloadChanged = true - payload.ClientSecret = idpEvent.ClientSecret - } - if idpEvent.AuthorizationEndpoint != nil && *idpEvent.AuthorizationEndpoint != payload.AuthorizationEndpoint { - payloadChanged = true - payload.AuthorizationEndpoint = *idpEvent.AuthorizationEndpoint - } - if idpEvent.TokenEndpoint != nil && *idpEvent.TokenEndpoint != payload.TokenEndpoint { - payloadChanged = true - payload.TokenEndpoint = *idpEvent.TokenEndpoint - } - if idpEvent.UserEndpoint != nil && *idpEvent.UserEndpoint != payload.UserEndpoint { - payloadChanged = true - payload.UserEndpoint = *idpEvent.UserEndpoint - } - if idpEvent.Scopes != nil && !slices.Equal(idpEvent.Scopes, payload.Scopes) { - payloadChanged = true - payload.Scopes = idpEvent.Scopes - } - return payloadChanged -} - -func (p *idpTemplateRelationalProjection) reduceGitLabIDPChangedColumns(payload *domain.Gitlab, idpEvent *idp.GitLabIDPChangedEvent) bool { - payloadChanged := false - if payload == nil || idpEvent == nil { - return payloadChanged - } - - if idpEvent.ClientID != nil && *idpEvent.ClientID != payload.ClientID { - payloadChanged = true - payload.ClientID = *idpEvent.ClientID - } - if idpEvent.ClientSecret != nil { - payloadChanged = true - payload.ClientSecret = idpEvent.ClientSecret - } - if idpEvent.Scopes != nil && !slices.Equal(idpEvent.Scopes, payload.Scopes) { - payloadChanged = true - payload.Scopes = idpEvent.Scopes - } - return payloadChanged -} - -func (p *idpTemplateRelationalProjection) reduceGitLabSelfHostedIDPChangedColumns(payload *domain.GitlabSelfHosted, idpEvent *idp.GitLabSelfHostedIDPChangedEvent) bool { - payloadChanged := false - if payload == nil || idpEvent == nil { - return payloadChanged - } - - if idpEvent.ClientID != nil && *idpEvent.ClientID != payload.ClientID { - payloadChanged = true - payload.ClientID = *idpEvent.ClientID - } - if idpEvent.ClientSecret != nil { - payloadChanged = true - payload.ClientSecret = idpEvent.ClientSecret - } - if idpEvent.Issuer != nil && *idpEvent.Issuer != payload.Issuer { - payloadChanged = true - payload.Issuer = *idpEvent.Issuer - } - if idpEvent.Scopes != nil && !slices.Equal(idpEvent.Scopes, payload.Scopes) { - payloadChanged = true - payload.Scopes = idpEvent.Scopes - } - return payloadChanged -} - -func (p *idpTemplateRelationalProjection) reduceGoogleIDPChangedColumns(payload *domain.Google, idpEvent *idp.GoogleIDPChangedEvent) bool { - payloadChanged := false - if payload == nil || idpEvent == nil { - return payloadChanged - } - - if idpEvent.ClientID != nil && *idpEvent.ClientID != payload.ClientID { - payloadChanged = true - payload.ClientID = *idpEvent.ClientID - } - if idpEvent.ClientSecret != nil { - payloadChanged = true - payload.ClientSecret = idpEvent.ClientSecret - } - if idpEvent.Scopes != nil && !slices.Equal(idpEvent.Scopes, payload.Scopes) { - payloadChanged = true - payload.Scopes = idpEvent.Scopes - } - return payloadChanged -} - -//nolint:gocognit -func (p *idpTemplateRelationalProjection) reduceLDAPIDPChangedColumns(payload *domain.LDAP, idpEvent *idp.LDAPIDPChangedEvent) bool { - payloadChanged := false - if payload == nil || idpEvent == nil { - return payloadChanged - } - - if idpEvent.Servers != nil && !slices.Equal(idpEvent.Servers, payload.Servers) { - payloadChanged = true - payload.Servers = idpEvent.Servers - } - if idpEvent.StartTLS != nil && *idpEvent.StartTLS != payload.StartTLS { - payloadChanged = true - payload.StartTLS = *idpEvent.StartTLS - } - if idpEvent.BaseDN != nil && *idpEvent.BaseDN != payload.BaseDN { - payloadChanged = true - payload.BaseDN = *idpEvent.BaseDN - } - if idpEvent.BindDN != nil && *idpEvent.BindDN != payload.BindDN { - payloadChanged = true - payload.BindDN = *idpEvent.BindDN - } - if idpEvent.BindPassword != nil { - payloadChanged = true - payload.BindPassword = idpEvent.BindPassword - } - if idpEvent.UserBase != nil && *idpEvent.UserBase != payload.UserBase { - payloadChanged = true - payload.UserBase = *idpEvent.UserBase - } - if idpEvent.UserObjectClasses != nil && !slices.Equal(idpEvent.UserObjectClasses, payload.UserObjectClasses) { - payloadChanged = true - payload.UserObjectClasses = idpEvent.UserObjectClasses - } - if idpEvent.UserFilters != nil && !slices.Equal(idpEvent.UserFilters, payload.UserFilters) { - payloadChanged = true - payload.UserFilters = idpEvent.UserFilters - } - if idpEvent.Timeout != nil && *idpEvent.Timeout != payload.Timeout { - payloadChanged = true - payload.Timeout = *idpEvent.Timeout - } - if idpEvent.RootCA != nil && !slices.Equal(idpEvent.RootCA, payload.RootCA) { - payloadChanged = true - payload.RootCA = idpEvent.RootCA - } - if idpEvent.IDAttribute != nil && *idpEvent.IDAttribute != payload.IDAttribute { - payloadChanged = true - payload.IDAttribute = *idpEvent.IDAttribute - } - if idpEvent.FirstNameAttribute != nil && *idpEvent.FirstNameAttribute != payload.FirstNameAttribute { - payloadChanged = true - payload.FirstNameAttribute = *idpEvent.FirstNameAttribute - } - if idpEvent.LastNameAttribute != nil && *idpEvent.LastNameAttribute != payload.LastNameAttribute { - payloadChanged = true - payload.LastNameAttribute = *idpEvent.LastNameAttribute - } - if idpEvent.DisplayNameAttribute != nil && *idpEvent.DisplayNameAttribute != payload.DisplayNameAttribute { - payloadChanged = true - payload.DisplayNameAttribute = *idpEvent.DisplayNameAttribute - } - if idpEvent.NickNameAttribute != nil && *idpEvent.NickNameAttribute != payload.NickNameAttribute { - payloadChanged = true - payload.NickNameAttribute = *idpEvent.NickNameAttribute - } - if idpEvent.PreferredUsernameAttribute != nil && *idpEvent.PreferredUsernameAttribute != payload.PreferredUsernameAttribute { - payloadChanged = true - payload.PreferredUsernameAttribute = *idpEvent.PreferredUsernameAttribute - } - if idpEvent.EmailAttribute != nil && *idpEvent.EmailAttribute != payload.EmailAttribute { - payloadChanged = true - payload.EmailAttribute = *idpEvent.EmailAttribute - } - if idpEvent.EmailVerifiedAttribute != nil && *idpEvent.EmailVerifiedAttribute != payload.EmailVerifiedAttribute { - payloadChanged = true - payload.EmailVerifiedAttribute = *idpEvent.EmailVerifiedAttribute - } - if idpEvent.PhoneAttribute != nil && *idpEvent.PhoneAttribute != payload.PhoneAttribute { - payloadChanged = true - payload.PhoneAttribute = *idpEvent.PhoneAttribute - } - if idpEvent.PhoneVerifiedAttribute != nil && *idpEvent.PhoneVerifiedAttribute != payload.PhoneVerifiedAttribute { - payloadChanged = true - payload.PhoneVerifiedAttribute = *idpEvent.PhoneVerifiedAttribute - } - if idpEvent.PreferredLanguageAttribute != nil && *idpEvent.PreferredLanguageAttribute != payload.PreferredLanguageAttribute { - payloadChanged = true - payload.PreferredLanguageAttribute = *idpEvent.PreferredLanguageAttribute - } - if idpEvent.AvatarURLAttribute != nil && *idpEvent.AvatarURLAttribute != payload.AvatarURLAttribute { - payloadChanged = true - payload.AvatarURLAttribute = *idpEvent.AvatarURLAttribute - } - if idpEvent.ProfileAttribute != nil && *idpEvent.ProfileAttribute != payload.ProfileAttribute { - payloadChanged = true - payload.ProfileAttribute = *idpEvent.ProfileAttribute - } - return payloadChanged -} - -func (p *idpTemplateRelationalProjection) reduceAppleIDPChangedColumns(payload *domain.Apple, idpEvent *idp.AppleIDPChangedEvent) bool { - payloadChanged := false - if payload == nil || idpEvent == nil { - return payloadChanged - } - - if idpEvent.ClientID != nil && *idpEvent.ClientID != payload.ClientID { - payloadChanged = true - payload.ClientID = *idpEvent.ClientID - } - if idpEvent.TeamID != nil && *idpEvent.TeamID != payload.TeamID { - payloadChanged = true - payload.TeamID = *idpEvent.TeamID - } - if idpEvent.KeyID != nil && *idpEvent.KeyID != payload.KeyID { - payloadChanged = true - payload.KeyID = *idpEvent.KeyID - } - if idpEvent.PrivateKey != nil { - payloadChanged = true - payload.PrivateKey = idpEvent.PrivateKey - } - if idpEvent.Scopes != nil && !slices.Equal(idpEvent.Scopes, payload.Scopes) { - payloadChanged = true - payload.Scopes = idpEvent.Scopes - } - return payloadChanged -} - -func (p *idpTemplateRelationalProjection) reduceSAMLIDPChangedColumns(payload *domain.SAML, idpEvent *idp.SAMLIDPChangedEvent) bool { - payloadChanged := false - if payload == nil || idpEvent == nil { - return payloadChanged - } - - if idpEvent.Metadata != nil && !slices.Equal(idpEvent.Metadata, payload.Metadata) { - payloadChanged = true - payload.Metadata = idpEvent.Metadata - } - if idpEvent.Key != nil { - payloadChanged = true - payload.Key = idpEvent.Key - } - if idpEvent.Certificate != nil && !slices.Equal(idpEvent.Certificate, payload.Certificate) { - payloadChanged = true - payload.Certificate = idpEvent.Certificate - } - if idpEvent.Binding != nil && *idpEvent.Binding != payload.Binding { - payloadChanged = true - payload.Binding = *idpEvent.Binding - } - if idpEvent.WithSignedRequest != nil && *idpEvent.WithSignedRequest != payload.WithSignedRequest { - payloadChanged = true - payload.WithSignedRequest = *idpEvent.WithSignedRequest - } - if idpEvent.NameIDFormat != nil && (payload.NameIDFormat == nil || *idpEvent.NameIDFormat != *payload.NameIDFormat) { - payloadChanged = true - payload.NameIDFormat = idpEvent.NameIDFormat - } - if idpEvent.TransientMappingAttributeName != nil && *idpEvent.TransientMappingAttributeName != payload.TransientMappingAttributeName { - payloadChanged = true - payload.TransientMappingAttributeName = *idpEvent.TransientMappingAttributeName - } - if idpEvent.FederatedLogoutEnabled != nil && *idpEvent.FederatedLogoutEnabled != payload.FederatedLogoutEnabled { - payloadChanged = true - payload.FederatedLogoutEnabled = *idpEvent.FederatedLogoutEnabled - } - if idpEvent.SignatureAlgorithm != nil && *idpEvent.SignatureAlgorithm != payload.SignatureAlgorithm { - payloadChanged = true - payload.SignatureAlgorithm = *idpEvent.SignatureAlgorithm - } - return payloadChanged -} diff --git a/internal/query/projection/instance_domain_relational.go b/internal/query/projection/instance_domain_relational.go index 05abdedf4..2bf9a608c 100644 --- a/internal/query/projection/instance_domain_relational.go +++ b/internal/query/projection/instance_domain_relational.go @@ -16,47 +16,7 @@ import ( "github.com/zitadel/zitadel/internal/zerrors" ) -type instanceDomainRelationalProjection struct{} - -func newInstanceDomainRelationalProjection(ctx context.Context, config handler.Config) *handler.Handler { - return handler.NewHandler(ctx, &config, new(instanceDomainRelationalProjection)) -} - -func (*instanceDomainRelationalProjection) Name() string { - return "zitadel.instance_domains" -} - -func (p *instanceDomainRelationalProjection) Reducers() []handler.AggregateReducer { - return []handler.AggregateReducer{ - { - Aggregate: instance.AggregateType, - EventReducers: []handler.EventReducer{ - { - Event: instance.InstanceDomainAddedEventType, - Reduce: p.reduceCustomDomainAdded, - }, - { - Event: instance.InstanceDomainPrimarySetEventType, - Reduce: p.reduceDomainPrimarySet, - }, - { - Event: instance.InstanceDomainRemovedEventType, - Reduce: p.reduceCustomDomainRemoved, - }, - { - Event: instance.TrustedDomainAddedEventType, - Reduce: p.reduceTrustedDomainAdded, - }, - { - Event: instance.TrustedDomainRemovedEventType, - Reduce: p.reduceTrustedDomainRemoved, - }, - }, - }, - } -} - -func (p *instanceDomainRelationalProjection) reduceCustomDomainAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceCustomInstanceDomainAdded(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*instance.DomainAddedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-DU0xF", "reduce.wrong.event.type %s", instance.InstanceDomainAddedEventType) @@ -78,7 +38,7 @@ func (p *instanceDomainRelationalProjection) reduceCustomDomainAdded(event event }), nil } -func (p *instanceDomainRelationalProjection) reduceDomainPrimarySet(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceInstanceDomainPrimarySet(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*instance.DomainPrimarySetEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-TdEWA", "reduce.wrong.event.type %s", instance.InstanceDomainPrimarySetEventType) @@ -103,7 +63,7 @@ func (p *instanceDomainRelationalProjection) reduceDomainPrimarySet(event events }), nil } -func (p *instanceDomainRelationalProjection) reduceCustomDomainRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceCustomInstanceDomainRemoved(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*instance.DomainRemovedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Hhcdl", "reduce.wrong.event.type %s", instance.InstanceDomainRemovedEventType) @@ -125,7 +85,7 @@ func (p *instanceDomainRelationalProjection) reduceCustomDomainRemoved(event eve }), nil } -func (p *instanceDomainRelationalProjection) reduceTrustedDomainAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceTrustedInstanceDomainAdded(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*instance.TrustedDomainAddedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-svHDh", "reduce.wrong.event.type %s", instance.TrustedDomainAddedEventType) @@ -145,7 +105,7 @@ func (p *instanceDomainRelationalProjection) reduceTrustedDomainAdded(event even }), nil } -func (p *instanceDomainRelationalProjection) reduceTrustedDomainRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceTrustedInstanceDomainRemoved(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*instance.TrustedDomainRemovedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-4K74E", "reduce.wrong.event.type %s", instance.TrustedDomainRemovedEventType) diff --git a/internal/query/projection/instance_domain_relational_test.go b/internal/query/projection/instance_domain_relational_test.go index c209377db..73f14aae0 100644 --- a/internal/query/projection/instance_domain_relational_test.go +++ b/internal/query/projection/instance_domain_relational_test.go @@ -15,7 +15,7 @@ import ( ) func TestInstanceDomainReducers(t *testing.T) { - handler := &instanceDomainRelationalProjection{} + handler := &relationalTablesProjection{} rawTx, tx := getTransactions(t) t.Cleanup(func() { diff --git a/internal/query/projection/instance_relational.go b/internal/query/projection/instance_relational.go index 7c2f77a02..35d5dce63 100644 --- a/internal/query/projection/instance_relational.go +++ b/internal/query/projection/instance_relational.go @@ -14,62 +14,12 @@ import ( "github.com/zitadel/zitadel/internal/zerrors" ) -const InstanceRelationalProjectionTable = "zitadel.instances" - -type instanceRelationalProjection struct{} - -func newInstanceRelationalProjection(ctx context.Context, config handler.Config) *handler.Handler { - return handler.NewHandler(ctx, &config, new(instanceRelationalProjection)) -} - -func (*instanceRelationalProjection) Name() string { - return InstanceRelationalProjectionTable -} - -func (p *instanceRelationalProjection) Reducers() []handler.AggregateReducer { - return []handler.AggregateReducer{ - { - Aggregate: instance.AggregateType, - EventReducers: []handler.EventReducer{ - { - Event: instance.InstanceAddedEventType, - Reduce: p.reduceInstanceAdded, - }, - { - Event: instance.InstanceChangedEventType, - Reduce: p.reduceInstanceChanged, - }, - { - Event: instance.InstanceRemovedEventType, - Reduce: p.reduceInstanceDelete, - }, - { - Event: instance.DefaultOrgSetEventType, - Reduce: p.reduceDefaultOrgSet, - }, - { - Event: instance.ProjectSetEventType, - Reduce: p.reduceIAMProjectSet, - }, - { - Event: instance.ManagementConsoleSetEventType, - Reduce: p.reduceManagementConsoleSet, - }, - { - Event: instance.DefaultLanguageSetEventType, - Reduce: p.reduceDefaultLanguageSet, - }, - }, - }, - } -} - -func (p *instanceRelationalProjection) reduceInstanceAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceInstanceAdded(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*instance.InstanceAddedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-29nRr", "reduce.wrong.event.type %s", instance.InstanceAddedEventType) } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-rVUyy", "reduce.wrong.db.pool %T", ex) @@ -83,12 +33,12 @@ func (p *instanceRelationalProjection) reduceInstanceAdded(event eventstore.Even }), nil } -func (p *instanceRelationalProjection) reduceInstanceChanged(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceInstanceChanged(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*instance.InstanceChangedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-so2am1", "reduce.wrong.event.type %s", instance.InstanceChangedEventType) } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-rVUyy", "reduce.wrong.db.pool %T", ex) @@ -98,12 +48,12 @@ func (p *instanceRelationalProjection) reduceInstanceChanged(event eventstore.Ev }), nil } -func (p *instanceRelationalProjection) reduceInstanceDelete(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceInstanceDelete(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*instance.InstanceRemovedEvent) if !ok { - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-so2am1", "reduce.wrong.event.type %s", instance.InstanceChangedEventType) + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-so2am1", "reduce.wrong.event.type %s", instance.InstanceRemovedEventType) } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-rVUyy", "reduce.wrong.db.pool %T", ex) @@ -113,13 +63,13 @@ func (p *instanceRelationalProjection) reduceInstanceDelete(event eventstore.Eve }), nil } -func (p *instanceRelationalProjection) reduceDefaultOrgSet(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceDefaultOrgSet(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*instance.DefaultOrgSetEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-2n9f2", "reduce.wrong.event.type %s", instance.DefaultOrgSetEventType) } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-rVUyy", "reduce.wrong.db.pool %T", ex) @@ -129,13 +79,13 @@ func (p *instanceRelationalProjection) reduceDefaultOrgSet(event eventstore.Even }), nil } -func (p *instanceRelationalProjection) reduceIAMProjectSet(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceIAMProjectSet(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*instance.ProjectSetEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-30o0e", "reduce.wrong.event.type %s", instance.ProjectSetEventType) } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-rVUyy", "reduce.wrong.db.pool %T", ex) @@ -145,13 +95,13 @@ func (p *instanceRelationalProjection) reduceIAMProjectSet(event eventstore.Even }), nil } -func (p *instanceRelationalProjection) reduceManagementConsoleSet(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceManagementConsoleSet(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*instance.ManagementConsoleSetEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Dgf11", "reduce.wrong.event.type %s", instance.ManagementConsoleSetEventType) } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-rVUyy", "reduce.wrong.db.pool %T", ex) @@ -161,13 +111,13 @@ func (p *instanceRelationalProjection) reduceManagementConsoleSet(event eventsto }), nil } -func (p *instanceRelationalProjection) reduceDefaultLanguageSet(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceDefaultLanguageSet(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*instance.DefaultLanguageSetEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-30o0e", "reduce.wrong.event.type %s", instance.DefaultLanguageSetEventType) } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-rVUyy", "reduce.wrong.db.pool %T", ex) @@ -177,7 +127,7 @@ func (p *instanceRelationalProjection) reduceDefaultLanguageSet(event eventstore }), nil } -func (p *instanceRelationalProjection) updateInstance(ctx context.Context, tx database.Transaction, event eventstore.Event, repo domain.InstanceRepository, changes ...database.Change) error { +func (p *relationalTablesProjection) updateInstance(ctx context.Context, tx database.Transaction, event eventstore.Event, repo domain.InstanceRepository, changes ...database.Change) error { _, err := repo.Update(ctx, tx, event.Aggregate().ID, changes...) if err != nil { return err diff --git a/internal/query/projection/org_domain_relational.go b/internal/query/projection/org_domain_relational.go index 754969f05..2374ae90b 100644 --- a/internal/query/projection/org_domain_relational.go +++ b/internal/query/projection/org_domain_relational.go @@ -14,52 +14,12 @@ import ( "github.com/zitadel/zitadel/internal/zerrors" ) -type orgDomainRelationalProjection struct{} - -func newOrgDomainRelationalProjection(ctx context.Context, config handler.Config) *handler.Handler { - return handler.NewHandler(ctx, &config, new(orgDomainRelationalProjection)) -} - -func (*orgDomainRelationalProjection) Name() string { - return "zitadel.org_domains" -} - -func (p *orgDomainRelationalProjection) Reducers() []handler.AggregateReducer { - return []handler.AggregateReducer{ - { - Aggregate: org.AggregateType, - EventReducers: []handler.EventReducer{ - { - Event: org.OrgDomainAddedEventType, - Reduce: p.reduceAdded, - }, - { - Event: org.OrgDomainPrimarySetEventType, - Reduce: p.reducePrimarySet, - }, - { - Event: org.OrgDomainRemovedEventType, - Reduce: p.reduceRemoved, - }, - { - Event: org.OrgDomainVerificationAddedEventType, - Reduce: p.reduceVerificationAdded, - }, - { - Event: org.OrgDomainVerifiedEventType, - Reduce: p.reduceVerified, - }, - }, - }, - } -} - -func (p *orgDomainRelationalProjection) reduceAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceOrganizationDomainAdded(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*org.DomainAddedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-ZX9Fw", "reduce.wrong.event.type %s", org.OrgDomainAddedEventType) } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-kGokE", "reduce.wrong.db.pool %T", ex) @@ -74,12 +34,12 @@ func (p *orgDomainRelationalProjection) reduceAdded(event eventstore.Event) (*ha }), nil } -func (p *orgDomainRelationalProjection) reducePrimarySet(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceOrganizationDomainPrimarySet(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*org.DomainPrimarySetEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-dmFdb", "reduce.wrong.event.type %s", org.OrgDomainPrimarySetEventType) } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-h6xF0", "reduce.wrong.db.pool %T", ex) @@ -94,12 +54,12 @@ func (p *orgDomainRelationalProjection) reducePrimarySet(event eventstore.Event) }), nil } -func (p *orgDomainRelationalProjection) reduceRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceOrganizationDomainRemoved(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*org.DomainRemovedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-MzC0n", "reduce.wrong.event.type %s", org.OrgDomainRemovedEventType) } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-X8oS8", "reduce.wrong.db.pool %T", ex) @@ -112,7 +72,7 @@ func (p *orgDomainRelationalProjection) reduceRemoved(event eventstore.Event) (* }), nil } -func (p *orgDomainRelationalProjection) reduceVerificationAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceOrganizationDomainVerificationAdded(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*org.DomainVerificationAddedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-oGzip", "reduce.wrong.event.type %s", org.OrgDomainVerificationAddedEventType) @@ -126,7 +86,7 @@ func (p *orgDomainRelationalProjection) reduceVerificationAdded(event eventstore case old_domain.OrgDomainValidationTypeUnspecified: return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-FJfKB", "reduce.unsupported.validation.type %v", e.ValidationType) } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-yF03i", "reduce.wrong.db.pool %T", ex) @@ -142,12 +102,12 @@ func (p *orgDomainRelationalProjection) reduceVerificationAdded(event eventstore }), nil } -func (p *orgDomainRelationalProjection) reduceVerified(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceOrganizationDomainVerified(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*org.DomainVerifiedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-7WrI2", "reduce.wrong.event.type %s", org.OrgDomainVerifiedEventType) } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-0ZGqC", "reduce.wrong.db.pool %T", ex) diff --git a/internal/query/projection/org_metadata_relational.go b/internal/query/projection/org_metadata_relational.go index 1e3efcf3a..b6feb99ce 100644 --- a/internal/query/projection/org_metadata_relational.go +++ b/internal/query/projection/org_metadata_relational.go @@ -14,45 +14,12 @@ import ( "github.com/zitadel/zitadel/internal/zerrors" ) -type orgMetadataRelationalProjection struct{} - -func newOrgMetadataRelationalProjection(ctx context.Context, config handler.Config) *handler.Handler { - return handler.NewHandler(ctx, &config, new(orgMetadataRelationalProjection)) -} - -func (*orgMetadataRelationalProjection) Name() string { - return "zitadel.org_metadata" -} - -func (p *orgMetadataRelationalProjection) Reducers() []handler.AggregateReducer { - return []handler.AggregateReducer{ - { - Aggregate: org.AggregateType, - EventReducers: []handler.EventReducer{ - { - Event: org.MetadataSetType, - Reduce: p.reduceSet, - }, - { - Event: org.MetadataRemovedType, - Reduce: p.reduceRemoved, - }, - // This event cannot be tested because it was never used in the past - { - Event: org.MetadataRemovedAllType, - Reduce: p.reduceRemovedAll, - }, - }, - }, - } -} - -func (p *orgMetadataRelationalProjection) reduceSet(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceOrganizationMetadataSet(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*org.MetadataSetEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-xOO4e", "reduce.wrong.event.type %s", org.MetadataSetType) } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-xg4IJ", "reduce.wrong.db.pool %T", ex) @@ -70,12 +37,12 @@ func (p *orgMetadataRelationalProjection) reduceSet(event eventstore.Event) (*ha }), nil } -func (p *orgMetadataRelationalProjection) reduceRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceOrganizationMetadataRemoved(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*org.MetadataRemovedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-XE6TF", "reduce.wrong.event.type %s", org.MetadataRemovedType) } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-QKMlz", "reduce.wrong.db.pool %T", ex) @@ -92,12 +59,12 @@ func (p *orgMetadataRelationalProjection) reduceRemoved(event eventstore.Event) }), nil } -func (p *orgMetadataRelationalProjection) reduceRemovedAll(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceOrganizationMetadataRemovedAll(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*org.MetadataRemovedAllEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-EmyAe", "reduce.wrong.event.type %s", org.MetadataRemovedAllType) } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-hjEHg", "reduce.wrong.db.pool %T", ex) diff --git a/internal/query/projection/org_relational.go b/internal/query/projection/org_relational.go index 1521a3aaf..babf7f74d 100644 --- a/internal/query/projection/org_relational.go +++ b/internal/query/projection/org_relational.go @@ -9,65 +9,11 @@ import ( "github.com/zitadel/zitadel/backend/v3/storage/database/repository" "github.com/zitadel/zitadel/internal/eventstore" "github.com/zitadel/zitadel/internal/eventstore/handler/v2" - "github.com/zitadel/zitadel/internal/repository/instance" "github.com/zitadel/zitadel/internal/repository/org" "github.com/zitadel/zitadel/internal/zerrors" ) -const ( - OrgRelationProjectionTable = "zitadel.organizations" -) - -type orgRelationalProjection struct{} - -func (*orgRelationalProjection) Name() string { - return OrgRelationProjectionTable -} - -func newOrgRelationalProjection(ctx context.Context, config handler.Config) *handler.Handler { - return handler.NewHandler(ctx, &config, new(orgRelationalProjection)) -} - -func (p *orgRelationalProjection) Reducers() []handler.AggregateReducer { - return []handler.AggregateReducer{ - { - Aggregate: org.AggregateType, - EventReducers: []handler.EventReducer{ - { - Event: org.OrgAddedEventType, - Reduce: p.reduceOrgRelationalAdded, - }, - { - Event: org.OrgChangedEventType, - Reduce: p.reduceOrgRelationalChanged, - }, - { - Event: org.OrgDeactivatedEventType, - Reduce: p.reduceOrgRelationalDeactivated, - }, - { - Event: org.OrgReactivatedEventType, - Reduce: p.reduceOrgRelationalReactivated, - }, - { - Event: org.OrgRemovedEventType, - Reduce: p.reduceOrgRelationalRemoved, - }, - }, - }, - { - Aggregate: instance.AggregateType, - EventReducers: []handler.EventReducer{ - { - Event: instance.InstanceRemovedEventType, - Reduce: reduceInstanceRemovedHelper(OrgColumnInstanceID), - }, - }, - }, - } -} - -func (p *orgRelationalProjection) reduceOrgRelationalAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceOrgRelationalAdded(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*org.OrgAddedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-uYq5R", "reduce.wrong.event.type %s", org.OrgAddedEventType) @@ -91,7 +37,7 @@ func (p *orgRelationalProjection) reduceOrgRelationalAdded(event eventstore.Even }), nil } -func (p *orgRelationalProjection) reduceOrgRelationalChanged(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceOrgRelationalChanged(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*org.OrgChangedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Bg9om", "reduce.wrong.event.type %s", org.OrgChangedEventType) @@ -115,7 +61,7 @@ func (p *orgRelationalProjection) reduceOrgRelationalChanged(event eventstore.Ev }), nil } -func (p *orgRelationalProjection) reduceOrgRelationalDeactivated(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceOrgRelationalDeactivated(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*org.OrgDeactivatedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-BApK5", "reduce.wrong.event.type %s", org.OrgDeactivatedEventType) @@ -137,7 +83,7 @@ func (p *orgRelationalProjection) reduceOrgRelationalDeactivated(event eventstor }), nil } -func (p *orgRelationalProjection) reduceOrgRelationalReactivated(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceOrgRelationalReactivated(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*org.OrgReactivatedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-o38DE", "reduce.wrong.event.type %s", org.OrgReactivatedEventType) @@ -158,7 +104,7 @@ func (p *orgRelationalProjection) reduceOrgRelationalReactivated(event eventstor }), nil } -func (p *orgRelationalProjection) reduceOrgRelationalRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceOrgRelationalRemoved(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*org.OrgRemovedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-DGm9g", "reduce.wrong.event.type %s", org.OrgRemovedEventType) diff --git a/internal/query/projection/project_grant_relational.go b/internal/query/projection/project_grant_relational.go index bfc8dc6cd..dbdc01d5b 100644 --- a/internal/query/projection/project_grant_relational.go +++ b/internal/query/projection/project_grant_relational.go @@ -13,51 +13,7 @@ import ( "github.com/zitadel/zitadel/internal/zerrors" ) -type projectGrantRelationalProjection struct{} - -func (*projectGrantRelationalProjection) Name() string { - return "zitadel.project_grants" -} - -func newProjectGrantRelationalProjection(ctx context.Context, config handler.Config) *handler.Handler { - return handler.NewHandler(ctx, &config, new(projectGrantRelationalProjection)) -} - -func (p *projectGrantRelationalProjection) Reducers() []handler.AggregateReducer { - return []handler.AggregateReducer{ - { - Aggregate: project.AggregateType, - EventReducers: []handler.EventReducer{ - { - Event: project.GrantAddedType, - Reduce: p.reduceProjectGrantAdded, - }, - { - Event: project.GrantChangedType, - Reduce: p.reduceProjectGrantChanged, - }, - { - Event: project.GrantCascadeChangedType, - Reduce: p.reduceProjectGrantCascadeChanged, - }, - { - Event: project.GrantDeactivatedType, - Reduce: p.reduceProjectGrantDeactivated, - }, - { - Event: project.GrantReactivatedType, - Reduce: p.reduceProjectGrantReactivated, - }, - { - Event: project.GrantRemovedType, - Reduce: p.reduceProjectGrantRemoved, - }, - }, - }, - } -} - -func (p *projectGrantRelationalProjection) reduceProjectGrantAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceProjectGrantAdded(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*project.GrantAddedEvent) if !ok { return nil, zerrors.ThrowInternalf(nil, "HANDL-5l2bWQrkKf", "reduce.wrong.event.type %s", project.GrantAddedType) @@ -82,7 +38,7 @@ func (p *projectGrantRelationalProjection) reduceProjectGrantAdded(event eventst }), nil } -func (p *projectGrantRelationalProjection) reduceProjectGrantChanged(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceProjectGrantChanged(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*project.GrantChangedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-I2ciunHcy7", "reduce.wrong.event.type %s", project.GrantChangedType) @@ -102,7 +58,7 @@ func (p *projectGrantRelationalProjection) reduceProjectGrantChanged(event event }), nil } -func (p *projectGrantRelationalProjection) reduceProjectGrantCascadeChanged(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceProjectGrantCascadeChanged(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*project.GrantCascadeChangedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-osXtu6jnWa", "reduce.wrong.event.type %s", project.GrantCascadeChangedType) @@ -122,7 +78,7 @@ func (p *projectGrantRelationalProjection) reduceProjectGrantCascadeChanged(even }), nil } -func (p *projectGrantRelationalProjection) reduceProjectGrantDeactivated(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceProjectGrantDeactivated(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*project.GrantDeactivateEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-XraL17MUkr", "reduce.wrong.event.type %s", project.GrantDeactivatedType) @@ -143,7 +99,7 @@ func (p *projectGrantRelationalProjection) reduceProjectGrantDeactivated(event e }), nil } -func (p *projectGrantRelationalProjection) reduceProjectGrantReactivated(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceProjectGrantReactivated(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*project.GrantReactivatedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-vGUHp6uHJ7", "reduce.wrong.event.type %s", project.GrantReactivatedType) @@ -164,7 +120,7 @@ func (p *projectGrantRelationalProjection) reduceProjectGrantReactivated(event e }), nil } -func (p *projectGrantRelationalProjection) reduceProjectGrantRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceProjectGrantRemoved(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*project.GrantRemovedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-MVPgtdg1w5", "reduce.wrong.event.type %s", project.GrantRemovedType) diff --git a/internal/query/projection/project_relational.go b/internal/query/projection/project_relational.go index 60ef0068d..4e97b955d 100644 --- a/internal/query/projection/project_relational.go +++ b/internal/query/projection/project_relational.go @@ -14,47 +14,7 @@ import ( "github.com/zitadel/zitadel/internal/zerrors" ) -type projectRelationalProjection struct{} - -func (*projectRelationalProjection) Name() string { - return "zitadel.projects" -} - -func newProjectRelationalProjection(ctx context.Context, config handler.Config) *handler.Handler { - return handler.NewHandler(ctx, &config, new(projectRelationalProjection)) -} - -func (p *projectRelationalProjection) Reducers() []handler.AggregateReducer { - return []handler.AggregateReducer{ - { - Aggregate: project.AggregateType, - EventReducers: []handler.EventReducer{ - { - Event: project.ProjectAddedType, - Reduce: p.reduceProjectAdded, - }, - { - Event: project.ProjectChangedType, - Reduce: p.reduceProjectChanged, - }, - { - Event: project.ProjectDeactivatedType, - Reduce: p.reduceProjectDeactivated, - }, - { - Event: project.ProjectReactivatedType, - Reduce: p.reduceProjectReactivated, - }, - { - Event: project.ProjectRemovedType, - Reduce: p.reduceProjectRemoved, - }, - }, - }, - } -} - -func (p *projectRelationalProjection) reduceProjectAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceProjectAdded(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*project.ProjectAddedEvent) if !ok { return nil, zerrors.ThrowInternalf(nil, "HANDL-Oox5e", "reduce.wrong.event.type %s", project.ProjectAddedType) @@ -81,7 +41,7 @@ func (p *projectRelationalProjection) reduceProjectAdded(event eventstore.Event) }), nil } -func (p *projectRelationalProjection) reduceProjectChanged(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceProjectChanged(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*project.ProjectChangeEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Oox5e", "reduce.wrong.event.type %s", project.ProjectChangedType) @@ -121,7 +81,7 @@ func (p *projectRelationalProjection) reduceProjectChanged(event eventstore.Even }), nil } -func (p *projectRelationalProjection) reduceProjectDeactivated(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceProjectDeactivated(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*project.ProjectDeactivatedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Oox5e", "reduce.wrong.event.type %s", project.ProjectDeactivatedType) @@ -141,7 +101,7 @@ func (p *projectRelationalProjection) reduceProjectDeactivated(event eventstore. }), nil } -func (p *projectRelationalProjection) reduceProjectReactivated(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceProjectReactivated(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*project.ProjectReactivatedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-oof4U", "reduce.wrong.event.type %s", project.ProjectReactivatedType) @@ -161,7 +121,7 @@ func (p *projectRelationalProjection) reduceProjectReactivated(event eventstore. }), nil } -func (p *projectRelationalProjection) reduceProjectRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceProjectRemoved(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*project.ProjectRemovedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Xae7w", "reduce.wrong.event.type %s", project.ProjectRemovedType) diff --git a/internal/query/projection/project_role_relational.go b/internal/query/projection/project_role_relational.go index 4d8b4ce00..f6457b351 100644 --- a/internal/query/projection/project_role_relational.go +++ b/internal/query/projection/project_role_relational.go @@ -21,39 +21,7 @@ const ( ProjectRoleRelationalRoleGroupCol = "role_group" ) -type projectRoleRelationalProjection struct{} - -func (*projectRoleRelationalProjection) Name() string { - return ProjectRoleRelationalTable -} - -func newProjectRoleRelationalProjection(ctx context.Context, config handler.Config) *handler.Handler { - return handler.NewHandler(ctx, &config, new(projectRoleRelationalProjection)) -} - -func (p *projectRoleRelationalProjection) Reducers() []handler.AggregateReducer { - return []handler.AggregateReducer{ - { - Aggregate: project.AggregateType, - EventReducers: []handler.EventReducer{ - { - Event: project.RoleAddedType, - Reduce: p.reduceProjectRoleAdded, - }, - { - Event: project.RoleChangedType, - Reduce: p.reduceProjectRoleChanged, - }, - { - Event: project.RoleRemovedType, - Reduce: p.reduceProjectRoleRemoved, - }, - }, - }, - } -} - -func (p *projectRoleRelationalProjection) reduceProjectRoleAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceProjectRoleAdded(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*project.RoleAddedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-EiPa5", "reduce.wrong.event.type %s", project.RoleAddedType) @@ -85,7 +53,7 @@ func (p *projectRoleRelationalProjection) reduceProjectRoleAdded(event eventstor }), nil } -func (p *projectRoleRelationalProjection) reduceProjectRoleChanged(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceProjectRoleChanged(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*project.RoleChangedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-PieJ9", "reduce.wrong.event.type %s", project.RoleChangedType) @@ -118,7 +86,7 @@ func (p *projectRoleRelationalProjection) reduceProjectRoleChanged(event eventst }), nil } -func (p *projectRoleRelationalProjection) reduceProjectRoleRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceProjectRoleRemoved(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*project.RoleRemovedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Ei9po", "reduce.wrong.event.type %s", project.RoleRemovedType) diff --git a/internal/query/projection/projection.go b/internal/query/projection/projection.go index 227af82fb..feaca113e 100644 --- a/internal/query/projection/projection.go +++ b/internal/query/projection/projection.go @@ -89,20 +89,7 @@ var ( HostedLoginTranslationProjection *handler.Handler OrganizationSettingsProjection *handler.Handler - InstanceRelationalProjection *handler.Handler - OrganizationRelationalProjection *handler.Handler - InstanceDomainRelationalProjection *handler.Handler - OrganizationDomainRelationalProjection *handler.Handler - IDPTemplateRelationalProjection *handler.Handler - ProjectRelationalProjection *handler.Handler - ProjectRoleRelationalProjection *handler.Handler - OrganizationMetadataRelationalProjection *handler.Handler - AuthorizationRelationalProjection *handler.Handler - ProjectGrantRelationalProjection *handler.Handler - SessionRelationalProjection *handler.Handler - SettingsRelationalProjection *handler.Handler - UserRelationalProjection *handler.Handler - IDPIntentRelationalProjection *handler.Handler + RelationalTablesProjection *handler.Handler ProjectGrantFields *handler.FieldHandler OrgDomainVerifiedFields *handler.FieldHandler @@ -220,20 +207,7 @@ func Create(ctx context.Context, sqlClient *database.DB, es handler.EventStore, GroupProjection = newGroupProjection(ctx, applyCustomConfig(projectionConfig, config.Customizations["groups"])) GroupUsersProjection = newGroupUsersProjection(ctx, applyCustomConfig(projectionConfig, config.Customizations["group_users"])) - InstanceRelationalProjection = newInstanceRelationalProjection(ctx, applyCustomConfig(projectionConfig, config.Customizations["instances_relational"])) - OrganizationRelationalProjection = newOrgRelationalProjection(ctx, applyCustomConfig(projectionConfig, config.Customizations["organizations_relational"])) - InstanceDomainRelationalProjection = newInstanceDomainRelationalProjection(ctx, applyCustomConfig(projectionConfig, config.Customizations["instance_domains_relational"])) - OrganizationDomainRelationalProjection = newOrgDomainRelationalProjection(ctx, applyCustomConfig(projectionConfig, config.Customizations["organization_domains_relational"])) - SettingsRelationalProjection = newSettingsRelationalProjection(ctx, applyCustomConfig(projectionConfig, config.Customizations["settings_relational"])) - IDPTemplateRelationalProjection = newIDPTemplateRelationalProjection(ctx, applyCustomConfig(projectionConfig, config.Customizations["idp_templates_relational"])) - ProjectRelationalProjection = newProjectRelationalProjection(ctx, applyCustomConfig(projectionConfig, config.Customizations["projects_relational"])) - ProjectRoleRelationalProjection = newProjectRoleRelationalProjection(ctx, applyCustomConfig(projectionConfig, config.Customizations["project_roles_relational"])) - OrganizationMetadataRelationalProjection = newOrgMetadataRelationalProjection(ctx, applyCustomConfig(projectionConfig, config.Customizations["organization_metadata_relational"])) - AuthorizationRelationalProjection = newAuthorizationRelationalProjection(ctx, applyCustomConfig(projectionConfig, config.Customizations["authorizations_relational"])) - ProjectGrantRelationalProjection = newProjectGrantRelationalProjection(ctx, applyCustomConfig(projectionConfig, config.Customizations["project_grant_relational"])) - SessionRelationalProjection = newSessionRelationalProjection(ctx, applyCustomConfig(projectionConfig, config.Customizations["session_relational"])) - UserRelationalProjection = newUserRelationalProjection(ctx, applyCustomConfig(projectionConfig, config.Customizations["user_relational"])) - IDPIntentRelationalProjection = newIDPIntentRelationalProjection(ctx, applyCustomConfig(projectionConfig, config.Customizations["idp_intent_relational"])) + RelationalTablesProjection = newRelationalTablesProjection(ctx, applyCustomConfig(projectionConfig, config.Customizations["relational_tables"])) newProjectionsList() newFieldsList() @@ -419,19 +393,6 @@ func newProjectionsList() { GroupProjection, GroupUsersProjection, - InstanceRelationalProjection, - OrganizationRelationalProjection, - InstanceDomainRelationalProjection, - OrganizationDomainRelationalProjection, - SettingsRelationalProjection, - IDPTemplateRelationalProjection, - ProjectRelationalProjection, - ProjectRoleRelationalProjection, - OrganizationMetadataRelationalProjection, - UserRelationalProjection, - AuthorizationRelationalProjection, - ProjectGrantRelationalProjection, - SessionRelationalProjection, - IDPIntentRelationalProjection, + RelationalTablesProjection, } } diff --git a/internal/query/projection/relational_table.go b/internal/query/projection/relational_table.go new file mode 100644 index 000000000..6d51e84bd --- /dev/null +++ b/internal/query/projection/relational_table.go @@ -0,0 +1,1378 @@ +package projection + +import ( + "context" + + "github.com/zitadel/zitadel/internal/eventstore/handler/v2" + "github.com/zitadel/zitadel/internal/repository/idpintent" + "github.com/zitadel/zitadel/internal/repository/instance" + "github.com/zitadel/zitadel/internal/repository/org" + settings "github.com/zitadel/zitadel/internal/repository/organization_settings" + "github.com/zitadel/zitadel/internal/repository/project" + "github.com/zitadel/zitadel/internal/repository/session" + "github.com/zitadel/zitadel/internal/repository/user" + "github.com/zitadel/zitadel/internal/repository/usergrant" +) + +type relationalTablesProjection struct{} + +func newRelationalTablesProjection(ctx context.Context, config handler.Config) *handler.Handler { + return handler.NewHandler(ctx, &config, new(relationalTablesProjection)) +} + +func (*relationalTablesProjection) Name() string { + return "relational_tables" +} + +func (p *relationalTablesProjection) Reducers() []handler.AggregateReducer { + return []handler.AggregateReducer{ + { + Aggregate: instance.AggregateType, + EventReducers: []handler.EventReducer{ + { + Event: instance.InstanceAddedEventType, + Reduce: p.reduceInstanceAdded, + }, + { + Event: instance.InstanceChangedEventType, + Reduce: p.reduceInstanceChanged, + }, + { + Event: instance.InstanceRemovedEventType, + Reduce: p.reduceInstanceDelete, + }, + { + Event: instance.DefaultOrgSetEventType, + Reduce: p.reduceDefaultOrgSet, + }, + { + Event: instance.ProjectSetEventType, + Reduce: p.reduceIAMProjectSet, + }, + { + Event: instance.ManagementConsoleSetEventType, + Reduce: p.reduceManagementConsoleSet, + }, + { + Event: instance.DefaultLanguageSetEventType, + Reduce: p.reduceDefaultLanguageSet, + }, + + // settings + // Login + { + Event: instance.LoginPolicyAddedEventType, + Reduce: p.reduceLoginPolicyAdded, + }, + { + Event: instance.LoginPolicyChangedEventType, + Reduce: p.reduceLoginPolicyChanged, + }, + { + Event: instance.LoginPolicyMultiFactorAddedEventType, + Reduce: p.reduceLoginPolicyMFAAdded, + }, + { + Event: instance.LoginPolicyMultiFactorRemovedEventType, + Reduce: p.reduceLoginPolicyMFARemoved, + }, + { + Event: instance.LoginPolicySecondFactorAddedEventType, + Reduce: p.reduceLoginPolicySecondFactorAdded, + }, + { + Event: instance.LoginPolicySecondFactorRemovedEventType, + Reduce: p.reduceLoginPolicySecondFactorRemoved, + }, + // Label + { + Event: instance.LabelPolicyAddedEventType, + Reduce: p.reduceLabelPolicyAdded, + }, + { + Event: instance.LabelPolicyChangedEventType, + Reduce: p.reduceLabelPolicyChanged, + }, + { + Event: instance.LabelPolicyActivatedEventType, + Reduce: p.reduceLabelPolicyActivated, + }, + { + Event: instance.LabelPolicyLogoAddedEventType, + Reduce: p.reduceLabelPolicyLogoAdded, + }, + { + Event: instance.LabelPolicyLogoRemovedEventType, + Reduce: p.reduceLabelPolicyLogoRemoved, + }, + { + Event: instance.LabelPolicyLogoDarkAddedEventType, + Reduce: p.reduceLabelPolicyLogoDarkAdded, + }, + { + Event: instance.LabelPolicyLogoDarkRemovedEventType, + Reduce: p.reduceLabelPolicyLogoDarkRemoved, + }, + { + Event: instance.LabelPolicyIconAddedEventType, + Reduce: p.reduceLabelPolicyIconAdded, + }, + { + Event: instance.LabelPolicyIconRemovedEventType, + Reduce: p.reduceLabelPolicyIconRemoved, + }, + { + Event: instance.LabelPolicyIconDarkAddedEventType, + Reduce: p.reduceLabelPolicyIconDarkAdded, + }, + { + Event: instance.LabelPolicyIconDarkRemovedEventType, + Reduce: p.reduceLabelPolicyIconDarkRemoved, + }, + { + Event: instance.LabelPolicyFontAddedEventType, + Reduce: p.reduceLabelPolicyFontAdded, + }, + { + Event: instance.LabelPolicyFontRemovedEventType, + Reduce: p.reduceLabelPolicyFontRemoved, + }, + // Password Complexity + { + Event: instance.PasswordComplexityPolicyAddedEventType, + Reduce: p.reducePasswordComplexityPolicyAdded, + }, + { + Event: instance.PasswordComplexityPolicyChangedEventType, + Reduce: p.reducePasswordComplexityPolicyChanged, + }, + // Password Policy + { + Event: instance.PasswordAgePolicyAddedEventType, + Reduce: p.reducePasswordAgePolicyAdded, + }, + { + Event: instance.PasswordAgePolicyChangedEventType, + Reduce: p.reducePasswordAgePolicyChanged, + }, + // Lockout Policy + { + Event: instance.LockoutPolicyAddedEventType, + Reduce: p.reduceLockoutPolicyAdded, + }, + { + Event: instance.LockoutPolicyChangedEventType, + Reduce: p.reduceLockoutPolicyChanged, + }, + // Domain Policy + { + Event: instance.DomainPolicyAddedEventType, + Reduce: p.reduceDomainPolicyAdded, + }, + { + Event: instance.DomainPolicyChangedEventType, + Reduce: p.reduceDomainPolicyChanged, + }, + // Security Policy + { + Event: instance.SecurityPolicySetEventType, + Reduce: p.reduceSecurityPolicySet, + }, + // Notification + { + Event: instance.NotificationPolicyAddedEventType, + Reduce: p.reduceNotificationPolicyAdded, + }, + { + Event: instance.NotificationPolicyChangedEventType, + Reduce: p.reduceNotificationPolicyChanged, + }, + // Privacy policy + { + Event: instance.PrivacyPolicyAddedEventType, + Reduce: p.reducePrivacyPolicyAdded, + }, + { + Event: instance.PrivacyPolicyChangedEventType, + Reduce: p.reducePrivacyPolicyChanged, + }, + // Secret Generator + { + Event: instance.SecretGeneratorAddedEventType, + Reduce: p.reduceSecretGeneratorAdded, + }, + { + Event: instance.SecretGeneratorChangedEventType, + Reduce: p.reduceSecretGeneratorChanged, + }, + { + Event: instance.SecretGeneratorRemovedEventType, + Reduce: p.reduceSecretGeneratorRemoved, + }, + + // domains + { + Event: instance.InstanceDomainAddedEventType, + Reduce: p.reduceCustomInstanceDomainAdded, + }, + { + Event: instance.InstanceDomainPrimarySetEventType, + Reduce: p.reduceInstanceDomainPrimarySet, + }, + { + Event: instance.InstanceDomainRemovedEventType, + Reduce: p.reduceCustomInstanceDomainRemoved, + }, + { + Event: instance.TrustedDomainAddedEventType, + Reduce: p.reduceTrustedInstanceDomainAdded, + }, + { + Event: instance.TrustedDomainRemovedEventType, + Reduce: p.reduceTrustedInstanceDomainRemoved, + }, + + // IDP + { + Event: instance.IDPConfigAddedEventType, + Reduce: p.reduceIDPAdded, + }, + { + Event: instance.IDPConfigChangedEventType, + Reduce: p.reduceIDPChanged, + }, + { + Event: instance.IDPConfigDeactivatedEventType, + Reduce: p.reduceIDPDeactivated, + }, + { + Event: instance.IDPConfigReactivatedEventType, + Reduce: p.reduceIDPReactivated, + }, + { + Event: instance.IDPConfigRemovedEventType, + Reduce: p.reduceIDPRemoved, + }, + { + Event: instance.IDPOIDCConfigAddedEventType, + Reduce: p.reduceOIDCConfigAdded, + }, + { + Event: instance.IDPOIDCConfigChangedEventType, + Reduce: p.reduceOIDCConfigChanged, + }, + { + Event: instance.IDPJWTConfigAddedEventType, + Reduce: p.reduceJWTConfigAdded, + }, + { + Event: instance.IDPJWTConfigChangedEventType, + Reduce: p.reduceJWTConfigChanged, + }, + { + Event: instance.OAuthIDPAddedEventType, + Reduce: p.reduceOAuthIDPAdded, + }, + { + Event: instance.OAuthIDPChangedEventType, + Reduce: p.reduceOAuthIDPChanged, + }, + { + Event: instance.OIDCIDPAddedEventType, + Reduce: p.reduceOIDCIDPAdded, + }, + { + Event: instance.OIDCIDPChangedEventType, + Reduce: p.reduceOIDCIDPChanged, + }, + { + Event: instance.OIDCIDPMigratedAzureADEventType, + Reduce: p.reduceOIDCIDPMigratedAzureAD, + }, + { + Event: instance.OIDCIDPMigratedGoogleEventType, + Reduce: p.reduceOIDCIDPMigratedGoogle, + }, + { + Event: instance.JWTIDPAddedEventType, + Reduce: p.reduceJWTIDPAdded, + }, + { + Event: instance.JWTIDPChangedEventType, + Reduce: p.reduceJWTIDPChanged, + }, + { + Event: instance.AzureADIDPAddedEventType, + Reduce: p.reduceAzureADIDPAdded, + }, + { + Event: instance.AzureADIDPChangedEventType, + Reduce: p.reduceAzureADIDPChanged, + }, + { + Event: instance.GitHubIDPAddedEventType, + Reduce: p.reduceGitHubIDPAdded, + }, + { + Event: instance.GitHubIDPChangedEventType, + Reduce: p.reduceGitHubIDPChanged, + }, + { + Event: instance.GitHubEnterpriseIDPAddedEventType, + Reduce: p.reduceGitHubEnterpriseIDPAdded, + }, + { + Event: instance.GitHubEnterpriseIDPChangedEventType, + Reduce: p.reduceGitHubEnterpriseIDPChanged, + }, + { + Event: instance.GitLabIDPAddedEventType, + Reduce: p.reduceGitLabIDPAdded, + }, + { + Event: instance.GitLabIDPChangedEventType, + Reduce: p.reduceGitLabIDPChanged, + }, + { + Event: instance.GitLabSelfHostedIDPAddedEventType, + Reduce: p.reduceGitLabSelfHostedIDPAdded, + }, + { + Event: instance.GitLabSelfHostedIDPChangedEventType, + Reduce: p.reduceGitLabSelfHostedIDPChanged, + }, + { + Event: instance.GoogleIDPAddedEventType, + Reduce: p.reduceGoogleIDPAdded, + }, + { + Event: instance.GoogleIDPChangedEventType, + Reduce: p.reduceGoogleIDPChanged, + }, + { + Event: instance.LDAPIDPAddedEventType, + Reduce: p.reduceLDAPIDPAdded, + }, + { + Event: instance.LDAPIDPChangedEventType, + Reduce: p.reduceLDAPIDPChanged, + }, + { + Event: instance.AppleIDPAddedEventType, + Reduce: p.reduceAppleIDPAdded, + }, + { + Event: instance.AppleIDPChangedEventType, + Reduce: p.reduceAppleIDPChanged, + }, + { + Event: instance.SAMLIDPAddedEventType, + Reduce: p.reduceSAMLIDPAdded, + }, + { + Event: instance.SAMLIDPChangedEventType, + Reduce: p.reduceSAMLIDPChanged, + }, + { + Event: instance.IDPRemovedEventType, + Reduce: p.reduceIDPRemoved, + }, + }, + }, + { + Aggregate: org.AggregateType, + EventReducers: []handler.EventReducer{ + { + Event: org.OrgAddedEventType, + Reduce: p.reduceOrgRelationalAdded, + }, + { + Event: org.OrgChangedEventType, + Reduce: p.reduceOrgRelationalChanged, + }, + { + Event: org.OrgDeactivatedEventType, + Reduce: p.reduceOrgRelationalDeactivated, + }, + { + Event: org.OrgReactivatedEventType, + Reduce: p.reduceOrgRelationalReactivated, + }, + { + Event: org.OrgRemovedEventType, + Reduce: p.reduceOrgRelationalRemoved, + }, + + // metadata + { + Event: org.MetadataSetType, + Reduce: p.reduceOrganizationMetadataSet, + }, + { + Event: org.MetadataRemovedType, + Reduce: p.reduceOrganizationMetadataRemoved, + }, + { + Event: org.MetadataRemovedAllType, + Reduce: p.reduceOrganizationMetadataRemovedAll, + }, + + // domains + { + Event: org.OrgDomainAddedEventType, + Reduce: p.reduceOrganizationDomainAdded, + }, + { + Event: org.OrgDomainPrimarySetEventType, + Reduce: p.reduceOrganizationDomainPrimarySet, + }, + { + Event: org.OrgDomainRemovedEventType, + Reduce: p.reduceOrganizationDomainRemoved, + }, + { + Event: org.OrgDomainVerificationAddedEventType, + Reduce: p.reduceOrganizationDomainVerificationAdded, + }, + { + Event: org.OrgDomainVerifiedEventType, + Reduce: p.reduceOrganizationDomainVerified, + }, + + // settings + // Login + { + Event: org.LoginPolicyAddedEventType, + Reduce: p.reduceLoginPolicyAdded, + }, + { + Event: org.LoginPolicyChangedEventType, + Reduce: p.reduceLoginPolicyChanged, + }, + { + Event: org.LoginPolicyRemovedEventType, + Reduce: p.reduceLoginPolicyRemoved, + }, + { + Event: org.LoginPolicyMultiFactorAddedEventType, + Reduce: p.reduceLoginPolicyMFAAdded, + }, + { + Event: org.LoginPolicyMultiFactorRemovedEventType, + Reduce: p.reduceLoginPolicyMFARemoved, + }, + { + Event: org.LoginPolicySecondFactorAddedEventType, + Reduce: p.reduceLoginPolicySecondFactorAdded, + }, + { + Event: org.LoginPolicySecondFactorRemovedEventType, + Reduce: p.reduceLoginPolicySecondFactorRemoved, + }, + // label + { + Event: org.LabelPolicyAddedEventType, + Reduce: p.reduceLabelPolicyAdded, + }, + { + Event: org.LabelPolicyChangedEventType, + Reduce: p.reduceLabelPolicyChanged, + }, + { + Event: org.LabelPolicyRemovedEventType, + Reduce: p.reduceLabelPolicyRemoved, + }, + { + Event: org.LabelPolicyActivatedEventType, + Reduce: p.reduceLabelPolicyActivated, + }, + { + Event: org.LabelPolicyLogoAddedEventType, + Reduce: p.reduceLabelPolicyLogoAdded, + }, + { + Event: org.LabelPolicyLogoRemovedEventType, + Reduce: p.reduceLabelPolicyLogoRemoved, + }, + { + Event: org.LabelPolicyLogoDarkAddedEventType, + Reduce: p.reduceLabelPolicyLogoDarkAdded, + }, + { + Event: org.LabelPolicyLogoDarkRemovedEventType, + Reduce: p.reduceLabelPolicyLogoDarkRemoved, + }, + { + Event: org.LabelPolicyIconAddedEventType, + Reduce: p.reduceLabelPolicyIconAdded, + }, + { + Event: org.LabelPolicyIconRemovedEventType, + Reduce: p.reduceLabelPolicyIconRemoved, + }, + { + Event: org.LabelPolicyIconDarkAddedEventType, + Reduce: p.reduceLabelPolicyIconDarkAdded, + }, + { + Event: org.LabelPolicyIconDarkRemovedEventType, + Reduce: p.reduceLabelPolicyIconDarkRemoved, + }, + { + Event: org.LabelPolicyFontAddedEventType, + Reduce: p.reduceLabelPolicyFontAdded, + }, + { + Event: org.LabelPolicyFontRemovedEventType, + Reduce: p.reduceLabelPolicyFontRemoved, + }, + // Password Complexity + { + Event: org.PasswordComplexityPolicyAddedEventType, + Reduce: p.reducePasswordComplexityPolicyAdded, + }, + { + Event: org.PasswordComplexityPolicyChangedEventType, + Reduce: p.reducePasswordComplexityPolicyChanged, + }, + { + Event: org.PasswordComplexityPolicyRemovedEventType, + Reduce: p.reducePasswordComplexityPolicyRemoved, + }, + // Password Policy + { + Event: org.PasswordAgePolicyAddedEventType, + Reduce: p.reducePasswordAgePolicyAdded, + }, + { + Event: org.PasswordAgePolicyChangedEventType, + Reduce: p.reducePasswordAgePolicyChanged, + }, + { + Event: org.PasswordAgePolicyRemovedEventType, + Reduce: p.reducePasswordAgePolicyRemoved, + }, + // Lockout Policy + { + Event: org.LockoutPolicyAddedEventType, + Reduce: p.reduceLockoutPolicyAdded, + }, + { + Event: org.LockoutPolicyChangedEventType, + Reduce: p.reduceLockoutPolicyChanged, + }, + { + Event: org.LockoutPolicyRemovedEventType, + Reduce: p.reduceOrgLockoutPolicyRemoved, + }, + // Domain Policy + { + Event: org.DomainPolicyAddedEventType, + Reduce: p.reduceDomainPolicyAdded, + }, + { + Event: org.DomainPolicyChangedEventType, + Reduce: p.reduceDomainPolicyChanged, + }, + { + Event: org.DomainPolicyRemovedEventType, + Reduce: p.reduceOrgDomainPolicyRemoved, + }, + // Notification + { + Event: org.NotificationPolicyAddedEventType, + Reduce: p.reduceNotificationPolicyAdded, + }, + { + Event: org.NotificationPolicyChangedEventType, + Reduce: p.reduceNotificationPolicyChanged, + }, + { + Event: org.NotificationPolicyRemovedEventType, + Reduce: p.reduceOrgNotificationPolicyRemoved, + }, + // Privacy + { + Event: org.PrivacyPolicyAddedEventType, + Reduce: p.reducePrivacyPolicyAdded, + }, + { + Event: org.PrivacyPolicyChangedEventType, + Reduce: p.reducePrivacyPolicyChanged, + }, + { + Event: org.PrivacyPolicyRemovedEventType, + Reduce: p.reduceOrgPrivacyPolicyRemoved, + }, + + // idps + { + Event: org.IDPConfigAddedEventType, + Reduce: p.reduceIDPAdded, + }, + { + Event: org.IDPConfigChangedEventType, + Reduce: p.reduceIDPChanged, + }, + { + Event: org.IDPConfigDeactivatedEventType, + Reduce: p.reduceIDPDeactivated, + }, + { + Event: org.IDPConfigReactivatedEventType, + Reduce: p.reduceIDPReactivated, + }, + { + Event: org.IDPConfigRemovedEventType, + Reduce: p.reduceIDPRemoved, + }, + { + Event: org.IDPOIDCConfigAddedEventType, + Reduce: p.reduceOIDCConfigAdded, + }, + { + Event: org.IDPOIDCConfigChangedEventType, + Reduce: p.reduceOIDCConfigChanged, + }, + { + Event: org.IDPJWTConfigAddedEventType, + Reduce: p.reduceJWTConfigAdded, + }, + { + Event: org.IDPJWTConfigChangedEventType, + Reduce: p.reduceJWTConfigChanged, + }, + { + Event: org.OAuthIDPAddedEventType, + Reduce: p.reduceOAuthIDPAdded, + }, + { + Event: org.OAuthIDPChangedEventType, + Reduce: p.reduceOAuthIDPChanged, + }, + { + Event: org.OIDCIDPAddedEventType, + Reduce: p.reduceOIDCIDPAdded, + }, + { + Event: org.OIDCIDPChangedEventType, + Reduce: p.reduceOIDCIDPChanged, + }, + { + Event: org.OIDCIDPMigratedAzureADEventType, + Reduce: p.reduceOIDCIDPMigratedAzureAD, + }, + { + Event: org.OIDCIDPMigratedGoogleEventType, + Reduce: p.reduceOIDCIDPMigratedGoogle, + }, + { + Event: org.JWTIDPAddedEventType, + Reduce: p.reduceJWTIDPAdded, + }, + { + Event: org.JWTIDPChangedEventType, + Reduce: p.reduceJWTIDPChanged, + }, + { + Event: org.AzureADIDPAddedEventType, + Reduce: p.reduceAzureADIDPAdded, + }, + { + Event: org.AzureADIDPChangedEventType, + Reduce: p.reduceAzureADIDPChanged, + }, + { + Event: org.GitHubIDPAddedEventType, + Reduce: p.reduceGitHubIDPAdded, + }, + { + Event: org.GitHubIDPChangedEventType, + Reduce: p.reduceGitHubIDPChanged, + }, + { + Event: org.GitHubEnterpriseIDPAddedEventType, + Reduce: p.reduceGitHubEnterpriseIDPAdded, + }, + { + Event: org.GitHubEnterpriseIDPChangedEventType, + Reduce: p.reduceGitHubEnterpriseIDPChanged, + }, + { + Event: org.GitLabIDPAddedEventType, + Reduce: p.reduceGitLabIDPAdded, + }, + { + Event: org.GitLabIDPChangedEventType, + Reduce: p.reduceGitLabIDPChanged, + }, + { + Event: org.GitLabSelfHostedIDPAddedEventType, + Reduce: p.reduceGitLabSelfHostedIDPAdded, + }, + { + Event: org.GitLabSelfHostedIDPChangedEventType, + Reduce: p.reduceGitLabSelfHostedIDPChanged, + }, + { + Event: org.GoogleIDPAddedEventType, + Reduce: p.reduceGoogleIDPAdded, + }, + { + Event: org.GoogleIDPChangedEventType, + Reduce: p.reduceGoogleIDPChanged, + }, + { + Event: org.LDAPIDPAddedEventType, + Reduce: p.reduceLDAPIDPAdded, + }, + { + Event: org.LDAPIDPChangedEventType, + Reduce: p.reduceLDAPIDPChanged, + }, + { + Event: org.AppleIDPAddedEventType, + Reduce: p.reduceAppleIDPAdded, + }, + { + Event: org.AppleIDPChangedEventType, + Reduce: p.reduceAppleIDPChanged, + }, + { + Event: org.SAMLIDPAddedEventType, + Reduce: p.reduceSAMLIDPAdded, + }, + { + Event: org.SAMLIDPChangedEventType, + Reduce: p.reduceSAMLIDPChanged, + }, + { + Event: org.IDPRemovedEventType, + Reduce: p.reduceIDPRemoved, + }, + }, + }, + { + Aggregate: settings.AggregateType, + EventReducers: []handler.EventReducer{ + { + Event: settings.OrganizationSettingsSetEventType, + Reduce: p.reduceOrganizationSettingsSet, + }, + { + Event: settings.OrganizationSettingsRemovedEventType, + Reduce: p.reduceOrganizationSettingsRemoved, + }, + }, + }, + { + Aggregate: project.AggregateType, + EventReducers: []handler.EventReducer{ + { + Event: project.ProjectAddedType, + Reduce: p.reduceProjectAdded, + }, + { + Event: project.ProjectChangedType, + Reduce: p.reduceProjectChanged, + }, + { + Event: project.ProjectDeactivatedType, + Reduce: p.reduceProjectDeactivated, + }, + { + Event: project.ProjectReactivatedType, + Reduce: p.reduceProjectReactivated, + }, + { + Event: project.ProjectRemovedType, + Reduce: p.reduceProjectRemoved, + }, + + // project grants + { + Event: project.GrantAddedType, + Reduce: p.reduceProjectGrantAdded, + }, + { + Event: project.GrantChangedType, + Reduce: p.reduceProjectGrantChanged, + }, + { + Event: project.GrantCascadeChangedType, + Reduce: p.reduceProjectGrantCascadeChanged, + }, + { + Event: project.GrantDeactivatedType, + Reduce: p.reduceProjectGrantDeactivated, + }, + { + Event: project.GrantReactivatedType, + Reduce: p.reduceProjectGrantReactivated, + }, + { + Event: project.GrantRemovedType, + Reduce: p.reduceProjectGrantRemoved, + }, + + // project roles + { + Event: project.RoleAddedType, + Reduce: p.reduceProjectRoleAdded, + }, + { + Event: project.RoleChangedType, + Reduce: p.reduceProjectRoleChanged, + }, + { + Event: project.RoleRemovedType, + Reduce: p.reduceProjectRoleRemoved, + }, + }, + }, + { + Aggregate: usergrant.AggregateType, + EventReducers: []handler.EventReducer{ + { + Event: usergrant.UserGrantAddedType, + Reduce: p.reduceAuthorizationAdded, + }, + { + Event: usergrant.UserGrantChangedType, + Reduce: p.reduceAuthorizationChanged, + }, + { + Event: usergrant.UserGrantCascadeChangedType, + Reduce: p.reduceAuthorizationChanged, + }, + { + Event: usergrant.UserGrantCascadeRemovedType, + Reduce: p.reduceAuthorizationRemoved, + }, + { + Event: usergrant.UserGrantRemovedType, + Reduce: p.reduceAuthorizationRemoved, + }, + { + Event: usergrant.UserGrantDeactivatedType, + Reduce: p.reduceAuthorizationDeactivated, + }, + { + Event: usergrant.UserGrantReactivatedType, + Reduce: p.reduceAuthorizationReactivated, + }, + }, + }, + { + Aggregate: user.AggregateType, + EventReducers: []handler.EventReducer{ + { + Event: user.UserV1AddedType, + Reduce: p.reduceHumanAdded, + }, + { + Event: user.HumanAddedType, + Reduce: p.reduceHumanAdded, + }, + { + Event: user.UserV1RegisteredType, + Reduce: p.reduceHumanRegistered, + }, + { + Event: user.HumanRegisteredType, + Reduce: p.reduceHumanRegistered, + }, + { + Event: user.UserLockedType, + Reduce: p.reduceUserLocked, + }, + { + Event: user.UserUnlockedType, + Reduce: p.reduceUserUnlocked, + }, + { + Event: user.UserDeactivatedType, + Reduce: p.reduceUserDeactivated, + }, + { + Event: user.UserReactivatedType, + Reduce: p.reduceUserReactivated, + }, + { + Event: user.UserRemovedType, + Reduce: p.reduceUserRemoved, + }, + + { + Event: user.UserUserNameChangedType, + Reduce: p.reduceUsernameChanged, + }, + { + Event: user.UserDomainClaimedType, + Reduce: p.reduceUserDomainClaimed, + }, + + { + Event: user.HumanProfileChangedType, + Reduce: p.reduceHumanProfileChanged, + }, + { + Event: user.UserV1ProfileChangedType, + Reduce: p.reduceHumanProfileChanged, + }, + + { + Event: user.HumanEmailChangedType, + Reduce: p.reduceHumanEmailChanged, + }, + { + Event: user.UserV1EmailChangedType, + Reduce: p.reduceHumanEmailChanged, + }, + { + Event: user.HumanEmailVerifiedType, + Reduce: p.reduceHumanEmailVerified, + }, + { + Event: user.UserV1EmailVerifiedType, + Reduce: p.reduceHumanEmailVerified, + }, + { + Event: user.HumanEmailCodeAddedType, + Reduce: p.reduceHumanEmailCodeAdded, + }, + { + Event: user.UserV1EmailCodeAddedType, + Reduce: p.reduceHumanEmailCodeAdded, + }, + { + Event: user.HumanEmailVerificationFailedType, + Reduce: p.reduceHumanEmailVerificationFailed, + }, + { + Event: user.UserV1EmailVerificationFailedType, + Reduce: p.reduceHumanEmailVerificationFailed, + }, + { + Event: user.HumanPhoneChangedType, + Reduce: p.reduceHumanPhoneChanged, + }, + { + Event: user.UserV1PhoneChangedType, + Reduce: p.reduceHumanPhoneChanged, + }, + { + Event: user.HumanPhoneRemovedType, + Reduce: p.reduceHumanPhoneRemoved, + }, + { + Event: user.UserV1PhoneRemovedType, + Reduce: p.reduceHumanPhoneRemoved, + }, + { + Event: user.HumanPhoneVerifiedType, + Reduce: p.reduceHumanPhoneVerified, + }, + { + Event: user.UserV1PhoneVerifiedType, + Reduce: p.reduceHumanPhoneVerified, + }, + { + Event: user.HumanPhoneCodeAddedType, + Reduce: p.reduceHumanPhoneCodeAdded, + }, + { + Event: user.UserV1PhoneCodeAddedType, + Reduce: p.reduceHumanPhoneCodeAdded, + }, + { + Event: user.HumanPhoneVerificationFailedType, + Reduce: p.reduceHumanPhoneVerificationFailed, + }, + { + Event: user.UserV1PhoneVerificationFailedType, + Reduce: p.reduceHumanPhoneVerificationFailed, + }, + + { + Event: user.HumanAvatarAddedType, + Reduce: p.reduceHumanAvatarAdded, + }, + { + Event: user.HumanAvatarRemovedType, + Reduce: p.reduceHumanAvatarRemoved, + }, + + { + Event: user.HumanPasswordChangedType, + Reduce: p.reduceHumanPasswordChanged, + }, + { + Event: user.UserV1PasswordChangedType, + Reduce: p.reduceHumanPasswordChanged, + }, + { + Event: user.HumanPasswordCodeAddedType, + Reduce: p.reduceHumanPasswordCodeAdded, + }, + { + Event: user.UserV1PasswordCodeAddedType, + Reduce: p.reduceHumanPasswordCodeAdded, + }, + { + Event: user.HumanPasswordCheckSucceededType, + Reduce: p.reduceHumanPasswordCheckSucceeded, + }, + { + Event: user.UserV1PasswordCheckSucceededType, + Reduce: p.reduceHumanPasswordCheckSucceeded, + }, + { + Event: user.HumanPasswordCheckFailedType, + Reduce: p.reduceHumanPasswordCheckFailed, + }, + { + Event: user.UserV1PasswordCheckFailedType, + Reduce: p.reduceHumanPasswordCheckFailed, + }, + { + Event: user.HumanPasswordHashUpdatedType, + Reduce: p.reduceHumanPasswordHashUpdated, + }, + + { + Event: user.MachineAddedEventType, + Reduce: p.reduceMachineAdded, + }, + { + Event: user.MachineChangedEventType, + Reduce: p.reduceMachineChanged, + }, + + { + Event: user.MachineSecretSetType, + Reduce: p.reduceMachineSecretSet, + }, + { + Event: user.MachineSecretHashUpdatedType, + Reduce: p.reduceMachineSecretHashUpdated, + }, + { + Event: user.MachineSecretRemovedType, + Reduce: p.reduceMachineSecretRemoved, + }, + + { + Event: user.MachineKeyAddedEventType, + Reduce: p.reduceMachineKeyAdded, + }, + { + Event: user.MachineKeyRemovedEventType, + Reduce: p.reduceMachineKeyRemoved, + }, + { + Event: user.UserV1MFAInitSkippedType, + Reduce: p.reduceMFAInitSkipped, + }, + { + Event: user.HumanMFAInitSkippedType, + Reduce: p.reduceMFAInitSkipped, + }, + + { + Event: user.PersonalAccessTokenAddedType, + Reduce: p.reducePersonalAccessTokenAdded, + }, + { + Event: user.PersonalAccessTokenRemovedType, + Reduce: p.reducePersonalAccessTokenRemoved, + }, + + { + Event: user.MetadataSetType, + Reduce: p.reduceUserMetadataSet, + }, + { + Event: user.MetadataRemovedType, + Reduce: p.reduceUserMetadataRemoved, + }, + { + Event: user.MetadataRemovedAllType, + Reduce: p.reduceUserMetadataRemovedAll, + }, + { + Event: user.HumanPasswordlessTokenAddedType, + Reduce: p.reducePasskeyAdded, + }, + { + Event: user.HumanPasswordlessTokenVerifiedType, + Reduce: p.reducePasskeyVerified, + }, + { + Event: user.HumanPasswordlessTokenSignCountChangedType, + Reduce: p.reducePasskeySignCountSet, + }, + { + Event: user.HumanPasswordlessTokenRemovedType, + Reduce: p.reducePasskeyRemoved, + }, + + { + Event: user.HumanU2FTokenAddedType, + Reduce: p.reducePasskeyAdded, + }, + { + Event: user.HumanU2FTokenVerifiedType, + Reduce: p.reducePasskeyVerified, + }, + { + Event: user.HumanU2FTokenSignCountChangedType, + Reduce: p.reducePasskeySignCountSet, + }, + { + Event: user.HumanU2FTokenRemovedType, + Reduce: p.reducePasskeyRemoved, + }, + + { + Event: user.HumanPasswordlessInitCodeAddedType, + Reduce: p.reducePasskeyInitCodeAdded, + }, + { + Event: user.HumanPasswordlessInitCodeCheckFailedType, + Reduce: p.reducePasskeyInitCodeCheckFailed, + }, + { + Event: user.HumanPasswordlessInitCodeCheckSucceededType, + Reduce: p.reducePasskeyInitCodeCheckSucceeded, + }, + { + Event: user.HumanPasswordlessInitCodeRequestedType, + Reduce: p.reducePasskeyInitCodeRequested, + }, + { + Event: user.UserIDPLinkAddedType, + Reduce: p.reduceIDPLinkAdded, + }, + { + Event: user.UserIDPLinkCascadeRemovedType, + Reduce: p.reduceIDPLinkCascadeRemoved, + }, + { + Event: user.UserIDPLinkRemovedType, + Reduce: p.reduceIDPLinkRemoved, + }, + { + Event: user.UserIDPExternalIDMigratedType, + Reduce: p.reduceIDPLinkUserIDMigrated, + }, + { + Event: user.UserIDPExternalUsernameChangedType, + Reduce: p.reduceIDPLinkUsernameChanged, + }, + { + Event: user.HumanMFAOTPAddedType, + Reduce: p.reduceTOTPAdded, + }, + { + Event: user.UserV1MFAOTPAddedType, + Reduce: p.reduceTOTPAdded, + }, + { + Event: user.HumanMFAOTPVerifiedType, + Reduce: p.reduceTOTPVerified, + }, + { + Event: user.UserV1MFAOTPVerifiedType, + Reduce: p.reduceTOTPVerified, + }, + { + Event: user.HumanMFAOTPRemovedType, + Reduce: p.reduceTOTPRemoved, + }, + { + Event: user.UserV1MFAOTPRemovedType, + Reduce: p.reduceTOTPRemoved, + }, + { + Event: user.HumanMFAOTPCheckSucceededType, + Reduce: p.reduceTOTPCheckSucceeded, + }, + { + Event: user.UserV1MFAOTPCheckSucceededType, + Reduce: p.reduceTOTPCheckSucceeded, + }, + { + Event: user.HumanMFAOTPCheckFailedType, + Reduce: p.reduceTOTPCheckFailed, + }, + { + Event: user.UserV1MFAOTPCheckFailedType, + Reduce: p.reduceTOTPCheckFailed, + }, + { + Event: user.HumanOTPSMSAddedType, + Reduce: p.reduceOTPSMSEnabled, + }, + { + Event: user.HumanOTPSMSRemovedType, + Reduce: p.reduceOTPSMSDisabled, + }, + { + Event: user.HumanOTPSMSCheckSucceededType, + Reduce: p.reduceOTPSMSCheckSucceeded, + }, + { + Event: user.HumanOTPSMSCheckFailedType, + Reduce: p.reduceOTPSMSCheckFailed, + }, + { + Event: user.HumanOTPEmailAddedType, + Reduce: p.reduceOTPEmailEnabled, + }, + { + Event: user.HumanOTPEmailRemovedType, + Reduce: p.reduceOTPEmailDisabled, + }, + { + Event: user.HumanOTPEmailCheckSucceededType, + Reduce: p.reduceOTPEmailCheckSucceeded, + }, + { + Event: user.HumanOTPEmailCheckFailedType, + Reduce: p.reduceOTPEmailCheckFailed, + }, + { + Event: user.HumanInviteCodeAddedType, + Reduce: p.reduceInviteCodeAdded, + }, + { + Event: user.HumanInviteCheckSucceededType, + Reduce: p.reduceInviteCheckSucceeded, + }, + { + Event: user.HumanInviteCheckFailedType, + Reduce: p.reduceInviteCheckFailed, + }, + { + Event: user.HumanRecoveryCodesAddedType, + Reduce: p.reduceRecoveryCodesAdded, + }, + { + Event: user.HumanRecoveryCodesRemovedType, + Reduce: p.reduceRecoveryCodesRemoved, + }, + { + Event: user.HumanRecoveryCodeCheckSucceededType, + Reduce: p.reduceRecoveryCodeCheckSucceeded, + }, + { + Event: user.HumanRecoveryCodeCheckFailedType, + Reduce: p.reduceRecoveryCodeCheckFailed, + }, + }, + }, + { + Aggregate: idpintent.AggregateType, + EventReducers: []handler.EventReducer{ + { + Event: idpintent.StartedEventType, + Reduce: p.reduceIDPIntentStartedEvent, + }, + { + Event: idpintent.SucceededEventType, + Reduce: p.reduceIDPIntentSucceededEvent, + }, + { + Event: idpintent.SAMLSucceededEventType, + Reduce: p.reduceIDPIntentSAMLSucceededEvent, + }, + { + Event: idpintent.SAMLRequestEventType, + Reduce: p.reduceIDPIntentSAMLRequestEvent, + }, + { + Event: idpintent.LDAPSucceededEventType, + Reduce: p.reduceIDPIntentLDAPSucceededEvent, + }, + { + Event: idpintent.FailedEventType, + Reduce: p.reduceIDPIntentFailedEvent, + }, + { + Event: idpintent.ConsumedEventType, + Reduce: p.reduceIDPIntentConsumedEvent, + }, + }, + }, + { + Aggregate: session.AggregateType, + EventReducers: []handler.EventReducer{ + { + Event: session.AddedType, + Reduce: p.reduceSessionAdded, + }, + { + Event: session.UserCheckedType, + Reduce: p.reduceSessionUserChecked, + }, + { + Event: session.PasswordCheckedType, + Reduce: p.reduceSessionPasswordChecked, + }, + { + Event: session.IntentCheckedType, + Reduce: p.reduceSessionIntentChecked, + }, + { + Event: session.WebAuthNChallengedType, + Reduce: p.reduceSessionWebAuthNChallenged, + }, + { + Event: session.WebAuthNCheckedType, + Reduce: p.reduceSessionWebAuthNChecked, + }, + { + Event: session.TOTPCheckedType, + Reduce: p.reduceSessionTOTPChecked, + }, + { + Event: session.OTPSMSChallengedType, + Reduce: p.reduceSessionOTPSMSChallenged, + }, + { + Event: session.OTPSMSCheckedType, + Reduce: p.reduceSessionOTPSMSChecked, + }, + { + Event: session.OTPEmailChallengedType, + Reduce: p.reduceSessionOTPEmailChallenged, + }, + { + Event: session.OTPEmailCheckedType, + Reduce: p.reduceSessionOTPEmailChecked, + }, + { + Event: session.RecoveryCodeCheckedType, + Reduce: p.reduceSessionRecoveryCodeChecked, + }, + { + Event: session.TokenSetType, + Reduce: p.reduceSessionTokenSet, + }, + { + Event: session.MetadataSetType, + Reduce: p.reduceSessionMetadataSet, + }, + { + Event: session.LifetimeSetType, + Reduce: p.reduceSessionLifetimeSet, + }, + { + Event: session.TerminateType, + Reduce: p.reduceSessionTerminated, + }, + }, + }, + } +} diff --git a/internal/query/projection/session_relational.go b/internal/query/projection/session_relational.go index 400163430..b20acbaee 100644 --- a/internal/query/projection/session_relational.go +++ b/internal/query/projection/session_relational.go @@ -5,138 +5,21 @@ import ( "database/sql" "github.com/zitadel/zitadel/backend/v3/domain" - "github.com/zitadel/zitadel/backend/v3/storage/database" v3_sql "github.com/zitadel/zitadel/backend/v3/storage/database/dialect/sql" "github.com/zitadel/zitadel/backend/v3/storage/database/repository" "github.com/zitadel/zitadel/internal/eventstore" "github.com/zitadel/zitadel/internal/eventstore/handler/v2" - "github.com/zitadel/zitadel/internal/repository/instance" "github.com/zitadel/zitadel/internal/repository/session" - "github.com/zitadel/zitadel/internal/repository/user" "github.com/zitadel/zitadel/internal/zerrors" ) -const ( - SessionsRelationalProjectionTable = "zitadel.sessions" -) - -type sessionRelationalProjection struct{} - -func (*sessionRelationalProjection) Name() string { - return SessionsRelationalProjectionTable -} - -func newSessionRelationalProjection(ctx context.Context, config handler.Config) *handler.Handler { - return handler.NewHandler(ctx, &config, new(sessionRelationalProjection)) -} - -func (p *sessionRelationalProjection) Reducers() []handler.AggregateReducer { - return []handler.AggregateReducer{ - { - Aggregate: session.AggregateType, - EventReducers: []handler.EventReducer{ - { - Event: session.AddedType, - Reduce: p.reduceSessionAdded, - }, - { - Event: session.UserCheckedType, - Reduce: p.reduceUserChecked, - }, - { - Event: session.PasswordCheckedType, - Reduce: p.reducePasswordChecked, - }, - { - Event: session.IntentCheckedType, - Reduce: p.reduceIntentChecked, - }, - { - Event: session.WebAuthNChallengedType, - Reduce: p.reduceWebAuthNChallenged, - }, - { - Event: session.WebAuthNCheckedType, - Reduce: p.reduceWebAuthNChecked, - }, - { - Event: session.TOTPCheckedType, - Reduce: p.reduceTOTPChecked, - }, - { - Event: session.OTPSMSChallengedType, - Reduce: p.reduceOTPSMSChallenged, - }, - { - Event: session.OTPSMSCheckedType, - Reduce: p.reduceOTPSMSChecked, - }, - { - Event: session.OTPEmailChallengedType, - Reduce: p.reduceOTPEmailChallenged, - }, - { - Event: session.OTPEmailCheckedType, - Reduce: p.reduceOTPEmailChecked, - }, - { - Event: session.RecoveryCodeCheckedType, - Reduce: p.reduceRecoveryCodeChecked, - }, - { - Event: session.TokenSetType, - Reduce: p.reduceTokenSet, - }, - { - Event: session.MetadataSetType, - Reduce: p.reduceMetadataSet, - }, - { - Event: session.LifetimeSetType, - Reduce: p.reduceLifetimeSet, - }, - { - Event: session.TerminateType, - Reduce: p.reduceSessionTerminated, - }, - }, - }, - { - Aggregate: instance.AggregateType, - EventReducers: []handler.EventReducer{ - { - Event: instance.InstanceRemovedEventType, - Reduce: reduceInstanceRemovedHelper(SMSColumnInstanceID), - }, - }, - }, - { - Aggregate: user.AggregateType, - EventReducers: []handler.EventReducer{ - { - Event: user.HumanPasswordChangedType, - Reduce: p.reducePasswordChanged, - }, - { - Event: user.UserDeactivatedType, - Reduce: p.reduceUserStateNotActive, - }, - { - Event: user.UserLockedType, - Reduce: p.reduceUserStateNotActive, - }, - }, - }, - } -} - -func (p *sessionRelationalProjection) reduceSessionAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceSessionAdded(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*session.AddedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -165,12 +48,12 @@ func (p *sessionRelationalProjection) reduceSessionAdded(event eventstore.Event) }), nil } -func (p *sessionRelationalProjection) reduceUserChecked(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceSessionUserChecked(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*session.UserCheckedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-UHE92", "reduce.wrong.db.pool %T", ex) @@ -190,12 +73,12 @@ func (p *sessionRelationalProjection) reduceUserChecked(event eventstore.Event) }), nil } -func (p *sessionRelationalProjection) reducePasswordChecked(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceSessionPasswordChecked(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*session.PasswordCheckedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-3krfa", "reduce.wrong.db.pool %T", ex) @@ -214,13 +97,13 @@ func (p *sessionRelationalProjection) reducePasswordChecked(event eventstore.Eve }), nil } -func (p *sessionRelationalProjection) reduceIntentChecked(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceSessionIntentChecked(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*session.IntentCheckedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-ajkd2", "reduce.wrong.db.pool %T", ex) @@ -239,12 +122,12 @@ func (p *sessionRelationalProjection) reduceIntentChecked(event eventstore.Event }), nil } -func (p *sessionRelationalProjection) reduceWebAuthNChallenged(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceSessionWebAuthNChallenged(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*session.WebAuthNChallengedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-do35d", "reduce.wrong.db.pool %T", ex) @@ -266,12 +149,12 @@ func (p *sessionRelationalProjection) reduceWebAuthNChallenged(event eventstore. return err }), nil } -func (p *sessionRelationalProjection) reduceWebAuthNChecked(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceSessionWebAuthNChecked(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*session.WebAuthNCheckedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-djk22", "reduce.wrong.db.pool %T", ex) @@ -291,13 +174,13 @@ func (p *sessionRelationalProjection) reduceWebAuthNChecked(event eventstore.Eve }), nil } -func (p *sessionRelationalProjection) reduceTOTPChecked(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceSessionTOTPChecked(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*session.TOTPCheckedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-cklr9", "reduce.wrong.db.pool %T", ex) @@ -316,13 +199,13 @@ func (p *sessionRelationalProjection) reduceTOTPChecked(event eventstore.Event) }), nil } -func (p *sessionRelationalProjection) reduceOTPSMSChallenged(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceSessionOTPSMSChallenged(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*session.OTPSMSChallengedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-fk4f9", "reduce.wrong.db.pool %T", ex) @@ -346,13 +229,13 @@ func (p *sessionRelationalProjection) reduceOTPSMSChallenged(event eventstore.Ev }), nil } -func (p *sessionRelationalProjection) reduceOTPSMSChecked(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceSessionOTPSMSChecked(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*session.OTPSMSCheckedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-dk39f", "reduce.wrong.db.pool %T", ex) @@ -371,13 +254,13 @@ func (p *sessionRelationalProjection) reduceOTPSMSChecked(event eventstore.Event }), nil } -func (p *sessionRelationalProjection) reduceOTPEmailChallenged(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceSessionOTPEmailChallenged(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*session.OTPEmailChallengedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-fkf93", "reduce.wrong.db.pool %T", ex) @@ -401,13 +284,13 @@ func (p *sessionRelationalProjection) reduceOTPEmailChallenged(event eventstore. }), nil } -func (p *sessionRelationalProjection) reduceOTPEmailChecked(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceSessionOTPEmailChecked(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*session.OTPEmailCheckedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-3kll0", "reduce.wrong.db.pool %T", ex) @@ -426,13 +309,13 @@ func (p *sessionRelationalProjection) reduceOTPEmailChecked(event eventstore.Eve }), nil } -func (p *sessionRelationalProjection) reduceRecoveryCodeChecked(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceSessionRecoveryCodeChecked(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*session.RecoveryCodeCheckedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-fk45a", "reduce.wrong.db.pool %T", ex) @@ -451,13 +334,13 @@ func (p *sessionRelationalProjection) reduceRecoveryCodeChecked(event eventstore }), nil } -func (p *sessionRelationalProjection) reduceTokenSet(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceSessionTokenSet(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*session.TokenSetEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-asddt", "reduce.wrong.db.pool %T", ex) @@ -474,7 +357,7 @@ func (p *sessionRelationalProjection) reduceTokenSet(event eventstore.Event) (*h }), nil } -func (p *sessionRelationalProjection) reduceMetadataSet(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceSessionMetadataSet(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*session.MetadataSetEvent](event) if err != nil { return nil, err @@ -490,7 +373,7 @@ func (p *sessionRelationalProjection) reduceMetadataSet(event eventstore.Event) }) } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -507,13 +390,13 @@ func (p *sessionRelationalProjection) reduceMetadataSet(event eventstore.Event) }), nil } -func (p *sessionRelationalProjection) reduceLifetimeSet(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceSessionLifetimeSet(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*session.LifetimeSetEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -530,13 +413,13 @@ func (p *sessionRelationalProjection) reduceLifetimeSet(event eventstore.Event) }), nil } -func (p *sessionRelationalProjection) reduceSessionTerminated(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceSessionTerminated(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*session.TerminateEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -549,60 +432,3 @@ func (p *sessionRelationalProjection) reduceSessionTerminated(event eventstore.E return err }), nil } - -func (p *sessionRelationalProjection) reducePasswordChanged(event eventstore.Event) (*handler.Statement, error) { - e, err := assertEvent[*user.HumanPasswordChangedEvent](event) - if err != nil { - return nil, err - } - - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) - } - v3Tx := v3_sql.SQLTx(tx) - - sessionRepo := repository.SessionRepository() - condition := database.And( - sessionRepo.InstanceIDCondition(e.Aggregate().InstanceID), - sessionRepo.UserIDCondition(e.Aggregate().ID), - sessionRepo.ExistsFactor( - database.And( - sessionRepo.FactorConditions().FactorTypeCondition(domain.SessionFactorTypePassword), - sessionRepo.FactorConditions().LastVerifiedBeforeCondition(e.CreatedAt()), - ), - ), - ) - _, err = sessionRepo.Update(ctx, v3Tx, condition, - sessionRepo.SetUpdatedAt(e.CreatedAt()), - sessionRepo.ClearFactor(domain.SessionFactorTypePassword), - ) - return err - }), nil -} - -func (p *sessionRelationalProjection) reduceUserStateNotActive(event eventstore.Event) (*handler.Statement, error) { - switch t := event.(type) { - case *user.UserDeactivatedEvent, *user.UserLockedEvent: - // ok - default: - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-XBglbF", "reduce.wrong.event.type %v", t) - } - - return handler.NewStatement(event, func(ctx context.Context, ex handler.Executer, projectionName string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInvalidArgumentf(nil, "HANDL-fcxV68", "reduce.wrong.db.pool %T", ex) - } - v3Tx := v3_sql.SQLTx(tx) - - sessionRepo := repository.SessionRepository() - condition := database.And( - sessionRepo.InstanceIDCondition(event.Aggregate().InstanceID), - sessionRepo.UserIDCondition(event.Aggregate().ID), - ) - _, err := sessionRepo.Delete(ctx, v3Tx, condition) - return err - }), nil -} diff --git a/internal/query/projection/settings_relational.go b/internal/query/projection/settings_relational.go index 27812de5c..3838f12d8 100644 --- a/internal/query/projection/settings_relational.go +++ b/internal/query/projection/settings_relational.go @@ -21,364 +21,7 @@ import ( "github.com/zitadel/zitadel/internal/zerrors" ) -const ( - SettingsRelationalProjectionTable = "zitadel.settings" -) - -type settingsRelationalProjection struct{} - -func newSettingsRelationalProjection(ctx context.Context, config handler.Config) *handler.Handler { - return handler.NewHandler(ctx, &config, new(settingsRelationalProjection)) -} - -func (*settingsRelationalProjection) Name() string { - return SettingsRelationalProjectionTable -} - -func (s *settingsRelationalProjection) Reducers() []handler.AggregateReducer { - return []handler.AggregateReducer{ - { - Aggregate: org.AggregateType, - EventReducers: []handler.EventReducer{ - // // Login - { - Event: org.LoginPolicyAddedEventType, - Reduce: s.reduceLoginPolicyAdded, - }, - { - Event: org.LoginPolicyChangedEventType, - Reduce: s.reduceLoginPolicyChanged, - }, - { - Event: org.LoginPolicyRemovedEventType, - Reduce: s.reduceLoginPolicyRemoved, - }, - { - Event: org.LoginPolicyMultiFactorAddedEventType, - Reduce: s.reduceMFAAdded, - }, - { - Event: org.LoginPolicyMultiFactorRemovedEventType, - Reduce: s.reduceMFARemoved, - }, - { - Event: org.LoginPolicySecondFactorAddedEventType, - Reduce: s.reduceSecondFactorAdded, - }, - { - Event: org.LoginPolicySecondFactorRemovedEventType, - Reduce: s.reduceSecondFactorRemoved, - }, - // label - { - Event: org.LabelPolicyAddedEventType, - Reduce: s.reduceLabelAdded, - }, - { - Event: org.LabelPolicyChangedEventType, - Reduce: s.reduceLabelChanged, - }, - { - Event: org.LabelPolicyRemovedEventType, - Reduce: s.reduceLabelPolicyRemoved, - }, - { - Event: org.LabelPolicyActivatedEventType, - Reduce: s.reduceLabelActivated, - }, - { - Event: org.LabelPolicyLogoAddedEventType, - Reduce: s.reduceLogoAdded, - }, - { - Event: org.LabelPolicyLogoRemovedEventType, - Reduce: s.reduceLogoRemoved, - }, - { - Event: org.LabelPolicyLogoDarkAddedEventType, - Reduce: s.reduceLogoDarkAdded, - }, - { - Event: org.LabelPolicyLogoDarkRemovedEventType, - Reduce: s.reduceLogoDarkRemoved, - }, - { - Event: org.LabelPolicyIconAddedEventType, - Reduce: s.reduceIconAdded, - }, - { - Event: org.LabelPolicyIconRemovedEventType, - Reduce: s.reduceIconRemoved, - }, - { - Event: org.LabelPolicyIconDarkAddedEventType, - Reduce: s.reduceIconDarkAdded, - }, - { - Event: org.LabelPolicyIconDarkRemovedEventType, - Reduce: s.reduceIconDarkRemoved, - }, - { - Event: org.LabelPolicyFontAddedEventType, - Reduce: s.reduceFontAdded, - }, - { - Event: org.LabelPolicyFontRemovedEventType, - Reduce: s.reduceFontRemoved, - }, - // // Password Complexity - { - Event: org.PasswordComplexityPolicyAddedEventType, - Reduce: s.reducePasswordComplexityAdded, - }, - { - Event: org.PasswordComplexityPolicyChangedEventType, - Reduce: s.reducePasswordComplexityChanged, - }, - { - Event: org.PasswordComplexityPolicyRemovedEventType, - Reduce: s.reducePasswordComplexityRemoved, - }, - // // Password Policy - { - Event: org.PasswordAgePolicyAddedEventType, - Reduce: s.reducePasswordPolicyAdded, - }, - { - Event: org.PasswordAgePolicyChangedEventType, - Reduce: s.reducePasswordPolicyChanged, - }, - { - Event: org.PasswordAgePolicyRemovedEventType, - Reduce: s.reducePasswordPolicyRemoved, - }, - // // Lockout Policy - { - Event: org.LockoutPolicyAddedEventType, - Reduce: s.reduceLockoutPolicyAdded, - }, - { - Event: org.LockoutPolicyChangedEventType, - Reduce: s.reduceLockoutPolicyChanged, - }, - { - Event: org.LockoutPolicyRemovedEventType, - Reduce: s.reduceOrgLockoutPolicyRemoved, - }, - // // Domain Policy - { - Event: org.DomainPolicyAddedEventType, - Reduce: s.reduceDomainPolicyAdded, - }, - { - Event: org.DomainPolicyChangedEventType, - Reduce: s.reduceDomainPolicyChanged, - }, - { - Event: org.DomainPolicyRemovedEventType, - Reduce: s.reduceOrgDomainPolicyRemoved, - }, - // Notification - { - Event: org.NotificationPolicyAddedEventType, - Reduce: s.reduceNotificationPolicyAdded, - }, - { - Event: org.NotificationPolicyChangedEventType, - Reduce: s.reduceNotificationPolicyChanged, - }, - { - Event: org.NotificationPolicyRemovedEventType, - Reduce: s.reduceOrgNotificationPolicyRemoved, - }, - // Privacy - { - Event: org.PrivacyPolicyAddedEventType, - Reduce: s.reducePrivacyPolicyAdded, - }, - { - Event: org.PrivacyPolicyChangedEventType, - Reduce: s.reducePrivacyPolicyChanged, - }, - { - Event: org.PrivacyPolicyRemovedEventType, - Reduce: s.reduceOrgPrivacyPolicyRemoved, - }, - }, - }, - // // settings - { - Aggregate: settings.AggregateType, - EventReducers: []handler.EventReducer{ - { - Event: settings.OrganizationSettingsSetEventType, - Reduce: s.reduceOrganizationSettingsSet, - }, - { - Event: settings.OrganizationSettingsRemovedEventType, - Reduce: s.reduceOrganizationSettingsRemoved, - }, - }, - }, - { - Aggregate: instance.AggregateType, - EventReducers: []handler.EventReducer{ - // // Login - { - Event: instance.LoginPolicyAddedEventType, - Reduce: s.reduceLoginPolicyAdded, - }, - { - Event: instance.LoginPolicyChangedEventType, - Reduce: s.reduceLoginPolicyChanged, - }, - { - Event: instance.LoginPolicyMultiFactorAddedEventType, - Reduce: s.reduceMFAAdded, - }, - { - Event: instance.LoginPolicyMultiFactorRemovedEventType, - Reduce: s.reduceMFARemoved, - }, - { - Event: instance.LoginPolicySecondFactorAddedEventType, - Reduce: s.reduceSecondFactorAdded, - }, - { - Event: instance.LoginPolicySecondFactorRemovedEventType, - Reduce: s.reduceSecondFactorRemoved, - }, - // // Label - { - Event: instance.LabelPolicyAddedEventType, - Reduce: s.reduceLabelAdded, - }, - { - Event: instance.LabelPolicyChangedEventType, - Reduce: s.reduceLabelChanged, - }, - { - Event: instance.LabelPolicyActivatedEventType, - Reduce: s.reduceLabelActivated, - }, - { - Event: instance.LabelPolicyLogoAddedEventType, - Reduce: s.reduceLogoAdded, - }, - { - Event: instance.LabelPolicyLogoRemovedEventType, - Reduce: s.reduceLogoRemoved, - }, - { - Event: instance.LabelPolicyLogoDarkAddedEventType, - Reduce: s.reduceLogoDarkAdded, - }, - { - Event: instance.LabelPolicyLogoDarkRemovedEventType, - Reduce: s.reduceLogoDarkRemoved, - }, - { - Event: instance.LabelPolicyIconAddedEventType, - Reduce: s.reduceIconAdded, - }, - { - Event: instance.LabelPolicyIconRemovedEventType, - Reduce: s.reduceIconRemoved, - }, - { - Event: instance.LabelPolicyIconDarkAddedEventType, - Reduce: s.reduceIconDarkAdded, - }, - { - Event: instance.LabelPolicyIconDarkRemovedEventType, - Reduce: s.reduceIconDarkRemoved, - }, - { - Event: instance.LabelPolicyFontAddedEventType, - Reduce: s.reduceFontAdded, - }, - { - Event: instance.LabelPolicyFontRemovedEventType, - Reduce: s.reduceFontRemoved, - }, - // // Password Complexity - { - Event: instance.PasswordComplexityPolicyAddedEventType, - Reduce: s.reducePasswordComplexityAdded, - }, - { - Event: instance.PasswordComplexityPolicyChangedEventType, - Reduce: s.reducePasswordComplexityChanged, - }, - // // Password Policy - { - Event: instance.PasswordAgePolicyAddedEventType, - Reduce: s.reducePasswordPolicyAdded, - }, - { - Event: instance.PasswordAgePolicyChangedEventType, - Reduce: s.reducePasswordPolicyChanged, - }, - // // Lockout Policy - { - Event: instance.LockoutPolicyAddedEventType, - Reduce: s.reduceLockoutPolicyAdded, - }, - { - Event: instance.LockoutPolicyChangedEventType, - Reduce: s.reduceLockoutPolicyChanged, - }, - // // Domain Policy - { - Event: instance.DomainPolicyAddedEventType, - Reduce: s.reduceDomainPolicyAdded, - }, - { - Event: instance.DomainPolicyChangedEventType, - Reduce: s.reduceDomainPolicyChanged, - }, - // // Security Policy - { - Event: instance.SecurityPolicySetEventType, - Reduce: s.reduceSecurityPolicySet, - }, - // Notification - { - Event: instance.NotificationPolicyAddedEventType, - Reduce: s.reduceNotificationPolicyAdded, - }, - { - Event: instance.NotificationPolicyChangedEventType, - Reduce: s.reduceNotificationPolicyChanged, - }, - // Privacy policy - { - Event: instance.PrivacyPolicyAddedEventType, - Reduce: s.reducePrivacyPolicyAdded, - }, - { - Event: instance.PrivacyPolicyChangedEventType, - Reduce: s.reducePrivacyPolicyChanged, - }, - // Secret Generator - { - Event: instance.SecretGeneratorAddedEventType, - Reduce: s.reduceSecretGeneratorAdded, - }, - { - Event: instance.SecretGeneratorChangedEventType, - Reduce: s.reduceSecretGeneratorChanged, - }, - { - Event: instance.SecretGeneratorRemovedEventType, - Reduce: s.reduceSecretGeneratorRemoved, - }, - }, - }, - } -} - -func (s *settingsRelationalProjection) reduceLoginPolicyAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceLoginPolicyAdded(event eventstore.Event) (*handler.Statement, error) { var orgId *string var policyEvent policy.LoginPolicyAddedEvent switch e := event.(type) { @@ -391,7 +34,7 @@ func (s *settingsRelationalProjection) reduceLoginPolicyAdded(event eventstore.E return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-YYPxS", "reduce.wrong.event.type %v", []eventstore.EventType{org.LoginPolicyAddedEventType, instance.LoginPolicyAddedEventType}) } - return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-5hONE", "reduce.wrong.db.pool %T", ex) @@ -432,8 +75,7 @@ func (s *settingsRelationalProjection) reduceLoginPolicyAdded(event eventstore.E }), nil } -// //nolint:gocognit -func (s *settingsRelationalProjection) reduceLoginPolicyChanged(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceLoginPolicyChanged(event eventstore.Event) (*handler.Statement, error) { var orgId *string var policyEvent policy.LoginPolicyChangedEvent switch e := event.(type) { @@ -446,7 +88,7 @@ func (s *settingsRelationalProjection) reduceLoginPolicyChanged(event eventstore return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-BHd86", "reduce.wrong.event.type %v", []eventstore.EventType{org.LoginPolicyChangedEventType, instance.LoginPolicyChangedEventType}) } - return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-rLk9y", "reduce.wrong.db.pool %T", ex) @@ -491,7 +133,7 @@ func (s *settingsRelationalProjection) reduceLoginPolicyChanged(event eventstore }), nil } -func (s *settingsRelationalProjection) reduceMFAAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceLoginPolicyMFAAdded(event eventstore.Event) (*handler.Statement, error) { var orgId *string var policyEvent policy.MultiFactorAddedEvent switch e := event.(type) { @@ -504,7 +146,7 @@ func (s *settingsRelationalProjection) reduceMFAAdded(event eventstore.Event) (* return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-WghuV", "reduce.wrong.event.type %v", []eventstore.EventType{org.LoginPolicyMultiFactorAddedEventType, instance.LoginPolicyMultiFactorAddedEventType}) } - return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-rLw7y", "reduce.wrong.db.pool %T", ex) @@ -522,7 +164,7 @@ func (s *settingsRelationalProjection) reduceMFAAdded(event eventstore.Event) (* }), nil } -func (s *settingsRelationalProjection) reduceMFARemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceLoginPolicyMFARemoved(event eventstore.Event) (*handler.Statement, error) { var orgId *string var policyEvent policy.MultiFactorRemovedEvent switch e := event.(type) { @@ -535,7 +177,7 @@ func (s *settingsRelationalProjection) reduceMFARemoved(event eventstore.Event) return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-cHU7u", "reduce.wrong.event.type %v", []eventstore.EventType{org.LoginPolicyMultiFactorRemovedEventType, instance.LoginPolicyMultiFactorRemovedEventType}) } - return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-rLi9y", "reduce.wrong.db.pool %T", ex) @@ -553,12 +195,12 @@ func (s *settingsRelationalProjection) reduceMFARemoved(event eventstore.Event) }), nil } -func (*settingsRelationalProjection) reduceLoginPolicyRemoved(event eventstore.Event) (*handler.Statement, error) { +func (*relationalTablesProjection) reduceLoginPolicyRemoved(event eventstore.Event) (*handler.Statement, error) { loginPolicyRemovedEvent, ok := event.(*org.LoginPolicyRemovedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-oRSvD", "reduce.wrong.event.type %s", org.LoginPolicyRemovedEventType) } - return handler.NewStatement(loginPolicyRemovedEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(loginPolicyRemovedEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-arg9y", "reduce.wrong.db.pool %T", ex) @@ -573,7 +215,7 @@ func (*settingsRelationalProjection) reduceLoginPolicyRemoved(event eventstore.E }), nil } -func (s *settingsRelationalProjection) reduceSecondFactorAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceLoginPolicySecondFactorAdded(event eventstore.Event) (*handler.Statement, error) { var orgId *string var policyEvent policy.SecondFactorAddedEvent switch e := event.(type) { @@ -586,7 +228,7 @@ func (s *settingsRelationalProjection) reduceSecondFactorAdded(event eventstore. return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-apB2E", "reduce.wrong.event.type %v", []eventstore.EventType{org.LoginPolicySecondFactorAddedEventType, instance.LoginPolicySecondFactorAddedEventType}) } - return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iLk4m", "reduce.wrong.db.pool %T", ex) @@ -604,7 +246,7 @@ func (s *settingsRelationalProjection) reduceSecondFactorAdded(event eventstore. }), nil } -func (s *settingsRelationalProjection) reduceSecondFactorRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceLoginPolicySecondFactorRemoved(event eventstore.Event) (*handler.Statement, error) { var orgId *string var policyEvent policy.SecondFactorRemovedEvent switch e := event.(type) { @@ -617,7 +259,7 @@ func (s *settingsRelationalProjection) reduceSecondFactorRemoved(event eventstor return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-bYpmA", "reduce.wrong.event.type %v", []eventstore.EventType{org.LoginPolicySecondFactorRemovedEventType, instance.LoginPolicySecondFactorRemovedEventType}) } - return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-rnd0y", "reduce.wrong.db.pool %T", ex) @@ -635,7 +277,7 @@ func (s *settingsRelationalProjection) reduceSecondFactorRemoved(event eventstor } // label -func (s *settingsRelationalProjection) reduceLabelAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceLabelPolicyAdded(event eventstore.Event) (*handler.Statement, error) { var orgId *string var policyEvent policy.LabelPolicyAddedEvent switch e := event.(type) { @@ -648,7 +290,7 @@ func (s *settingsRelationalProjection) reduceLabelAdded(event eventstore.Event) return nil, zerrors.ThrowInvalidArgumentf(nil, "PROJE-CSE7A", "reduce.wrong.event.type %v", []eventstore.EventType{org.LabelPolicyAddedEventType, instance.LabelPolicyAddedEventType}) } - return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-5hONE", "reduce.wrong.db.pool %T", ex) @@ -686,7 +328,7 @@ func (s *settingsRelationalProjection) reduceLabelAdded(event eventstore.Event) }), nil } -func (s *settingsRelationalProjection) reduceLabelChanged(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceLabelPolicyChanged(event eventstore.Event) (*handler.Statement, error) { var orgId *string var policyEvent policy.LabelPolicyChangedEvent switch e := event.(type) { @@ -699,7 +341,7 @@ func (s *settingsRelationalProjection) reduceLabelChanged(event eventstore.Event return nil, zerrors.ThrowInvalidArgumentf(nil, "PROJE-qgVug", "reduce.wrong.event.type %v", []eventstore.EventType{org.LabelPolicyChangedEventType, instance.LabelPolicyChangedEventType}) } - return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-lhb9y", "reduce.wrong.db.pool %T", ex) @@ -739,13 +381,13 @@ func (s *settingsRelationalProjection) reduceLabelChanged(event eventstore.Event }), nil } -func (s *settingsRelationalProjection) reduceLabelPolicyRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceLabelPolicyRemoved(event eventstore.Event) (*handler.Statement, error) { policyEvent, ok := event.(*org.LabelPolicyRemovedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "PROJE-ATMBz", "reduce.wrong.event.type %s", org.LabelPolicyRemovedEventType) } - return handler.NewStatement(policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-r7k0y", "reduce.wrong.db.pool %T", ex) @@ -759,7 +401,7 @@ func (s *settingsRelationalProjection) reduceLabelPolicyRemoved(event eventstore }), nil } -func (s *settingsRelationalProjection) reduceLabelActivated(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceLabelPolicyActivated(event eventstore.Event) (*handler.Statement, error) { var orgId *string var policyEvent policy.LabelPolicyActivatedEvent switch e := event.(type) { @@ -772,7 +414,7 @@ func (s *settingsRelationalProjection) reduceLabelActivated(event eventstore.Eve return nil, zerrors.ThrowInvalidArgumentf(nil, "PROJE-7Kd8U", "reduce.wrong.event.type %v", []eventstore.EventType{org.LabelPolicyActivatedEventType, instance.LabelPolicyActivatedEventType}) } - return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-r7k0y", "reduce.wrong.db.pool %T", ex) @@ -787,7 +429,7 @@ func (s *settingsRelationalProjection) reduceLabelActivated(event eventstore.Eve }), nil } -func (s *settingsRelationalProjection) reduceLogoAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceLabelPolicyLogoAdded(event eventstore.Event) (*handler.Statement, error) { var orgId *string var policyEvent policy.LabelPolicyLogoAddedEvent switch e := event.(type) { @@ -799,7 +441,7 @@ func (s *settingsRelationalProjection) reduceLogoAdded(event eventstore.Event) ( default: return nil, zerrors.ThrowInvalidArgumentf(nil, "PROJE-kg8H4", "reduce.wrong.event.type %v", []eventstore.EventType{org.LabelPolicyLogoAddedEventType, instance.LabelPolicyLogoAddedEventType}) } - return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-5hONE", "reduce.wrong.db.pool %T", ex) @@ -825,7 +467,7 @@ func (s *settingsRelationalProjection) reduceLogoAdded(event eventstore.Event) ( }), nil } -func (s *settingsRelationalProjection) reduceLogoDarkAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceLabelPolicyLogoDarkAdded(event eventstore.Event) (*handler.Statement, error) { var orgId *string var policyEvent policy.LabelPolicyLogoDarkAddedEvent switch e := event.(type) { @@ -838,7 +480,7 @@ func (s *settingsRelationalProjection) reduceLogoDarkAdded(event eventstore.Even return nil, zerrors.ThrowInvalidArgumentf(nil, "PROJE-kg8H4", "reduce.wrong.event.type %v", []eventstore.EventType{org.LabelPolicyLogoDarkAddedEventType, instance.LabelPolicyLogoDarkAddedEventType}) } - return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-5hONE", "reduce.wrong.db.pool %T", ex) @@ -864,7 +506,7 @@ func (s *settingsRelationalProjection) reduceLogoDarkAdded(event eventstore.Even }), nil } -func (s *settingsRelationalProjection) reduceLogoRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceLabelPolicyLogoRemoved(event eventstore.Event) (*handler.Statement, error) { var orgId *string var policyEvent policy.LabelPolicyLogoRemovedEvent switch e := event.(type) { @@ -877,7 +519,7 @@ func (s *settingsRelationalProjection) reduceLogoRemoved(event eventstore.Event) return nil, zerrors.ThrowInvalidArgumentf(nil, "PROJE-kg8H4", "reduce.wrong.event.type %v", []eventstore.EventType{org.LabelPolicyLogoRemovedEventType, instance.LabelPolicyLogoRemovedEventType}) } - return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-5hONE", "reduce.wrong.db.pool %T", ex) @@ -898,7 +540,7 @@ func (s *settingsRelationalProjection) reduceLogoRemoved(event eventstore.Event) }), nil } -func (s *settingsRelationalProjection) reduceLogoDarkRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceLabelPolicyLogoDarkRemoved(event eventstore.Event) (*handler.Statement, error) { var orgId *string var policyEvent policy.LabelPolicyLogoDarkRemovedEvent switch e := event.(type) { @@ -911,7 +553,7 @@ func (s *settingsRelationalProjection) reduceLogoDarkRemoved(event eventstore.Ev return nil, zerrors.ThrowInvalidArgumentf(nil, "PROJE-kg8H4", "reduce.wrong.event.type %v", []eventstore.EventType{org.LabelPolicyLogoDarkRemovedEventType, instance.LabelPolicyLogoDarkRemovedEventType}) } - return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-5hONE", "reduce.wrong.db.pool %T", ex) @@ -931,7 +573,7 @@ func (s *settingsRelationalProjection) reduceLogoDarkRemoved(event eventstore.Ev }), nil } -func (s *settingsRelationalProjection) reduceIconAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceLabelPolicyIconAdded(event eventstore.Event) (*handler.Statement, error) { var orgId *string var policyEvent policy.LabelPolicyIconAddedEvent switch e := event.(type) { @@ -944,7 +586,7 @@ func (s *settingsRelationalProjection) reduceIconAdded(event eventstore.Event) ( return nil, zerrors.ThrowInvalidArgumentf(nil, "PROJE-e2JFz", "reduce.wrong.event.type %v", []eventstore.EventType{org.LabelPolicyIconDarkAddedEventType, instance.LabelPolicyIconDarkAddedEventType}) } - return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-5hONE", "reduce.wrong.db.pool %T", ex) @@ -970,7 +612,7 @@ func (s *settingsRelationalProjection) reduceIconAdded(event eventstore.Event) ( }), nil } -func (s *settingsRelationalProjection) reduceIconDarkAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceLabelPolicyIconDarkAdded(event eventstore.Event) (*handler.Statement, error) { var orgId *string var policyEvent policy.LabelPolicyIconDarkAddedEvent switch e := event.(type) { @@ -983,7 +625,7 @@ func (s *settingsRelationalProjection) reduceIconDarkAdded(event eventstore.Even return nil, zerrors.ThrowInvalidArgumentf(nil, "PROJE-e2JFz", "reduce.wrong.event.type %v", []eventstore.EventType{org.LabelPolicyIconDarkAddedEventType, instance.LabelPolicyIconDarkAddedEventType}) } - return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-5hONE", "reduce.wrong.db.pool %T", ex) @@ -1009,7 +651,7 @@ func (s *settingsRelationalProjection) reduceIconDarkAdded(event eventstore.Even }), nil } -func (s *settingsRelationalProjection) reduceIconRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceLabelPolicyIconRemoved(event eventstore.Event) (*handler.Statement, error) { var orgId *string var policyEvent policy.LabelPolicyIconRemovedEvent switch e := event.(type) { @@ -1022,7 +664,7 @@ func (s *settingsRelationalProjection) reduceIconRemoved(event eventstore.Event) return nil, zerrors.ThrowInvalidArgumentf(nil, "PROJE-gfgbY", "reduce.wrong.event.type %v", []eventstore.EventType{org.LabelPolicyIconRemovedEventType, instance.LabelPolicyIconRemovedEventType}) } - return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-5hONE", "reduce.wrong.db.pool %T", ex) @@ -1043,7 +685,7 @@ func (s *settingsRelationalProjection) reduceIconRemoved(event eventstore.Event) }), nil } -func (s *settingsRelationalProjection) reduceIconDarkRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceLabelPolicyIconDarkRemoved(event eventstore.Event) (*handler.Statement, error) { var orgId *string var policyEvent policy.LabelPolicyIconDarkRemovedEvent switch e := event.(type) { @@ -1056,7 +698,7 @@ func (s *settingsRelationalProjection) reduceIconDarkRemoved(event eventstore.Ev return nil, zerrors.ThrowInvalidArgumentf(nil, "PROJE-gfgbY", "reduce.wrong.event.type %v", []eventstore.EventType{org.LabelPolicyIconDarkRemovedEventType, instance.LabelPolicyIconDarkRemovedEventType}) } - return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-5hONE", "reduce.wrong.db.pool %T", ex) @@ -1077,7 +719,7 @@ func (s *settingsRelationalProjection) reduceIconDarkRemoved(event eventstore.Ev }), nil } -func (s *settingsRelationalProjection) reduceFontAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceLabelPolicyFontAdded(event eventstore.Event) (*handler.Statement, error) { var orgId *string var policyEvent policy.LabelPolicyFontAddedEvent switch e := event.(type) { @@ -1090,7 +732,7 @@ func (s *settingsRelationalProjection) reduceFontAdded(event eventstore.Event) ( return nil, zerrors.ThrowInvalidArgumentf(nil, "PROJE-65i9W", "reduce.wrong.event.type %v", []eventstore.EventType{org.LabelPolicyFontAddedEventType, instance.LabelPolicyFontAddedEventType}) } - return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-5hONE", "reduce.wrong.db.pool %T", ex) @@ -1116,7 +758,7 @@ func (s *settingsRelationalProjection) reduceFontAdded(event eventstore.Event) ( }), nil } -func (s *settingsRelationalProjection) reduceFontRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceLabelPolicyFontRemoved(event eventstore.Event) (*handler.Statement, error) { var orgId *string var policyEvent policy.LabelPolicyFontRemovedEvent switch e := event.(type) { @@ -1129,7 +771,7 @@ func (s *settingsRelationalProjection) reduceFontRemoved(event eventstore.Event) return nil, zerrors.ThrowInvalidArgumentf(nil, "PROJE-xf32J", "reduce.wrong.event.type %v", []eventstore.EventType{org.LabelPolicyFontRemovedEventType, instance.LabelPolicyFontRemovedEventType}) } - return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-5hONE", "reduce.wrong.db.pool %T", ex) @@ -1150,7 +792,7 @@ func (s *settingsRelationalProjection) reduceFontRemoved(event eventstore.Event) }), nil } -func (s *settingsRelationalProjection) reducePasswordComplexityAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reducePasswordComplexityPolicyAdded(event eventstore.Event) (*handler.Statement, error) { var orgId *string var policyEvent policy.PasswordComplexityPolicyAddedEvent switch e := event.(type) { @@ -1163,7 +805,7 @@ func (s *settingsRelationalProjection) reducePasswordComplexityAdded(event event return nil, zerrors.ThrowInvalidArgumentf(nil, "PROJE-KTHmJ", "reduce.wrong.event.type %v", []eventstore.EventType{org.PasswordComplexityPolicyAddedEventType, instance.PasswordComplexityPolicyAddedEventType}) } - return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-5hONE", "reduce.wrong.db.pool %T", ex) @@ -1189,7 +831,7 @@ func (s *settingsRelationalProjection) reducePasswordComplexityAdded(event event }), nil } -func (s *settingsRelationalProjection) reducePasswordComplexityChanged(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reducePasswordComplexityPolicyChanged(event eventstore.Event) (*handler.Statement, error) { var orgId *string var policyEvent policy.PasswordComplexityPolicyChangedEvent switch e := event.(type) { @@ -1202,7 +844,7 @@ func (s *settingsRelationalProjection) reducePasswordComplexityChanged(event eve return nil, zerrors.ThrowInvalidArgumentf(nil, "PROJE-cf3Xb", "reduce.wrong.event.type %v", []eventstore.EventType{org.PasswordComplexityPolicyChangedEventType, instance.PasswordComplexityPolicyChangedEventType}) } - return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-rLrfy", "reduce.wrong.db.pool %T", ex) @@ -1227,13 +869,13 @@ func (s *settingsRelationalProjection) reducePasswordComplexityChanged(event eve }), nil } -func (s *settingsRelationalProjection) reducePasswordComplexityRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reducePasswordComplexityPolicyRemoved(event eventstore.Event) (*handler.Statement, error) { policyEvent, ok := event.(*org.PasswordComplexityPolicyRemovedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "PROJE-wttCd", "reduce.wrong.event.type %s", org.PasswordComplexityPolicyRemovedEventType) } - return handler.NewStatement(policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-UrdHy", "reduce.wrong.db.pool %T", ex) @@ -1247,7 +889,7 @@ func (s *settingsRelationalProjection) reducePasswordComplexityRemoved(event eve }), nil } -func (s *settingsRelationalProjection) reducePasswordPolicyAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reducePasswordAgePolicyAdded(event eventstore.Event) (*handler.Statement, error) { var orgId *string var policyEvent policy.PasswordAgePolicyAddedEvent switch e := event.(type) { @@ -1260,7 +902,7 @@ func (s *settingsRelationalProjection) reducePasswordPolicyAdded(event eventstor return nil, zerrors.ThrowInvalidArgumentf(nil, "PROJE-CJqF0", "reduce.wrong.event.type %v", []eventstore.EventType{org.PasswordAgePolicyAddedEventType, instance.PasswordAgePolicyAddedEventType}) } - return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-5hONE", "reduce.wrong.db.pool %T", ex) @@ -1283,7 +925,7 @@ func (s *settingsRelationalProjection) reducePasswordPolicyAdded(event eventstor }), nil } -func (s *settingsRelationalProjection) reducePasswordPolicyChanged(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reducePasswordAgePolicyChanged(event eventstore.Event) (*handler.Statement, error) { var orgId *string var policyEvent policy.PasswordAgePolicyChangedEvent switch e := event.(type) { @@ -1295,7 +937,7 @@ func (s *settingsRelationalProjection) reducePasswordPolicyChanged(event eventst default: return nil, zerrors.ThrowInvalidArgumentf(nil, "PROJE-i7FZt", "reduce.wrong.event.type %v", []eventstore.EventType{org.PasswordAgePolicyChangedEventType, instance.PasswordAgePolicyChangedEventType}) } - return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-Mlk6y", "reduce.wrong.db.pool %T", ex) @@ -1317,12 +959,12 @@ func (s *settingsRelationalProjection) reducePasswordPolicyChanged(event eventst }), nil } -func (s *settingsRelationalProjection) reducePasswordPolicyRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reducePasswordAgePolicyRemoved(event eventstore.Event) (*handler.Statement, error) { policyEvent, ok := event.(*org.PasswordAgePolicyRemovedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "PROJE-EtHWB", "reduce.wrong.event.type %s", org.PasswordAgePolicyRemovedEventType) } - return handler.NewStatement(policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-UrdHy", "reduce.wrong.db.pool %T", ex) @@ -1336,12 +978,12 @@ func (s *settingsRelationalProjection) reducePasswordPolicyRemoved(event eventst }), nil } -func (s *settingsRelationalProjection) reduceOrgLockoutPolicyRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceOrgLockoutPolicyRemoved(event eventstore.Event) (*handler.Statement, error) { policyEvent, ok := event.(*org.LockoutPolicyRemovedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "PROJE-Bqut9", "reduce.wrong.event.type %s", org.LockoutPolicyRemovedEventType) } - return handler.NewStatement(policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-UrdHy", "reduce.wrong.db.pool %T", ex) @@ -1355,7 +997,7 @@ func (s *settingsRelationalProjection) reduceOrgLockoutPolicyRemoved(event event }), nil } -func (s *settingsRelationalProjection) reduceLockoutPolicyAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceLockoutPolicyAdded(event eventstore.Event) (*handler.Statement, error) { var orgId *string var policyEvent policy.LockoutPolicyAddedEvent switch e := event.(type) { @@ -1368,7 +1010,7 @@ func (s *settingsRelationalProjection) reduceLockoutPolicyAdded(event eventstore return nil, zerrors.ThrowInvalidArgumentf(nil, "PROJE-d8mZO", "reduce.wrong.event.type, %v", []eventstore.EventType{org.LockoutPolicyAddedEventType, instance.LockoutPolicyAddedEventType}) } - return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-5hnNE", "reduce.wrong.db.pool %T", ex) @@ -1391,7 +1033,7 @@ func (s *settingsRelationalProjection) reduceLockoutPolicyAdded(event eventstore }), nil } -func (s *settingsRelationalProjection) reduceLockoutPolicyChanged(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceLockoutPolicyChanged(event eventstore.Event) (*handler.Statement, error) { var orgId *string var policyEvent policy.LockoutPolicyChangedEvent switch e := event.(type) { @@ -1404,7 +1046,7 @@ func (s *settingsRelationalProjection) reduceLockoutPolicyChanged(event eventsto return nil, zerrors.ThrowInvalidArgumentf(nil, "PROJE-gT3BQ", "reduce.wrong.event.type, %v", []eventstore.EventType{org.LockoutPolicyChangedEventType, instance.LockoutPolicyChangedEventType}) } - return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-rbsxy", "reduce.wrong.db.pool %T", ex) @@ -1428,7 +1070,7 @@ func (s *settingsRelationalProjection) reduceLockoutPolicyChanged(event eventsto }), nil } -func (s *settingsRelationalProjection) reduceDomainPolicyAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceDomainPolicyAdded(event eventstore.Event) (*handler.Statement, error) { var orgId *string var policyEvent policy.DomainPolicyAddedEvent switch e := event.(type) { @@ -1441,7 +1083,7 @@ func (s *settingsRelationalProjection) reduceDomainPolicyAdded(event eventstore. return nil, zerrors.ThrowInvalidArgumentf(nil, "PROJE-8se7M", "reduce.wrong.event.type %v", []eventstore.EventType{org.DomainPolicyAddedEventType, instance.DomainPolicyAddedEventType}) } - return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-chduE", "reduce.wrong.db.pool %T", ex) @@ -1465,7 +1107,7 @@ func (s *settingsRelationalProjection) reduceDomainPolicyAdded(event eventstore. }), nil } -func (s *settingsRelationalProjection) reduceDomainPolicyChanged(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceDomainPolicyChanged(event eventstore.Event) (*handler.Statement, error) { var orgId *string var policyEvent policy.DomainPolicyChangedEvent switch e := event.(type) { @@ -1478,7 +1120,7 @@ func (s *settingsRelationalProjection) reduceDomainPolicyChanged(event eventstor return nil, zerrors.ThrowInvalidArgumentf(nil, "PROJE-qgVug", "reduce.wrong.event.type %v", []eventstore.EventType{org.DomainPolicyChangedEventType, instance.DomainPolicyChangedEventType}) } - return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-rbsxy", "reduce.wrong.db.pool %T", ex) @@ -1501,12 +1143,12 @@ func (s *settingsRelationalProjection) reduceDomainPolicyChanged(event eventstor }), nil } -func (s *settingsRelationalProjection) reduceOrgDomainPolicyRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceOrgDomainPolicyRemoved(event eventstore.Event) (*handler.Statement, error) { policyEvent, ok := event.(*org.DomainPolicyRemovedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "PROJE-Bqut9", "reduce.wrong.event.type %s", org.LockoutPolicyRemovedEventType) } - return handler.NewStatement(policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-UrdHy", "reduce.wrong.db.pool %T", ex) @@ -1520,7 +1162,7 @@ func (s *settingsRelationalProjection) reduceOrgDomainPolicyRemoved(event events }), nil } -func (s *settingsRelationalProjection) reduceNotificationPolicyAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceNotificationPolicyAdded(event eventstore.Event) (*handler.Statement, error) { var orgId *string var policyEvent policy.NotificationPolicyAddedEvent switch e := event.(type) { @@ -1533,7 +1175,7 @@ func (s *settingsRelationalProjection) reduceNotificationPolicyAdded(event event return nil, zerrors.ThrowInvalidArgumentf(nil, "PROJE-8se7M", "reduce.wrong.event.type %v", []eventstore.EventType{org.NotificationPolicyAddedEventType, instance.NotificationPolicyAddedEventType}) } - return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-chduE", "reduce.wrong.db.pool %T", ex) @@ -1555,7 +1197,7 @@ func (s *settingsRelationalProjection) reduceNotificationPolicyAdded(event event }), nil } -func (s *settingsRelationalProjection) reduceNotificationPolicyChanged(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceNotificationPolicyChanged(event eventstore.Event) (*handler.Statement, error) { var orgId *string var policyEvent policy.NotificationPolicyChangedEvent switch e := event.(type) { @@ -1568,7 +1210,7 @@ func (s *settingsRelationalProjection) reduceNotificationPolicyChanged(event eve return nil, zerrors.ThrowInvalidArgumentf(nil, "PROJE-qgVug", "reduce.wrong.event.type %v", []eventstore.EventType{org.NotificationPolicyChangedEventType, instance.NotificationPolicyChangedEventType}) } - return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-rbsxy", "reduce.wrong.db.pool %T", ex) @@ -1590,12 +1232,12 @@ func (s *settingsRelationalProjection) reduceNotificationPolicyChanged(event eve }), nil } -func (s *settingsRelationalProjection) reduceOrgNotificationPolicyRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceOrgNotificationPolicyRemoved(event eventstore.Event) (*handler.Statement, error) { policyEvent, ok := event.(*org.NotificationPolicyRemovedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "PROJE-Bqut9", "reduce.wrong.event.type %s", org.NotificationPolicyRemovedEventType) } - return handler.NewStatement(policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-UrdHy", "reduce.wrong.db.pool %T", ex) @@ -1609,7 +1251,7 @@ func (s *settingsRelationalProjection) reduceOrgNotificationPolicyRemoved(event }), nil } -func (s *settingsRelationalProjection) reducePrivacyPolicyAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reducePrivacyPolicyAdded(event eventstore.Event) (*handler.Statement, error) { var orgId *string var policyEvent policy.PrivacyPolicyAddedEvent switch e := event.(type) { @@ -1622,7 +1264,7 @@ func (s *settingsRelationalProjection) reducePrivacyPolicyAdded(event eventstore return nil, zerrors.ThrowInvalidArgumentf(nil, "PROJE-8se7M", "reduce.wrong.event.type %v", []eventstore.EventType{org.PrivacyPolicyAddedEventType, instance.PrivacyPolicyAddedEventType}) } - return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-chduE", "reduce.wrong.db.pool %T", ex) @@ -1651,7 +1293,7 @@ func (s *settingsRelationalProjection) reducePrivacyPolicyAdded(event eventstore }), nil } -func (s *settingsRelationalProjection) reducePrivacyPolicyChanged(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reducePrivacyPolicyChanged(event eventstore.Event) (*handler.Statement, error) { var orgId *string var policyEvent policy.PrivacyPolicyChangedEvent switch e := event.(type) { @@ -1664,7 +1306,7 @@ func (s *settingsRelationalProjection) reducePrivacyPolicyChanged(event eventsto return nil, zerrors.ThrowInvalidArgumentf(nil, "PROJE-qgVug", "reduce.wrong.event.type %v", []eventstore.EventType{org.PrivacyPolicyChangedEventType, instance.PrivacyPolicyChangedEventType}) } - return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(&policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-rbsxy", "reduce.wrong.db.pool %T", ex) @@ -1695,12 +1337,12 @@ func (s *settingsRelationalProjection) reducePrivacyPolicyChanged(event eventsto }), nil } -func (s *settingsRelationalProjection) reduceOrgPrivacyPolicyRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceOrgPrivacyPolicyRemoved(event eventstore.Event) (*handler.Statement, error) { policyEvent, ok := event.(*org.PrivacyPolicyRemovedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "PROJE-Bqut9", "reduce.wrong.event.type %s", org.PrivacyPolicyRemovedEventType) } - return handler.NewStatement(policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-UrdHy", "reduce.wrong.db.pool %T", ex) @@ -1714,13 +1356,13 @@ func (s *settingsRelationalProjection) reduceOrgPrivacyPolicyRemoved(event event }), nil } -func (s *settingsRelationalProjection) reduceSecurityPolicySet(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceSecurityPolicySet(event eventstore.Event) (*handler.Statement, error) { policyEvent, ok := event.(*instance.SecurityPolicySetEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-83U8p", "reduce.wrong.event.type %s", instance.SecurityPolicySetEventType) } - return handler.NewStatement(policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-lhPul", "reduce.wrong.db.pool %T", ex) @@ -1749,13 +1391,13 @@ func (s *settingsRelationalProjection) reduceSecurityPolicySet(event eventstore. }), nil } -func (s *settingsRelationalProjection) reduceOrganizationSettingsSet(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceOrganizationSettingsSet(event eventstore.Event) (*handler.Statement, error) { policyEvent, err := assertEvent[*settings.OrganizationSettingsSetEvent](event) if err != nil { return nil, err } - return handler.NewStatement(policyEvent, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(policyEvent, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-lhPul", "reduce.wrong.db.pool %T", ex) @@ -1777,13 +1419,13 @@ func (s *settingsRelationalProjection) reduceOrganizationSettingsSet(event event }), nil } -func (s *settingsRelationalProjection) reduceOrganizationSettingsRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceOrganizationSettingsRemoved(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*settings.OrganizationSettingsRemovedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-rHiHb", "reduce.wrong.db.pool %T", ex) @@ -1797,13 +1439,13 @@ func (s *settingsRelationalProjection) reduceOrganizationSettingsRemoved(event e }), nil } -func (s *settingsRelationalProjection) reduceSecretGeneratorAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceSecretGeneratorAdded(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*instance.SecretGeneratorAddedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-yTuWKA", "reduce.wrong.event.type %s", instance.SecretGeneratorAddedEventType) } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-jNhP6P", "reduce.wrong.db.pool %T", ex) @@ -1835,13 +1477,13 @@ func (s *settingsRelationalProjection) reduceSecretGeneratorAdded(event eventsto }), nil } -func (s *settingsRelationalProjection) reduceSecretGeneratorChanged(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceSecretGeneratorChanged(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*instance.SecretGeneratorChangedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-HhaZbQ", "reduce.wrong.event.type %s", instance.SecretGeneratorChangedEventType) } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-3SidEv", "reduce.wrong.db.pool %T", ex) @@ -1872,13 +1514,13 @@ func (s *settingsRelationalProjection) reduceSecretGeneratorChanged(event events }), nil } -func (s *settingsRelationalProjection) reduceSecretGeneratorRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceSecretGeneratorRemoved(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*instance.SecretGeneratorRemovedEvent) if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-fmiIf", "reduce.wrong.event.type %s", instance.SecretGeneratorRemovedEventType) } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-xOUC9O", "reduce.wrong.db.pool %T", ex) diff --git a/internal/query/projection/user_relational.go b/internal/query/projection/user_relational.go index 214277c1c..c37995f30 100644 --- a/internal/query/projection/user_relational.go +++ b/internal/query/projection/user_relational.go @@ -17,441 +17,12 @@ import ( "github.com/zitadel/zitadel/internal/zerrors" ) -const ( - UserRelationProjectionTable = "zitadel.users" -) - -type userRelationalProjection struct{} - -func (*userRelationalProjection) Name() string { - return UserRelationProjectionTable -} - -func newUserRelationalProjection(ctx context.Context, config handler.Config) *handler.Handler { - return handler.NewHandler(ctx, &config, new(userRelationalProjection)) -} - -func (p *userRelationalProjection) Reducers() []handler.AggregateReducer { - return []handler.AggregateReducer{ - { - Aggregate: user.AggregateType, - EventReducers: []handler.EventReducer{ - { - Event: user.UserV1AddedType, - Reduce: p.reduceHumanAdded, - }, - { - Event: user.HumanAddedType, - Reduce: p.reduceHumanAdded, - }, - { - Event: user.UserV1RegisteredType, - Reduce: p.reduceHumanRegistered, - }, - { - Event: user.HumanRegisteredType, - Reduce: p.reduceHumanRegistered, - }, - { - Event: user.UserLockedType, - Reduce: p.reduceUserLocked, - }, - { - Event: user.UserUnlockedType, - Reduce: p.reduceUserUnlocked, - }, - { - Event: user.UserDeactivatedType, - Reduce: p.reduceUserDeactivated, - }, - { - Event: user.UserReactivatedType, - Reduce: p.reduceUserReactivated, - }, - { - Event: user.UserRemovedType, - Reduce: p.reduceUserRemoved, - }, - - { - Event: user.UserUserNameChangedType, - Reduce: p.reduceUsernameChanged, - }, - { - Event: user.UserDomainClaimedType, - Reduce: p.reduceDomainClaimed, - }, - - { - Event: user.HumanProfileChangedType, - Reduce: p.reduceHumanProfileChanged, - }, - { - Event: user.UserV1ProfileChangedType, - Reduce: p.reduceHumanProfileChanged, - }, - - { - Event: user.HumanEmailChangedType, - Reduce: p.reduceHumanEmailChanged, - }, - { - Event: user.UserV1EmailChangedType, - Reduce: p.reduceHumanEmailChanged, - }, - { - Event: user.HumanEmailVerifiedType, - Reduce: p.reduceHumanEmailVerified, - }, - { - Event: user.UserV1EmailVerifiedType, - Reduce: p.reduceHumanEmailVerified, - }, - { - Event: user.HumanEmailCodeAddedType, - Reduce: p.reduceHumanEmailCodeAdded, - }, - { - Event: user.UserV1EmailCodeAddedType, - Reduce: p.reduceHumanEmailCodeAdded, - }, - { - Event: user.HumanEmailVerificationFailedType, - Reduce: p.reduceHumanEmailVerificationFailed, - }, - { - Event: user.UserV1EmailVerificationFailedType, - Reduce: p.reduceHumanEmailVerificationFailed, - }, - { - Event: user.HumanPhoneChangedType, - Reduce: p.reduceHumanPhoneChanged, - }, - { - Event: user.UserV1PhoneChangedType, - Reduce: p.reduceHumanPhoneChanged, - }, - { - Event: user.HumanPhoneRemovedType, - Reduce: p.reduceHumanPhoneRemoved, - }, - { - Event: user.UserV1PhoneRemovedType, - Reduce: p.reduceHumanPhoneRemoved, - }, - { - Event: user.HumanPhoneVerifiedType, - Reduce: p.reduceHumanPhoneVerified, - }, - { - Event: user.UserV1PhoneVerifiedType, - Reduce: p.reduceHumanPhoneVerified, - }, - { - Event: user.HumanPhoneCodeAddedType, - Reduce: p.reduceHumanPhoneCodeAdded, - }, - { - Event: user.UserV1PhoneCodeAddedType, - Reduce: p.reduceHumanPhoneCodeAdded, - }, - { - Event: user.HumanPhoneVerificationFailedType, - Reduce: p.reduceHumanPhoneVerificationFailed, - }, - { - Event: user.UserV1PhoneVerificationFailedType, - Reduce: p.reduceHumanPhoneVerificationFailed, - }, - - { - Event: user.HumanAvatarAddedType, - Reduce: p.reduceHumanAvatarAdded, - }, - { - Event: user.HumanAvatarRemovedType, - Reduce: p.reduceHumanAvatarRemoved, - }, - - { - Event: user.HumanPasswordChangedType, - Reduce: p.reduceHumanPasswordChanged, - }, - { - Event: user.UserV1PasswordChangedType, - Reduce: p.reduceHumanPasswordChanged, - }, - { - Event: user.HumanPasswordCodeAddedType, - Reduce: p.reduceHumanPasswordCodeAdded, - }, - { - Event: user.UserV1PasswordCodeAddedType, - Reduce: p.reduceHumanPasswordCodeAdded, - }, - { - Event: user.HumanPasswordCheckSucceededType, - Reduce: p.reduceHumanPasswordCheckSucceeded, - }, - { - Event: user.UserV1PasswordCheckSucceededType, - Reduce: p.reduceHumanPasswordCheckSucceeded, - }, - { - Event: user.HumanPasswordCheckFailedType, - Reduce: p.reduceHumanPasswordCheckFailed, - }, - { - Event: user.UserV1PasswordCheckFailedType, - Reduce: p.reduceHumanPasswordCheckFailed, - }, - { - Event: user.HumanPasswordHashUpdatedType, - Reduce: p.reduceHumanPasswordHashUpdated, - }, - - { - Event: user.MachineAddedEventType, - Reduce: p.reduceMachineAdded, - }, - { - Event: user.MachineChangedEventType, - Reduce: p.reduceMachineChanged, - }, - - { - Event: user.MachineSecretSetType, - Reduce: p.reduceMachineSecretSet, - }, - { - Event: user.MachineSecretHashUpdatedType, - Reduce: p.reduceMachineSecretHashUpdated, - }, - { - Event: user.MachineSecretRemovedType, - Reduce: p.reduceMachineSecretRemoved, - }, - - { - Event: user.MachineKeyAddedEventType, - Reduce: p.reduceMachineKeyAdded, - }, - { - Event: user.MachineKeyRemovedEventType, - Reduce: p.reduceMachineKeyRemoved, - }, - { - Event: user.UserV1MFAInitSkippedType, - Reduce: p.reduceMFAInitSkipped, - }, - { - Event: user.HumanMFAInitSkippedType, - Reduce: p.reduceMFAInitSkipped, - }, - - { - Event: user.PersonalAccessTokenAddedType, - Reduce: p.reducePersonalAccessTokenAdded, - }, - { - Event: user.PersonalAccessTokenRemovedType, - Reduce: p.reducePersonalAccessTokenRemoved, - }, - - { - Event: user.MetadataSetType, - Reduce: p.reduceMetadataSet, - }, - { - Event: user.MetadataRemovedType, - Reduce: p.reduceMetadataRemoved, - }, - { - Event: user.MetadataRemovedAllType, - Reduce: p.reduceMetadataRemovedAll, - }, - { - Event: user.HumanPasswordlessTokenAddedType, - Reduce: p.reducePasskeyAdded, - }, - { - Event: user.HumanPasswordlessTokenVerifiedType, - Reduce: p.reducePasskeyVerified, - }, - { - Event: user.HumanPasswordlessTokenSignCountChangedType, - Reduce: p.reducePasskeySignCountSet, - }, - { - Event: user.HumanPasswordlessTokenRemovedType, - Reduce: p.reducePasskeyRemoved, - }, - - { - Event: user.HumanU2FTokenAddedType, - Reduce: p.reducePasskeyAdded, - }, - { - Event: user.HumanU2FTokenVerifiedType, - Reduce: p.reducePasskeyVerified, - }, - { - Event: user.HumanU2FTokenSignCountChangedType, - Reduce: p.reducePasskeySignCountSet, - }, - { - Event: user.HumanU2FTokenRemovedType, - Reduce: p.reducePasskeyRemoved, - }, - - { - Event: user.HumanPasswordlessInitCodeAddedType, - Reduce: p.reducePasskeyInitCodeAdded, - }, - { - Event: user.HumanPasswordlessInitCodeCheckFailedType, - Reduce: p.reducePasskeyInitCodeCheckFailed, - }, - { - Event: user.HumanPasswordlessInitCodeCheckSucceededType, - Reduce: p.reducePasskeyInitCodeCheckSucceeded, - }, - { - Event: user.HumanPasswordlessInitCodeRequestedType, - Reduce: p.reducePasskeyInitCodeRequested, - }, - { - Event: user.UserIDPLinkAddedType, - Reduce: p.reduceIDPLinkAdded, - }, - { - Event: user.UserIDPLinkCascadeRemovedType, - Reduce: p.reduceIDPLinkCascadeRemoved, - }, - { - Event: user.UserIDPLinkRemovedType, - Reduce: p.reduceIDPLinkRemoved, - }, - { - Event: user.UserIDPExternalIDMigratedType, - Reduce: p.reduceIDPLinkUserIDMigrated, - }, - { - Event: user.UserIDPExternalUsernameChangedType, - Reduce: p.reduceIDPLinkUsernameChanged, - }, - { - Event: user.HumanMFAOTPAddedType, - Reduce: p.reduceTOTPAdded, - }, - { - Event: user.UserV1MFAOTPAddedType, - Reduce: p.reduceTOTPAdded, - }, - { - Event: user.HumanMFAOTPVerifiedType, - Reduce: p.reduceTOTPVerified, - }, - { - Event: user.UserV1MFAOTPVerifiedType, - Reduce: p.reduceTOTPVerified, - }, - { - Event: user.HumanMFAOTPRemovedType, - Reduce: p.reduceTOTPRemoved, - }, - { - Event: user.UserV1MFAOTPRemovedType, - Reduce: p.reduceTOTPRemoved, - }, - { - Event: user.HumanMFAOTPCheckSucceededType, - Reduce: p.reduceTOTPCheckSucceeded, - }, - { - Event: user.UserV1MFAOTPCheckSucceededType, - Reduce: p.reduceTOTPCheckSucceeded, - }, - { - Event: user.HumanMFAOTPCheckFailedType, - Reduce: p.reduceTOTPCheckFailed, - }, - { - Event: user.UserV1MFAOTPCheckFailedType, - Reduce: p.reduceTOTPCheckFailed, - }, - { - Event: user.HumanOTPSMSAddedType, - Reduce: p.reduceOTPSMSEnabled, - }, - { - Event: user.HumanOTPSMSRemovedType, - Reduce: p.reduceOTPSMSDisabled, - }, - { - Event: user.HumanOTPSMSCheckSucceededType, - Reduce: p.reduceOTPSMSCheckSucceeded, - }, - { - Event: user.HumanOTPSMSCheckFailedType, - Reduce: p.reduceOTPSMSCheckFailed, - }, - { - Event: user.HumanOTPEmailAddedType, - Reduce: p.reduceOTPEmailEnabled, - }, - { - Event: user.HumanOTPEmailRemovedType, - Reduce: p.reduceOTPEmailDisabled, - }, - { - Event: user.HumanOTPEmailCheckSucceededType, - Reduce: p.reduceOTPEmailCheckSucceeded, - }, - { - Event: user.HumanOTPEmailCheckFailedType, - Reduce: p.reduceOTPEmailCheckFailed, - }, - { - Event: user.HumanInviteCodeAddedType, - Reduce: p.reduceInviteCodeAdded, - }, - { - Event: user.HumanInviteCheckSucceededType, - Reduce: p.reduceInviteCheckSucceeded, - }, - { - Event: user.HumanInviteCheckFailedType, - Reduce: p.reduceInviteCheckFailed, - }, - // recovery code reducers - { - Event: user.HumanRecoveryCodesAddedType, - Reduce: p.reduceRecoveryCodesAdded, - }, - { - Event: user.HumanRecoveryCodesRemovedType, - Reduce: p.reduceRecoveryCodesRemoved, - }, - { - Event: user.HumanRecoveryCodeCheckSucceededType, - Reduce: p.reduceRecoveryCodeCheckSucceeded, - }, - { - Event: user.HumanRecoveryCodeCheckFailedType, - Reduce: p.reduceRecoveryCodeCheckFailed, - }, - }, - }, - } -} - -func (u *userRelationalProjection) reduceHumanAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceHumanAdded(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanAddedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -483,8 +54,6 @@ func (u *userRelationalProjection) reduceHumanAdded(event eventstore.Event) (*ha State: domain.UserStateActive, CreatedAt: e.CreatedAt(), UpdatedAt: e.CreatedAt(), - // TODO check when to set username unique - // IsUsernameOrgUnique: , Human: &domain.HumanUser{ FirstName: e.FirstName, LastName: e.LastName, @@ -502,13 +71,13 @@ func (u *userRelationalProjection) reduceHumanAdded(event eventstore.Event) (*ha }), nil } -func (p *userRelationalProjection) reduceHumanRegistered(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceHumanRegistered(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanRegisteredEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -540,8 +109,6 @@ func (p *userRelationalProjection) reduceHumanRegistered(event eventstore.Event) State: domain.UserStateActive, CreatedAt: e.CreatedAt(), UpdatedAt: e.CreatedAt(), - // TODO check when to set username unique - // IsUsernameOrgUnique: , Human: &domain.HumanUser{ FirstName: e.FirstName, LastName: e.LastName, @@ -559,36 +126,53 @@ func (p *userRelationalProjection) reduceHumanRegistered(event eventstore.Event) }), nil } -func (p *userRelationalProjection) reduceUserLocked(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceUserLocked(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.UserLockedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) - } - repo := repository.UserRepository() - _, err := repo.Update( - ctx, - v3_sql.SQLTx(tx), - repo.PrimaryKeyCondition(e.Agg.InstanceID, e.Aggregate().ID), - repo.SetState(domain.UserStateLocked), - repo.SetUpdatedAt(e.CreatedAt()), - ) - return err - }), nil + return handler.NewMultiStatement(e, + handler.AddStatement(func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) + } + repo := repository.UserRepository() + _, err := repo.Update( + ctx, + v3_sql.SQLTx(tx), + repo.PrimaryKeyCondition(e.Agg.InstanceID, e.Aggregate().ID), + repo.SetState(domain.UserStateLocked), + repo.SetUpdatedAt(e.CreatedAt()), + ) + return err + }), + handler.AddStatement(func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInvalidArgumentf(nil, "HANDL-fcxV68", "reduce.wrong.db.pool %T", ex) + } + v3Tx := v3_sql.SQLTx(tx) + + sessionRepo := repository.SessionRepository() + condition := database.And( + sessionRepo.InstanceIDCondition(event.Aggregate().InstanceID), + sessionRepo.UserIDCondition(event.Aggregate().ID), + ) + _, err := sessionRepo.Delete(ctx, v3Tx, condition) + return err + }), + ), nil } -func (p *userRelationalProjection) reduceUserUnlocked(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceUserUnlocked(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.UserUnlockedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -605,36 +189,53 @@ func (p *userRelationalProjection) reduceUserUnlocked(event eventstore.Event) (* }), nil } -func (p *userRelationalProjection) reduceUserDeactivated(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceUserDeactivated(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.UserDeactivatedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) - } - repo := repository.UserRepository() - _, err := repo.Update( - ctx, - v3_sql.SQLTx(tx), - repo.PrimaryKeyCondition(e.Agg.InstanceID, e.Aggregate().ID), - repo.SetState(domain.UserStateInactive), - repo.SetUpdatedAt(e.CreatedAt()), - ) - return err - }), nil + return handler.NewMultiStatement(event, + handler.AddStatement(func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) + } + repo := repository.UserRepository() + _, err := repo.Update( + ctx, + v3_sql.SQLTx(tx), + repo.PrimaryKeyCondition(e.Agg.InstanceID, e.Aggregate().ID), + repo.SetState(domain.UserStateInactive), + repo.SetUpdatedAt(e.CreatedAt()), + ) + return err + }), + handler.AddStatement(func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInvalidArgumentf(nil, "HANDL-fcxV68", "reduce.wrong.db.pool %T", ex) + } + v3Tx := v3_sql.SQLTx(tx) + + sessionRepo := repository.SessionRepository() + condition := database.And( + sessionRepo.InstanceIDCondition(event.Aggregate().InstanceID), + sessionRepo.UserIDCondition(event.Aggregate().ID), + ) + _, err := sessionRepo.Delete(ctx, v3Tx, condition) + return err + }), + ), nil } -func (p *userRelationalProjection) reduceUserReactivated(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceUserReactivated(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.UserReactivatedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -651,13 +252,13 @@ func (p *userRelationalProjection) reduceUserReactivated(event eventstore.Event) }), nil } -func (p *userRelationalProjection) reduceUserRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceUserRemoved(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.UserRemovedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -672,13 +273,13 @@ func (p *userRelationalProjection) reduceUserRemoved(event eventstore.Event) (*h }), nil } -func (p *userRelationalProjection) reduceUsernameChanged(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceUsernameChanged(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.UsernameChangedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -695,13 +296,13 @@ func (p *userRelationalProjection) reduceUsernameChanged(event eventstore.Event) }), nil } -func (p *userRelationalProjection) reduceDomainClaimed(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceUserDomainClaimed(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.DomainClaimedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -718,7 +319,7 @@ func (p *userRelationalProjection) reduceDomainClaimed(event eventstore.Event) ( }), nil } -func (p *userRelationalProjection) reduceHumanProfileChanged(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceHumanProfileChanged(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanProfileChangedEvent](event) if err != nil { return nil, err @@ -752,7 +353,7 @@ func (p *userRelationalProjection) reduceHumanProfileChanged(event eventstore.Ev } changes = append(changes, repo.SetUpdatedAt(e.CreatedAt())) - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -766,13 +367,13 @@ func (p *userRelationalProjection) reduceHumanProfileChanged(event eventstore.Ev }), nil } -func (p *userRelationalProjection) reduceHumanPhoneChanged(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceHumanPhoneChanged(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanPhoneChangedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -790,13 +391,13 @@ func (p *userRelationalProjection) reduceHumanPhoneChanged(event eventstore.Even }), nil } -func (p *userRelationalProjection) reduceHumanPhoneRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceHumanPhoneRemoved(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanPhoneRemovedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -812,13 +413,13 @@ func (p *userRelationalProjection) reduceHumanPhoneRemoved(event eventstore.Even }), nil } -func (p *userRelationalProjection) reduceHumanPhoneVerified(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceHumanPhoneVerified(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanPhoneVerifiedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -836,7 +437,7 @@ func (p *userRelationalProjection) reduceHumanPhoneVerified(event eventstore.Eve }), nil } -func (p *userRelationalProjection) reduceHumanPhoneCodeAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceHumanPhoneCodeAdded(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanPhoneCodeAddedEvent](event) if err != nil { return nil, err @@ -847,7 +448,7 @@ func (p *userRelationalProjection) reduceHumanPhoneCodeAdded(event eventstore.Ev expiry = &e.Expiry } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -866,13 +467,13 @@ func (p *userRelationalProjection) reduceHumanPhoneCodeAdded(event eventstore.Ev }), nil } -func (p *userRelationalProjection) reduceHumanPhoneVerificationFailed(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceHumanPhoneVerificationFailed(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanPhoneVerificationFailedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -889,13 +490,13 @@ func (p *userRelationalProjection) reduceHumanPhoneVerificationFailed(event even }), nil } -func (p *userRelationalProjection) reduceHumanEmailChanged(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceHumanEmailChanged(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanEmailChangedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -914,13 +515,13 @@ func (p *userRelationalProjection) reduceHumanEmailChanged(event eventstore.Even }), nil } -func (p *userRelationalProjection) reduceHumanEmailVerified(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceHumanEmailVerified(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanEmailVerifiedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -937,13 +538,13 @@ func (p *userRelationalProjection) reduceHumanEmailVerified(event eventstore.Eve }), nil } -func (p *userRelationalProjection) reduceHumanEmailCodeAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceHumanEmailCodeAdded(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanEmailCodeAddedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -967,13 +568,13 @@ func (p *userRelationalProjection) reduceHumanEmailCodeAdded(event eventstore.Ev }), nil } -func (p *userRelationalProjection) reduceHumanEmailVerificationFailed(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceHumanEmailVerificationFailed(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanEmailVerificationFailedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -990,13 +591,13 @@ func (p *userRelationalProjection) reduceHumanEmailVerificationFailed(event even }), nil } -func (p *userRelationalProjection) reduceHumanAvatarAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceHumanAvatarAdded(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanAvatarAddedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1012,13 +613,13 @@ func (p *userRelationalProjection) reduceHumanAvatarAdded(event eventstore.Event }), nil } -func (p *userRelationalProjection) reduceHumanAvatarRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceHumanAvatarRemoved(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanAvatarRemovedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1034,35 +635,61 @@ func (p *userRelationalProjection) reduceHumanAvatarRemoved(event eventstore.Eve }), nil } -func (p *userRelationalProjection) reduceHumanPasswordChanged(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceHumanPasswordChanged(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanPasswordChangedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { - tx, ok := ex.(*sql.Tx) - if !ok { - return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) - } - repo := repository.HumanUserRepository() + return handler.NewMultiStatement(e, + handler.AddStatement(func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) + } + repo := repository.HumanUserRepository() - _, err := repo.Update(ctx, v3_sql.SQLTx(tx), - repo.PrimaryKeyCondition(e.Aggregate().InstanceID, e.Aggregate().ID), - repo.SetPasswordChangeRequired(e.ChangeRequired), - repo.SetPassword(crypto.SecretOrEncodedHash(e.Secret, e.EncodedHash)), - repo.SetResetPasswordVerification(&domain.VerificationTypeSucceeded{VerifiedAt: e.CreatedAt()}), - repo.SetUpdatedAt(e.CreatedAt()), - ) - return err - }), nil + _, err := repo.Update(ctx, v3_sql.SQLTx(tx), + repo.PrimaryKeyCondition(e.Aggregate().InstanceID, e.Aggregate().ID), + repo.SetPasswordChangeRequired(e.ChangeRequired), + repo.SetPassword(crypto.SecretOrEncodedHash(e.Secret, e.EncodedHash)), + repo.SetResetPasswordVerification(&domain.VerificationTypeSucceeded{VerifiedAt: e.CreatedAt()}), + repo.SetUpdatedAt(e.CreatedAt()), + ) + return err + }), + handler.AddStatement(func(ctx context.Context, ex handler.Executer, _ string) error { + tx, ok := ex.(*sql.Tx) + if !ok { + return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) + } + v3Tx := v3_sql.SQLTx(tx) + + sessionRepo := repository.SessionRepository() + condition := database.And( + sessionRepo.InstanceIDCondition(e.Aggregate().InstanceID), + sessionRepo.UserIDCondition(e.Aggregate().ID), + sessionRepo.ExistsFactor( + database.And( + sessionRepo.FactorConditions().FactorTypeCondition(domain.SessionFactorTypePassword), + sessionRepo.FactorConditions().LastVerifiedBeforeCondition(e.CreatedAt()), + ), + ), + ) + _, err = sessionRepo.Update(ctx, v3Tx, condition, + sessionRepo.SetUpdatedAt(e.CreatedAt()), + sessionRepo.ClearFactor(domain.SessionFactorTypePassword), + ) + return err + }), + ), nil } -func (p *userRelationalProjection) reduceHumanPasswordCodeAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceHumanPasswordCodeAdded(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanPasswordCodeAddedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1086,12 +713,12 @@ func (p *userRelationalProjection) reduceHumanPasswordCodeAdded(event eventstore }), nil } -func (p *userRelationalProjection) reduceHumanPasswordCheckSucceeded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceHumanPasswordCheckSucceeded(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanPasswordCheckSucceededEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1106,12 +733,12 @@ func (p *userRelationalProjection) reduceHumanPasswordCheckSucceeded(event event }), nil } -func (p *userRelationalProjection) reduceHumanPasswordCheckFailed(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceHumanPasswordCheckFailed(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanPasswordCheckFailedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1126,12 +753,12 @@ func (p *userRelationalProjection) reduceHumanPasswordCheckFailed(event eventsto }), nil } -func (p *userRelationalProjection) reduceHumanPasswordHashUpdated(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceHumanPasswordHashUpdated(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanPasswordHashUpdatedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1146,12 +773,12 @@ func (p *userRelationalProjection) reduceHumanPasswordHashUpdated(event eventsto }), nil } -func (p *userRelationalProjection) reduceMachineSecretSet(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceMachineSecretSet(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.MachineSecretSetEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1169,12 +796,12 @@ func (p *userRelationalProjection) reduceMachineSecretSet(event eventstore.Event }), nil } -func (p *userRelationalProjection) reduceMachineSecretHashUpdated(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceMachineSecretHashUpdated(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.MachineSecretHashUpdatedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1190,13 +817,13 @@ func (p *userRelationalProjection) reduceMachineSecretHashUpdated(event eventsto }), nil } -func (p *userRelationalProjection) reduceMachineSecretRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceMachineSecretRemoved(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.MachineSecretRemovedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1212,12 +839,12 @@ func (p *userRelationalProjection) reduceMachineSecretRemoved(event eventstore.E }), nil } -func (p *userRelationalProjection) reduceMachineKeyAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceMachineKeyAdded(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.MachineKeyAddedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1238,12 +865,12 @@ func (p *userRelationalProjection) reduceMachineKeyAdded(event eventstore.Event) }), nil } -func (p *userRelationalProjection) reduceMachineKeyRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceMachineKeyRemoved(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.MachineKeyRemovedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1258,13 +885,13 @@ func (p *userRelationalProjection) reduceMachineKeyRemoved(event eventstore.Even }), nil } -func (p *userRelationalProjection) reduceMachineAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceMachineAdded(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.MachineAddedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1276,11 +903,9 @@ func (p *userRelationalProjection) reduceMachineAdded(event eventstore.Event) (* InstanceID: e.Aggregate().InstanceID, OrganizationID: e.Aggregate().ResourceOwner, Username: e.UserName, - // TODO check when to set username unique - // IsUsernameOrgUnique: , - State: domain.UserStateActive, - CreatedAt: e.CreatedAt(), - UpdatedAt: e.CreatedAt(), + State: domain.UserStateActive, + CreatedAt: e.CreatedAt(), + UpdatedAt: e.CreatedAt(), Machine: &domain.MachineUser{ Name: e.Name, Description: e.Description, @@ -1291,7 +916,7 @@ func (p *userRelationalProjection) reduceMachineAdded(event eventstore.Event) (* }), nil } -func (p *userRelationalProjection) reduceMachineChanged(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceMachineChanged(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.MachineChangedEvent](event) if err != nil { return nil, err @@ -1310,7 +935,7 @@ func (p *userRelationalProjection) reduceMachineChanged(event eventstore.Event) } changes = append(changes, repo.SetUpdatedAt(e.CreatedAt())) - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1327,12 +952,12 @@ func (p *userRelationalProjection) reduceMachineChanged(event eventstore.Event) }), nil } -func (p *userRelationalProjection) reducePersonalAccessTokenAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reducePersonalAccessTokenAdded(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.PersonalAccessTokenAddedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1351,12 +976,12 @@ func (p *userRelationalProjection) reducePersonalAccessTokenAdded(event eventsto }), nil } -func (p *userRelationalProjection) reducePersonalAccessTokenRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reducePersonalAccessTokenRemoved(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.PersonalAccessTokenRemovedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1370,12 +995,12 @@ func (p *userRelationalProjection) reducePersonalAccessTokenRemoved(event events }), nil } -func (p *userRelationalProjection) reduceMetadataSet(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceUserMetadataSet(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.MetadataSetEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-xg4IJ", "reduce.wrong.db.pool %T", ex) @@ -1394,12 +1019,12 @@ func (p *userRelationalProjection) reduceMetadataSet(event eventstore.Event) (*h }), nil } -func (p *userRelationalProjection) reduceMetadataRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceUserMetadataRemoved(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.MetadataRemovedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-xg4IJ", "reduce.wrong.db.pool %T", ex) @@ -1413,12 +1038,12 @@ func (p *userRelationalProjection) reduceMetadataRemoved(event eventstore.Event) }), nil } -func (p *userRelationalProjection) reduceMetadataRemovedAll(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceUserMetadataRemovedAll(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.MetadataRemovedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-xg4IJ", "reduce.wrong.db.pool %T", ex) @@ -1432,7 +1057,7 @@ func (p *userRelationalProjection) reduceMetadataRemovedAll(event eventstore.Eve }), nil } -func (p *userRelationalProjection) reducePasskeyAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reducePasskeyAdded(event eventstore.Event) (*handler.Statement, error) { var ( e user.HumanWebAuthNAddedEvent typ domain.PasskeyType @@ -1447,7 +1072,7 @@ func (p *userRelationalProjection) reducePasskeyAdded(event eventstore.Event) (* default: return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-nd7f3", "reduce.wrong.event.type for passkey %s", event.Type()) } - return handler.NewStatement(&e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(&e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1471,7 +1096,7 @@ func (p *userRelationalProjection) reducePasskeyAdded(event eventstore.Event) (* }), nil } -func (p *userRelationalProjection) reducePasskeyVerified(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reducePasskeyVerified(event eventstore.Event) (*handler.Statement, error) { var ( e user.HumanWebAuthNVerifiedEvent ) @@ -1483,7 +1108,7 @@ func (p *userRelationalProjection) reducePasskeyVerified(event eventstore.Event) default: return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-nd7f3", "reduce.wrong.event.type for passkey %s", event.Type()) } - return handler.NewStatement(&e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(&e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1508,7 +1133,7 @@ func (p *userRelationalProjection) reducePasskeyVerified(event eventstore.Event) }), nil } -func (p *userRelationalProjection) reducePasskeySignCountSet(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reducePasskeySignCountSet(event eventstore.Event) (*handler.Statement, error) { var ( e user.HumanWebAuthNSignCountChangedEvent ) @@ -1520,7 +1145,7 @@ func (p *userRelationalProjection) reducePasskeySignCountSet(event eventstore.Ev default: return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-nd7f3", "reduce.wrong.event.type for passkey %s", event.Type()) } - return handler.NewStatement(&e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(&e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1538,7 +1163,7 @@ func (p *userRelationalProjection) reducePasskeySignCountSet(event eventstore.Ev }), nil } -func (p *userRelationalProjection) reducePasskeyRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reducePasskeyRemoved(event eventstore.Event) (*handler.Statement, error) { var ( e user.HumanWebAuthNRemovedEvent ) @@ -1550,7 +1175,7 @@ func (p *userRelationalProjection) reducePasskeyRemoved(event eventstore.Event) default: return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-nd7f3", "reduce.wrong.event.type for passkey %s", event.Type()) } - return handler.NewStatement(&e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(&e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1566,12 +1191,12 @@ func (p *userRelationalProjection) reducePasskeyRemoved(event eventstore.Event) }), nil } -func (p *userRelationalProjection) reducePasskeyInitCodeAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reducePasskeyInitCodeAdded(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanPasswordlessInitCodeAddedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1591,12 +1216,12 @@ func (p *userRelationalProjection) reducePasskeyInitCodeAdded(event eventstore.E }), nil } -func (p *userRelationalProjection) reducePasskeyInitCodeCheckFailed(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reducePasskeyInitCodeCheckFailed(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanPasswordlessInitCodeCheckFailedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1614,12 +1239,12 @@ func (p *userRelationalProjection) reducePasskeyInitCodeCheckFailed(event events }), nil } -func (p *userRelationalProjection) reducePasskeyInitCodeCheckSucceeded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reducePasskeyInitCodeCheckSucceeded(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanPasswordlessInitCodeCheckSucceededEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1637,12 +1262,12 @@ func (p *userRelationalProjection) reducePasskeyInitCodeCheckSucceeded(event eve }), nil } -func (p *userRelationalProjection) reducePasskeyInitCodeRequested(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reducePasskeyInitCodeRequested(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanPasswordlessInitCodeRequestedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1662,12 +1287,12 @@ func (p *userRelationalProjection) reducePasskeyInitCodeRequested(event eventsto }), nil } -func (p *userRelationalProjection) reduceMFAInitSkipped(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceMFAInitSkipped(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanMFAInitSkippedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1683,12 +1308,12 @@ func (p *userRelationalProjection) reduceMFAInitSkipped(event eventstore.Event) }), nil } -func (p *userRelationalProjection) reduceIDPLinkAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceIDPLinkAdded(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.UserIDPLinkAddedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1709,12 +1334,12 @@ func (p *userRelationalProjection) reduceIDPLinkAdded(event eventstore.Event) (* }), nil } -func (p *userRelationalProjection) reduceIDPLinkCascadeRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceIDPLinkCascadeRemoved(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.UserIDPLinkCascadeRemovedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1729,12 +1354,12 @@ func (p *userRelationalProjection) reduceIDPLinkCascadeRemoved(event eventstore. }), nil } -func (p *userRelationalProjection) reduceIDPLinkRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceIDPLinkRemoved(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.UserIDPLinkRemovedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1749,12 +1374,12 @@ func (p *userRelationalProjection) reduceIDPLinkRemoved(event eventstore.Event) }), nil } -func (p *userRelationalProjection) reduceIDPLinkUserIDMigrated(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceIDPLinkUserIDMigrated(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.UserIDPExternalIDMigratedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1772,12 +1397,12 @@ func (p *userRelationalProjection) reduceIDPLinkUserIDMigrated(event eventstore. }), nil } -func (p *userRelationalProjection) reduceIDPLinkUsernameChanged(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceIDPLinkUsernameChanged(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.UserIDPExternalUsernameEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1795,12 +1420,12 @@ func (p *userRelationalProjection) reduceIDPLinkUsernameChanged(event eventstore }), nil } -func (p *userRelationalProjection) reduceTOTPAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceTOTPAdded(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanOTPAddedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1815,12 +1440,12 @@ func (p *userRelationalProjection) reduceTOTPAdded(event eventstore.Event) (*han }), nil } -func (p *userRelationalProjection) reduceTOTPVerified(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceTOTPVerified(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanOTPVerifiedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1835,12 +1460,12 @@ func (p *userRelationalProjection) reduceTOTPVerified(event eventstore.Event) (* }), nil } -func (p *userRelationalProjection) reduceTOTPRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceTOTPRemoved(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanOTPRemovedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1855,12 +1480,12 @@ func (p *userRelationalProjection) reduceTOTPRemoved(event eventstore.Event) (*h }), nil } -func (p *userRelationalProjection) reduceTOTPCheckSucceeded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceTOTPCheckSucceeded(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanOTPCheckSucceededEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1875,12 +1500,12 @@ func (p *userRelationalProjection) reduceTOTPCheckSucceeded(event eventstore.Eve }), nil } -func (p *userRelationalProjection) reduceTOTPCheckFailed(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceTOTPCheckFailed(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanOTPCheckFailedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1895,12 +1520,12 @@ func (p *userRelationalProjection) reduceTOTPCheckFailed(event eventstore.Event) }), nil } -func (p *userRelationalProjection) reduceOTPSMSEnabled(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceOTPSMSEnabled(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanOTPSMSAddedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1916,12 +1541,12 @@ func (p *userRelationalProjection) reduceOTPSMSEnabled(event eventstore.Event) ( }), nil } -func (p *userRelationalProjection) reduceOTPSMSDisabled(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceOTPSMSDisabled(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanOTPSMSRemovedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1937,12 +1562,12 @@ func (p *userRelationalProjection) reduceOTPSMSDisabled(event eventstore.Event) }), nil } -func (p *userRelationalProjection) reduceOTPSMSCheckSucceeded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceOTPSMSCheckSucceeded(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanOTPSMSCheckSucceededEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1957,12 +1582,12 @@ func (p *userRelationalProjection) reduceOTPSMSCheckSucceeded(event eventstore.E }), nil } -func (p *userRelationalProjection) reduceOTPSMSCheckFailed(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceOTPSMSCheckFailed(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanOTPSMSCheckFailedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1977,12 +1602,12 @@ func (p *userRelationalProjection) reduceOTPSMSCheckFailed(event eventstore.Even }), nil } -func (p *userRelationalProjection) reduceOTPEmailEnabled(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceOTPEmailEnabled(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanOTPEmailAddedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -1997,12 +1622,12 @@ func (p *userRelationalProjection) reduceOTPEmailEnabled(event eventstore.Event) }), nil } -func (p *userRelationalProjection) reduceOTPEmailDisabled(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceOTPEmailDisabled(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanOTPEmailRemovedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -2017,12 +1642,12 @@ func (p *userRelationalProjection) reduceOTPEmailDisabled(event eventstore.Event }), nil } -func (p *userRelationalProjection) reduceOTPEmailCheckSucceeded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceOTPEmailCheckSucceeded(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanOTPEmailCheckSucceededEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -2037,12 +1662,12 @@ func (p *userRelationalProjection) reduceOTPEmailCheckSucceeded(event eventstore }), nil } -func (p *userRelationalProjection) reduceOTPEmailCheckFailed(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceOTPEmailCheckFailed(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanOTPEmailCheckFailedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -2057,12 +1682,12 @@ func (p *userRelationalProjection) reduceOTPEmailCheckFailed(event eventstore.Ev }), nil } -func (p *userRelationalProjection) reduceInviteCodeAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceInviteCodeAdded(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanInviteCodeAddedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -2087,12 +1712,12 @@ func (p *userRelationalProjection) reduceInviteCodeAdded(event eventstore.Event) }), nil } -func (p *userRelationalProjection) reduceInviteCheckSucceeded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceInviteCheckSucceeded(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanInviteCheckSucceededEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -2110,12 +1735,12 @@ func (p *userRelationalProjection) reduceInviteCheckSucceeded(event eventstore.E }), nil } -func (p *userRelationalProjection) reduceInviteCheckFailed(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceInviteCheckFailed(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanInviteCheckFailedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-iZGH3", "reduce.wrong.db.pool %T", ex) @@ -2133,12 +1758,12 @@ func (p *userRelationalProjection) reduceInviteCheckFailed(event eventstore.Even }), nil } -func (p *userRelationalProjection) reduceRecoveryCodesAdded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceRecoveryCodesAdded(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanRecoveryCodesAddedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-oqwfuV", "reduce.wrong.db.pool %T", ex) @@ -2153,12 +1778,12 @@ func (p *userRelationalProjection) reduceRecoveryCodesAdded(event eventstore.Eve }), nil } -func (p *userRelationalProjection) reduceRecoveryCodesRemoved(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceRecoveryCodesRemoved(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanRecoveryCodesRemovedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-ZueNKs", "reduce.wrong.db.pool %T", ex) @@ -2173,12 +1798,12 @@ func (p *userRelationalProjection) reduceRecoveryCodesRemoved(event eventstore.E }), nil } -func (p *userRelationalProjection) reduceRecoveryCodeCheckSucceeded(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceRecoveryCodeCheckSucceeded(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanRecoveryCodeCheckSucceededEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-wr8WuW", "reduce.wrong.db.pool %T", ex) @@ -2194,12 +1819,12 @@ func (p *userRelationalProjection) reduceRecoveryCodeCheckSucceeded(event events }), nil } -func (p *userRelationalProjection) reduceRecoveryCodeCheckFailed(event eventstore.Event) (*handler.Statement, error) { +func (p *relationalTablesProjection) reduceRecoveryCodeCheckFailed(event eventstore.Event) (*handler.Statement, error) { e, err := assertEvent[*user.HumanRecoveryCodeCheckFailedEvent](event) if err != nil { return nil, err } - return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, projectionName string) error { + return handler.NewStatement(e, func(ctx context.Context, ex handler.Executer, _ string) error { tx, ok := ex.(*sql.Tx) if !ok { return zerrors.ThrowInvalidArgumentf(nil, "HANDL-mWuV7a", "reduce.wrong.db.pool %T", ex) diff --git a/internal/query/projection/user_relational_test.go b/internal/query/projection/user_relational_test.go index a33d1fd8a..fe0c4b36c 100644 --- a/internal/query/projection/user_relational_test.go +++ b/internal/query/projection/user_relational_test.go @@ -17,7 +17,7 @@ import ( ) func TestUserRelationalProjection_Reducers(t *testing.T) { - handler := &userRelationalProjection{} + handler := &relationalTablesProjection{} rawTx, tx := getTransactions(t) t.Cleanup(func() { require.NoError(t, rawTx.Rollback())