diff --git a/Makefile b/Makefile index 81b4e223c..8e192a028 100644 --- a/Makefile +++ b/Makefile @@ -103,7 +103,7 @@ core_unit_test: core_integration_setup: go build -o zitadel main.go ./zitadel init --config internal/integration/config/zitadel.yaml --config internal/integration/config/${INTEGRATION_DB_FLAVOR}.yaml - ./zitadel setup --masterkeyFromEnv --config internal/integration/config/zitadel.yaml --config internal/integration/config/${INTEGRATION_DB_FLAVOR}.yaml --steps internal/integration/config/zitadel.yaml --steps internal/integration/config/${INTEGRATION_DB_FLAVOR}.yaml + ./zitadel setup --masterkeyFromEnv --init-projections --config internal/integration/config/zitadel.yaml --config internal/integration/config/${INTEGRATION_DB_FLAVOR}.yaml --steps internal/integration/config/zitadel.yaml --steps internal/integration/config/${INTEGRATION_DB_FLAVOR}.yaml $(RM) zitadel .PHONY: core_integration_test diff --git a/cmd/defaults.yaml b/cmd/defaults.yaml index 7caaee67c..432566205 100644 --- a/cmd/defaults.yaml +++ b/cmd/defaults.yaml @@ -1327,3 +1327,12 @@ InternalAuthZ: - "user.global.read" - "user.grant.read" - "user.membership.read" + +# If a new projection is introduced it will be prefilled during the setup process (if enabled) +# This can prevent serving outdated data after a version upgrade, but might require a longer setup / upgrade process: +# https://zitadel.com/docs/self-hosting/manage/updating_scaling +InitProjections: + Enabled: false # ZITADEL_INITPROJECTIONS_ENABLED + RetryFailedAfter: 100ms # ZITADEL_INITPROJECTIONS_RETRYFAILEDAFTER + MaxFailureCount: 2 # ZITADEL_INITPROJECTIONS_MAXFAILURECOUNT + BulkLimit: 1000 # ZITADEL_INITPROJECTIONS_BULKLIMIT \ No newline at end of file diff --git a/cmd/start/encryption_keys.go b/cmd/encryption/encryption_keys.go similarity index 77% rename from cmd/start/encryption_keys.go rename to cmd/encryption/encryption_keys.go index 42727b095..b4772e795 100644 --- a/cmd/start/encryption_keys.go +++ b/cmd/encryption/encryption_keys.go @@ -1,4 +1,4 @@ -package start +package encryption import ( "context" @@ -22,7 +22,20 @@ var ( } ) -type encryptionKeys struct { +type EncryptionKeyConfig struct { + DomainVerification *crypto.KeyConfig + IDPConfig *crypto.KeyConfig + OIDC *crypto.KeyConfig + SAML *crypto.KeyConfig + OTP *crypto.KeyConfig + SMS *crypto.KeyConfig + SMTP *crypto.KeyConfig + User *crypto.KeyConfig + CSRFCookieKeyID string + UserAgentCookieKeyID string +} + +type EncryptionKeys struct { DomainVerification crypto.EncryptionAlgorithm IDPConfig crypto.EncryptionAlgorithm OIDC crypto.EncryptionAlgorithm @@ -36,11 +49,11 @@ type encryptionKeys struct { OIDCKey []byte } -func ensureEncryptionKeys(ctx context.Context, keyConfig *encryptionKeyConfig, keyStorage crypto.KeyStorage) (keys *encryptionKeys, err error) { - if err := verifyDefaultKeys(ctx, keyStorage); err != nil { +func EnsureEncryptionKeys(ctx context.Context, keyConfig *EncryptionKeyConfig, keyStorage crypto.KeyStorage) (keys *EncryptionKeys, err error) { + if err := VerifyDefaultKeys(ctx, keyStorage); err != nil { return nil, err } - keys = new(encryptionKeys) + keys = new(EncryptionKeys) keys.DomainVerification, err = crypto.NewAESCrypto(keyConfig.DomainVerification, keyStorage) if err != nil { return nil, err @@ -91,7 +104,7 @@ func ensureEncryptionKeys(ctx context.Context, keyConfig *encryptionKeyConfig, k return keys, nil } -func verifyDefaultKeys(ctx context.Context, keyStorage crypto.KeyStorage) (err error) { +func VerifyDefaultKeys(ctx context.Context, keyStorage crypto.KeyStorage) (err error) { keys := make([]*crypto.Key, 0, len(defaultKeyIDs)) for _, keyID := range defaultKeyIDs { _, err := crypto.LoadKey(keyID, keyStorage) diff --git a/cmd/setup/01.go b/cmd/setup/01.go index a69c95e96..df682c9ea 100644 --- a/cmd/setup/01.go +++ b/cmd/setup/01.go @@ -4,6 +4,8 @@ import ( "context" "database/sql" _ "embed" + + "github.com/zitadel/zitadel/internal/eventstore" ) var ( @@ -19,7 +21,7 @@ type ProjectionTable struct { dbClient *sql.DB } -func (mig *ProjectionTable) Execute(ctx context.Context) error { +func (mig *ProjectionTable) Execute(ctx context.Context, _ eventstore.Event) error { stmt := createAdminViews + createAuthViews + createProjections _, err := mig.dbClient.ExecContext(ctx, stmt) return err diff --git a/cmd/setup/02.go b/cmd/setup/02.go index 42c5968bc..4d7e85171 100644 --- a/cmd/setup/02.go +++ b/cmd/setup/02.go @@ -3,6 +3,8 @@ package setup import ( "context" "database/sql" + + "github.com/zitadel/zitadel/internal/eventstore" ) const ( @@ -26,7 +28,7 @@ type AssetTable struct { dbClient *sql.DB } -func (mig *AssetTable) Execute(ctx context.Context) error { +func (mig *AssetTable) Execute(ctx context.Context, _ eventstore.Event) error { _, err := mig.dbClient.ExecContext(ctx, createAssets) return err } diff --git a/cmd/setup/03.go b/cmd/setup/03.go index 89978497e..af2ab9c49 100644 --- a/cmd/setup/03.go +++ b/cmd/setup/03.go @@ -41,30 +41,19 @@ type FirstInstance struct { domain string } -func (mig *FirstInstance) Execute(ctx context.Context) error { - keyStorage, err := crypto_db.NewKeyStorage(mig.db, mig.masterKey) +func (mig *FirstInstance) Execute(ctx context.Context, _ eventstore.Event) error { + keyStorage, err := mig.verifyEncryptionKeys(ctx) if err != nil { - return fmt.Errorf("cannot start key storage: %w", err) - } - if err = verifyKey(ctx, mig.userEncryptionKey, keyStorage); err != nil { return err } userAlg, err := crypto.NewAESCrypto(mig.userEncryptionKey, keyStorage) if err != nil { return err } - - if err = verifyKey(ctx, mig.smtpEncryptionKey, keyStorage); err != nil { - return err - } smtpEncryption, err := crypto.NewAESCrypto(mig.smtpEncryptionKey, keyStorage) if err != nil { return err } - - if err = verifyKey(ctx, mig.oidcEncryptionKey, keyStorage); err != nil { - return err - } oidcEncryption, err := crypto.NewAESCrypto(mig.oidcEncryptionKey, keyStorage) if err != nil { return err @@ -132,7 +121,27 @@ func (mig *FirstInstance) Execute(ctx context.Context) error { (mig.instanceSetup.Org.Machine.MachineKey != nil && key == nil)) { return err } + return mig.outputMachineAuthentication(key, token) +} +func (mig *FirstInstance) verifyEncryptionKeys(ctx context.Context) (*crypto_db.Database, error) { + keyStorage, err := crypto_db.NewKeyStorage(mig.db, mig.masterKey) + if err != nil { + return nil, fmt.Errorf("cannot start key storage: %w", err) + } + if err = verifyKey(ctx, mig.userEncryptionKey, keyStorage); err != nil { + return nil, err + } + if err = verifyKey(ctx, mig.smtpEncryptionKey, keyStorage); err != nil { + return nil, err + } + if err = verifyKey(ctx, mig.oidcEncryptionKey, keyStorage); err != nil { + return nil, err + } + return keyStorage, nil +} + +func (mig *FirstInstance) outputMachineAuthentication(key *command.MachineKey, token string) error { if key != nil { keyDetails, err := key.Detail() if err != nil { diff --git a/cmd/setup/05.go b/cmd/setup/05.go index 7813ce8bb..dc9cbdef5 100644 --- a/cmd/setup/05.go +++ b/cmd/setup/05.go @@ -4,6 +4,8 @@ import ( "context" "database/sql" _ "embed" + + "github.com/zitadel/zitadel/internal/eventstore" ) var ( @@ -15,7 +17,7 @@ type LastFailed struct { dbClient *sql.DB } -func (mig *LastFailed) Execute(ctx context.Context) error { +func (mig *LastFailed) Execute(ctx context.Context, _ eventstore.Event) error { _, err := mig.dbClient.ExecContext(ctx, lastFailedStmts) return err } diff --git a/cmd/setup/06.go b/cmd/setup/06.go index 5a3374543..3927c6f35 100644 --- a/cmd/setup/06.go +++ b/cmd/setup/06.go @@ -4,6 +4,8 @@ import ( "context" "database/sql" _ "embed" + + "github.com/zitadel/zitadel/internal/eventstore" ) var ( @@ -17,7 +19,7 @@ type OwnerRemoveColumns struct { dbClient *sql.DB } -func (mig *OwnerRemoveColumns) Execute(ctx context.Context) error { +func (mig *OwnerRemoveColumns) Execute(ctx context.Context, _ eventstore.Event) error { stmt := createAdminViews06 + createAuthViews06 _, err := mig.dbClient.ExecContext(ctx, stmt) return err diff --git a/cmd/setup/07.go b/cmd/setup/07.go index f168f6d16..73b9d3480 100644 --- a/cmd/setup/07.go +++ b/cmd/setup/07.go @@ -5,6 +5,8 @@ import ( "database/sql" "embed" "strings" + + "github.com/zitadel/zitadel/internal/eventstore" ) var ( @@ -24,7 +26,7 @@ type LogstoreTables struct { dbType string } -func (mig *LogstoreTables) Execute(ctx context.Context) error { +func (mig *LogstoreTables) Execute(ctx context.Context, _ eventstore.Event) error { accessStmt, err := readStmt(createAccessLogsTable07, "07", mig.dbType, "access.sql") if err != nil { return err diff --git a/cmd/setup/08.go b/cmd/setup/08.go index ff7dcea0f..bec6a65eb 100644 --- a/cmd/setup/08.go +++ b/cmd/setup/08.go @@ -5,6 +5,7 @@ import ( "embed" "github.com/zitadel/zitadel/internal/database" + "github.com/zitadel/zitadel/internal/eventstore" ) var ( @@ -17,7 +18,7 @@ type AuthTokenIndexes struct { dbClient *database.DB } -func (mig *AuthTokenIndexes) Execute(ctx context.Context) error { +func (mig *AuthTokenIndexes) Execute(ctx context.Context, _ eventstore.Event) error { stmt, err := readStmt(tokenIndexes08, "08", mig.dbClient.Type(), "08.sql") if err != nil { return err diff --git a/cmd/setup/10.go b/cmd/setup/10.go index 9f3d89cbd..93c017305 100644 --- a/cmd/setup/10.go +++ b/cmd/setup/10.go @@ -10,6 +10,7 @@ import ( "github.com/zitadel/logging" "github.com/zitadel/zitadel/internal/database" + "github.com/zitadel/zitadel/internal/eventstore" ) var ( @@ -31,7 +32,7 @@ type CorrectCreationDate struct { FailAfter time.Duration } -func (mig *CorrectCreationDate) Execute(ctx context.Context) (err error) { +func (mig *CorrectCreationDate) Execute(ctx context.Context, _ eventstore.Event) (err error) { ctx, cancel := context.WithTimeout(ctx, mig.FailAfter) defer cancel() diff --git a/cmd/setup/12.go b/cmd/setup/12.go index ce0e23aa0..4613d65c9 100644 --- a/cmd/setup/12.go +++ b/cmd/setup/12.go @@ -5,6 +5,7 @@ import ( _ "embed" "github.com/zitadel/zitadel/internal/database" + "github.com/zitadel/zitadel/internal/eventstore" ) var ( @@ -16,7 +17,7 @@ type AddOTPColumns struct { dbClient *database.DB } -func (mig *AddOTPColumns) Execute(ctx context.Context) error { +func (mig *AddOTPColumns) Execute(ctx context.Context, _ eventstore.Event) error { _, err := mig.dbClient.ExecContext(ctx, addOTPColumns) return err } diff --git a/cmd/setup/13.go b/cmd/setup/13.go index 3b5df925b..f2ca0a390 100644 --- a/cmd/setup/13.go +++ b/cmd/setup/13.go @@ -5,6 +5,7 @@ import ( _ "embed" "github.com/zitadel/zitadel/internal/database" + "github.com/zitadel/zitadel/internal/eventstore" ) var ( @@ -16,7 +17,7 @@ type FixQuotaConstraints struct { dbClient *database.DB } -func (mig *FixQuotaConstraints) Execute(ctx context.Context) error { +func (mig *FixQuotaConstraints) Execute(ctx context.Context, _ eventstore.Event) error { _, err := mig.dbClient.ExecContext(ctx, fixQuotaConstraints) return err } diff --git a/cmd/setup/14.go b/cmd/setup/14.go index 2647d83ee..786705443 100644 --- a/cmd/setup/14.go +++ b/cmd/setup/14.go @@ -11,6 +11,7 @@ import ( "github.com/zitadel/logging" "github.com/zitadel/zitadel/internal/database" + "github.com/zitadel/zitadel/internal/eventstore" ) var ( @@ -23,7 +24,7 @@ type NewEventsTable struct { dbClient *database.DB } -func (mig *NewEventsTable) Execute(ctx context.Context) error { +func (mig *NewEventsTable) Execute(ctx context.Context, _ eventstore.Event) error { migrations, err := newEventsTable.ReadDir("14/" + mig.dbClient.Type()) if err != nil { return err diff --git a/cmd/setup/15.go b/cmd/setup/15.go index 174821e0b..7267afbd1 100644 --- a/cmd/setup/15.go +++ b/cmd/setup/15.go @@ -7,6 +7,7 @@ import ( "github.com/zitadel/logging" "github.com/zitadel/zitadel/internal/database" + "github.com/zitadel/zitadel/internal/eventstore" ) var ( @@ -19,7 +20,7 @@ type CurrentProjectionState struct { dbClient *database.DB } -func (mig *CurrentProjectionState) Execute(ctx context.Context) error { +func (mig *CurrentProjectionState) Execute(ctx context.Context, _ eventstore.Event) error { migrations, err := currentProjectionState.ReadDir("15/" + mig.dbClient.Type()) if err != nil { return err diff --git a/cmd/setup/16.go b/cmd/setup/16.go index 6204dcd98..d6ad17091 100644 --- a/cmd/setup/16.go +++ b/cmd/setup/16.go @@ -7,6 +7,7 @@ import ( "github.com/zitadel/logging" "github.com/zitadel/zitadel/internal/database" + "github.com/zitadel/zitadel/internal/eventstore" ) var ( @@ -18,7 +19,7 @@ type UniqueConstraintToLower struct { dbClient *database.DB } -func (mig *UniqueConstraintToLower) Execute(ctx context.Context) error { +func (mig *UniqueConstraintToLower) Execute(ctx context.Context, _ eventstore.Event) error { res, err := mig.dbClient.ExecContext(ctx, uniqueConstraintLower) if err != nil { return err diff --git a/cmd/setup/17.go b/cmd/setup/17.go index 9612f3d27..956ffe0e0 100644 --- a/cmd/setup/17.go +++ b/cmd/setup/17.go @@ -5,6 +5,7 @@ import ( _ "embed" "github.com/zitadel/zitadel/internal/database" + "github.com/zitadel/zitadel/internal/eventstore" ) var ( @@ -16,7 +17,7 @@ type AddOffsetToCurrentStates struct { dbClient *database.DB } -func (mig *AddOffsetToCurrentStates) Execute(ctx context.Context) error { +func (mig *AddOffsetToCurrentStates) Execute(ctx context.Context, _ eventstore.Event) error { _, err := mig.dbClient.ExecContext(ctx, addOffsetField) return err } diff --git a/cmd/setup/18.go b/cmd/setup/18.go index 99837d81e..9fe3d10a8 100644 --- a/cmd/setup/18.go +++ b/cmd/setup/18.go @@ -5,6 +5,7 @@ import ( _ "embed" "github.com/zitadel/zitadel/internal/database" + "github.com/zitadel/zitadel/internal/eventstore" ) var ( @@ -16,7 +17,7 @@ type AddLowerFieldsToLoginNames struct { dbClient *database.DB } -func (mig *AddLowerFieldsToLoginNames) Execute(ctx context.Context) error { +func (mig *AddLowerFieldsToLoginNames) Execute(ctx context.Context, _ eventstore.Event) error { _, err := mig.dbClient.ExecContext(ctx, addLowerFieldsToLoginNames) return err } diff --git a/cmd/setup/19.go b/cmd/setup/19.go index 7919ef9ad..a1bad128b 100644 --- a/cmd/setup/19.go +++ b/cmd/setup/19.go @@ -5,6 +5,7 @@ import ( _ "embed" "github.com/zitadel/zitadel/internal/database" + "github.com/zitadel/zitadel/internal/eventstore" ) var ( @@ -16,7 +17,7 @@ type AddCurrentSequencesIndex struct { dbClient *database.DB } -func (mig *AddCurrentSequencesIndex) Execute(ctx context.Context) error { +func (mig *AddCurrentSequencesIndex) Execute(ctx context.Context, _ eventstore.Event) error { _, err := mig.dbClient.ExecContext(ctx, addCurrentSequencesIndex) return err } diff --git a/cmd/setup/20.go b/cmd/setup/20.go index f012140db..096f6bb3a 100644 --- a/cmd/setup/20.go +++ b/cmd/setup/20.go @@ -5,6 +5,7 @@ import ( _ "embed" "github.com/zitadel/zitadel/internal/database" + "github.com/zitadel/zitadel/internal/eventstore" ) var ( @@ -16,7 +17,7 @@ type AddByUserIndexToSession struct { dbClient *database.DB } -func (mig *AddByUserIndexToSession) Execute(ctx context.Context) error { +func (mig *AddByUserIndexToSession) Execute(ctx context.Context, _ eventstore.Event) error { _, err := mig.dbClient.ExecContext(ctx, addByUserIndexToSession) return err } diff --git a/cmd/setup/21.go b/cmd/setup/21.go index 3731cad61..13b4b2bf8 100644 --- a/cmd/setup/21.go +++ b/cmd/setup/21.go @@ -5,6 +5,7 @@ import ( _ "embed" "github.com/zitadel/zitadel/internal/database" + "github.com/zitadel/zitadel/internal/eventstore" ) var ( @@ -16,7 +17,7 @@ type AddBlockFieldToLimits struct { dbClient *database.DB } -func (mig *AddBlockFieldToLimits) Execute(ctx context.Context) error { +func (mig *AddBlockFieldToLimits) Execute(ctx context.Context, _ eventstore.Event) error { _, err := mig.dbClient.ExecContext(ctx, addBlockFieldToLimits) return err } diff --git a/cmd/setup/22.go b/cmd/setup/22.go new file mode 100644 index 000000000..ee5f52f7f --- /dev/null +++ b/cmd/setup/22.go @@ -0,0 +1,27 @@ +package setup + +import ( + "context" + _ "embed" + + "github.com/zitadel/zitadel/internal/database" + "github.com/zitadel/zitadel/internal/eventstore" +) + +var ( + //go:embed 22.sql + activeInstanceEvents string +) + +type ActiveInstanceEvents struct { + dbClient *database.DB +} + +func (mig *ActiveInstanceEvents) Execute(ctx context.Context, _ eventstore.Event) error { + _, err := mig.dbClient.ExecContext(ctx, activeInstanceEvents) + return err +} + +func (mig *ActiveInstanceEvents) String() string { + return "22_active_instance_events_index" +} diff --git a/cmd/setup/22.sql b/cmd/setup/22.sql new file mode 100644 index 000000000..e153fd2fd --- /dev/null +++ b/cmd/setup/22.sql @@ -0,0 +1 @@ +CREATE INDEX CONCURRENTLY IF NOT EXISTS active_instances_events ON eventstore.events2 (aggregate_type, event_type) WHERE aggregate_type = 'instance' AND event_type IN ('instance.added', 'instance.removed'); \ No newline at end of file diff --git a/cmd/setup/cleanup.go b/cmd/setup/cleanup.go index 267941a30..e9bc832d2 100644 --- a/cmd/setup/cleanup.go +++ b/cmd/setup/cleanup.go @@ -40,7 +40,6 @@ func Cleanup(config *Config) { config.Eventstore.Pusher = new_es.NewEventstore(esPusherDBClient) config.Eventstore.Querier = old_es.NewCRDB(queryDBClient) es := eventstore.NewEventstore(config.Eventstore) - migration.RegisterMappers(es) step, err := migration.LastStuckStep(ctx, es) logging.OnError(err).Fatal("unable to query latest migration") diff --git a/cmd/setup/config.go b/cmd/setup/config.go index 382c04b39..6e0bd080b 100644 --- a/cmd/setup/config.go +++ b/cmd/setup/config.go @@ -9,16 +9,22 @@ import ( "github.com/spf13/viper" "github.com/zitadel/logging" + "github.com/zitadel/zitadel/cmd/encryption" + "github.com/zitadel/zitadel/cmd/systemapi" + "github.com/zitadel/zitadel/internal/actions" "github.com/zitadel/zitadel/internal/api/authz" + "github.com/zitadel/zitadel/internal/api/oidc" + "github.com/zitadel/zitadel/internal/api/ui/login" "github.com/zitadel/zitadel/internal/command" "github.com/zitadel/zitadel/internal/config/hook" "github.com/zitadel/zitadel/internal/config/systemdefaults" - "github.com/zitadel/zitadel/internal/crypto" "github.com/zitadel/zitadel/internal/database" "github.com/zitadel/zitadel/internal/domain" "github.com/zitadel/zitadel/internal/eventstore" "github.com/zitadel/zitadel/internal/id" + "github.com/zitadel/zitadel/internal/notification/handlers" "github.com/zitadel/zitadel/internal/query/projection" + static_config "github.com/zitadel/zitadel/internal/static/config" ) type Config struct { @@ -29,11 +35,26 @@ type Config struct { ExternalPort uint16 ExternalSecure bool Log *logging.Config - EncryptionKeys *encryptionKeyConfig + EncryptionKeys *encryption.EncryptionKeyConfig DefaultInstance command.InstanceSetup Machine *id.Config Projections projection.Config Eventstore *eventstore.Config + + InitProjections InitProjections + AssetStorage static_config.AssetStorageConfig + OIDC oidc.Config + Login login.Config + WebAuthNName string + Telemetry *handlers.TelemetryPusherConfig + SystemAPIUsers systemapi.Users +} + +type InitProjections struct { + Enabled bool + RetryFailedAfter time.Duration + MaxFailureCount uint8 + BulkLimit uint64 } func MustNewConfig(v *viper.Viper) *Config { @@ -48,6 +69,7 @@ func MustNewConfig(v *viper.Viper) *Config { database.DecodeHook, hook.EnumHookFunc(domain.FeatureString), hook.EnumHookFunc(authz.MemberTypeString), + actions.HTTPConfigDecodeHook, )), ) logging.OnError(err).Fatal("unable to read default config") @@ -79,12 +101,7 @@ type Steps struct { s19AddCurrentStatesIndex *AddCurrentSequencesIndex s20AddByUserSessionIndex *AddByUserIndexToSession s21AddBlockFieldToLimits *AddBlockFieldToLimits -} - -type encryptionKeyConfig struct { - User *crypto.KeyConfig - SMTP *crypto.KeyConfig - OIDC *crypto.KeyConfig + s22ActiveInstancesIndex *ActiveInstanceEvents } func MustNewSteps(v *viper.Viper) *Steps { @@ -110,6 +127,7 @@ func MustNewSteps(v *viper.Viper) *Steps { mapstructure.StringToTimeHookFunc(time.RFC3339), mapstructure.StringToSliceHookFunc(","), hook.EnumHookFunc(domain.FeatureString), + systemapi.UsersDecodeHook, )), ) logging.OnError(err).Fatal("unable to read steps") diff --git a/cmd/setup/config_change.go b/cmd/setup/config_change.go index 3a1c0b604..a7d7c5a46 100644 --- a/cmd/setup/config_change.go +++ b/cmd/setup/config_change.go @@ -30,7 +30,7 @@ func (mig *externalConfigChange) Check(lastRun map[string]interface{}) bool { mig.currentExternalDomain != mig.ExternalDomain } -func (mig *externalConfigChange) Execute(ctx context.Context) error { +func (mig *externalConfigChange) Execute(ctx context.Context, _ eventstore.Event) error { cmd, err := command.StartCommands( mig.es, mig.defaults, diff --git a/cmd/setup/projections.go b/cmd/setup/projections.go index d8ffebb4a..5bf3cb13f 100644 --- a/cmd/setup/projections.go +++ b/cmd/setup/projections.go @@ -18,7 +18,7 @@ func (mig *projectionTables) Check(lastRun map[string]interface{}) bool { return currentVersion != mig.Version } -func (mig *projectionTables) Execute(ctx context.Context) error { +func (mig *projectionTables) Execute(ctx context.Context, _ eventstore.Event) error { return projection.Init(ctx) } diff --git a/cmd/setup/setup.go b/cmd/setup/setup.go index 3926e915c..b158441ed 100644 --- a/cmd/setup/setup.go +++ b/cmd/setup/setup.go @@ -4,22 +4,37 @@ import ( "context" "embed" _ "embed" + "net/http" "github.com/spf13/cobra" "github.com/spf13/viper" "github.com/zitadel/logging" "github.com/zitadel/zitadel/cmd/build" + "github.com/zitadel/zitadel/cmd/encryption" "github.com/zitadel/zitadel/cmd/key" "github.com/zitadel/zitadel/cmd/tls" + admin_handler "github.com/zitadel/zitadel/internal/admin/repository/eventsourcing/handler" + admin_view "github.com/zitadel/zitadel/internal/admin/repository/eventsourcing/view" + internal_authz "github.com/zitadel/zitadel/internal/api/authz" + auth_handler "github.com/zitadel/zitadel/internal/auth/repository/eventsourcing/handler" + auth_view "github.com/zitadel/zitadel/internal/auth/repository/eventsourcing/view" + "github.com/zitadel/zitadel/internal/authz" + authz_es "github.com/zitadel/zitadel/internal/authz/repository/eventsourcing/eventstore" + "github.com/zitadel/zitadel/internal/command" + cryptoDB "github.com/zitadel/zitadel/internal/crypto/database" "github.com/zitadel/zitadel/internal/database" "github.com/zitadel/zitadel/internal/database/dialect" + "github.com/zitadel/zitadel/internal/domain" "github.com/zitadel/zitadel/internal/eventstore" old_es "github.com/zitadel/zitadel/internal/eventstore/repository/sql" new_es "github.com/zitadel/zitadel/internal/eventstore/v3" "github.com/zitadel/zitadel/internal/i18n" "github.com/zitadel/zitadel/internal/migration" + notify_handler "github.com/zitadel/zitadel/internal/notification" + "github.com/zitadel/zitadel/internal/query" "github.com/zitadel/zitadel/internal/query/projection" + "github.com/zitadel/zitadel/internal/webauthn" ) var ( @@ -39,6 +54,9 @@ Requirements: err := tls.ModeFromFlag(cmd) logging.OnError(err).Fatal("invalid tlsMode") + err = BindInitProjections(cmd) + logging.OnError(err).Fatal("unable to bind \"init-projections\" flag") + config := MustNewConfig(viper.GetViper()) steps := MustNewSteps(viper.New()) @@ -58,10 +76,15 @@ Requirements: func Flags(cmd *cobra.Command) { cmd.PersistentFlags().StringArrayVar(&stepFiles, "steps", nil, "paths to step files to overwrite default steps") + cmd.Flags().Bool("init-projections", viper.GetBool("InitProjections"), "beta feature: initializes projections after they are created, allows smooth start as projections are up to date") key.AddMasterKeyFlag(cmd) tls.AddTLSModeFlag(cmd) } +func BindInitProjections(cmd *cobra.Command) error { + return viper.BindPFlag("InitProjections.Enabled", cmd.Flags().Lookup("init-projections")) +} + func Setup(config *Config, steps *Steps, masterKey string) { ctx := context.Background() logging.Info("setup started") @@ -79,7 +102,6 @@ func Setup(config *Config, steps *Steps, masterKey string) { config.Eventstore.Pusher = new_es.NewEventstore(esPusherDBClient) eventstoreClient := eventstore.NewEventstore(config.Eventstore) logging.OnError(err).Fatal("unable to start eventstore") - migration.RegisterMappers(eventstoreClient) steps.s1ProjectionTable = &ProjectionTable{dbClient: queryDBClient.DB} steps.s2AssetsTable = &AssetTable{dbClient: queryDBClient.DB} @@ -112,6 +134,7 @@ func Setup(config *Config, steps *Steps, masterKey string) { steps.s19AddCurrentStatesIndex = &AddCurrentSequencesIndex{dbClient: queryDBClient} steps.s20AddByUserSessionIndex = &AddByUserIndexToSession{dbClient: queryDBClient} steps.s21AddBlockFieldToLimits = &AddBlockFieldToLimits{dbClient: queryDBClient} + steps.s22ActiveInstancesIndex = &ActiveInstanceEvents{dbClient: queryDBClient} err = projection.Create(ctx, projectionDBClient, eventstoreClient, config.Projections, nil, nil, nil) logging.OnError(err).Fatal("unable to start projections") @@ -160,6 +183,8 @@ func Setup(config *Config, steps *Steps, masterKey string) { logging.WithFields("name", steps.s19AddCurrentStatesIndex.String()).OnError(err).Fatal("migration failed") err = migration.Migrate(ctx, eventstoreClient, steps.s20AddByUserSessionIndex) logging.WithFields("name", steps.s20AddByUserSessionIndex.String()).OnError(err).Fatal("migration failed") + err = migration.Migrate(ctx, eventstoreClient, steps.s22ActiveInstancesIndex) + logging.WithFields("name", steps.s22ActiveInstancesIndex.String()).OnError(err).Fatal("migration failed") for _, repeatableStep := range repeatableSteps { err = migration.Migrate(ctx, eventstoreClient, repeatableStep) @@ -171,9 +196,176 @@ func Setup(config *Config, steps *Steps, masterKey string) { logging.WithFields("name", steps.s18AddLowerFieldsToLoginNames.String()).OnError(err).Fatal("migration failed") err = migration.Migrate(ctx, eventstoreClient, steps.s21AddBlockFieldToLimits) logging.WithFields("name", steps.s21AddBlockFieldToLimits.String()).OnError(err).Fatal("migration failed") + + // projection initialization must be done last, since the steps above might add required columns to the projections + if config.InitProjections.Enabled { + initProjections( + ctx, + eventstoreClient, + queryDBClient, + projectionDBClient, + masterKey, + config, + ) + } } func readStmt(fs embed.FS, folder, typ, filename string) (string, error) { stmt, err := fs.ReadFile(folder + "/" + typ + "/" + filename) return string(stmt), err } + +func initProjections( + ctx context.Context, + eventstoreClient *eventstore.Eventstore, + queryDBClient, + projectionDBClient *database.DB, + masterKey string, + config *Config, +) { + logging.Info("init-projections is currently in beta") + + keyStorage, err := cryptoDB.NewKeyStorage(queryDBClient, masterKey) + logging.OnError(err).Fatal("unable to start key storage") + + keys, err := encryption.EnsureEncryptionKeys(ctx, config.EncryptionKeys, keyStorage) + logging.OnError(err).Fatal("unable to ensure encryption keys") + + err = projection.Create( + ctx, + queryDBClient, + eventstoreClient, + projection.Config{ + RetryFailedAfter: config.InitProjections.RetryFailedAfter, + MaxFailureCount: config.InitProjections.MaxFailureCount, + BulkLimit: config.InitProjections.BulkLimit, + }, + keys.OIDC, + keys.SAML, + config.SystemAPIUsers, + ) + logging.OnError(err).Fatal("unable to start projections") + for _, p := range projection.Projections() { + err := migration.Migrate(ctx, eventstoreClient, p) + logging.WithFields("name", p.String()).OnError(err).Fatal("migration failed") + } + + staticStorage, err := config.AssetStorage.NewStorage(queryDBClient.DB) + logging.OnError(err).Fatal("unable to start asset storage") + + adminView, err := admin_view.StartView(queryDBClient) + logging.OnError(err).Fatal("unable to start admin view") + admin_handler.Register(ctx, + admin_handler.Config{ + Client: queryDBClient, + Eventstore: eventstoreClient, + BulkLimit: config.InitProjections.BulkLimit, + FailureCountUntilSkip: uint64(config.InitProjections.MaxFailureCount), + }, + adminView, + staticStorage, + ) + for _, p := range admin_handler.Projections() { + err := migration.Migrate(ctx, eventstoreClient, p) + logging.WithFields("name", p.String()).OnError(err).Fatal("migration failed") + } + + sessionTokenVerifier := internal_authz.SessionTokenVerifier(keys.OIDC) + queries, err := query.StartQueries( + ctx, + eventstoreClient, + queryDBClient, + projectionDBClient, + config.Projections, + config.SystemDefaults, + keys.IDPConfig, + keys.OTP, + keys.OIDC, + keys.SAML, + config.InternalAuthZ.RolePermissionMappings, + sessionTokenVerifier, + func(q *query.Queries) domain.PermissionCheck { + return func(ctx context.Context, permission, orgID, resourceID string) (err error) { + return internal_authz.CheckPermission(ctx, &authz_es.UserMembershipRepo{Queries: q}, config.InternalAuthZ.RolePermissionMappings, permission, orgID, resourceID) + } + }, + 0, // not needed for projections + nil, // not needed for projections + false, + ) + logging.OnError(err).Fatal("unable to start queries") + + authView, err := auth_view.StartView(queryDBClient, keys.OIDC, queries, eventstoreClient) + logging.OnError(err).Fatal("unable to start admin view") + auth_handler.Register(ctx, + auth_handler.Config{ + Client: queryDBClient, + Eventstore: eventstoreClient, + BulkLimit: config.InitProjections.BulkLimit, + FailureCountUntilSkip: uint64(config.InitProjections.MaxFailureCount), + }, + authView, + queries, + ) + for _, p := range auth_handler.Projections() { + err := migration.Migrate(ctx, eventstoreClient, p) + logging.WithFields("name", p.String()).OnError(err).Fatal("migration failed") + } + + authZRepo, err := authz.Start(queries, eventstoreClient, queryDBClient, keys.OIDC, config.ExternalSecure) + logging.OnError(err).Fatal("unable to start authz repo") + permissionCheck := func(ctx context.Context, permission, orgID, resourceID string) (err error) { + return internal_authz.CheckPermission(ctx, authZRepo, config.InternalAuthZ.RolePermissionMappings, permission, orgID, resourceID) + } + commands, err := command.StartCommands( + eventstoreClient, + config.SystemDefaults, + config.InternalAuthZ.RolePermissionMappings, + staticStorage, + &webauthn.Config{ + DisplayName: config.WebAuthNName, + ExternalSecure: config.ExternalSecure, + }, + config.ExternalDomain, + config.ExternalSecure, + config.ExternalPort, + keys.IDPConfig, + keys.OTP, + keys.SMTP, + keys.SMS, + keys.User, + keys.DomainVerification, + keys.OIDC, + keys.SAML, + &http.Client{}, + permissionCheck, + sessionTokenVerifier, + config.OIDC.DefaultAccessTokenLifetime, + config.OIDC.DefaultRefreshTokenExpiration, + config.OIDC.DefaultRefreshTokenIdleExpiration, + config.DefaultInstance.SecretGenerators, + ) + logging.OnError(err).Fatal("unable to start commands") + notify_handler.Register( + ctx, + config.Projections.Customizations["notifications"], + config.Projections.Customizations["notificationsquotas"], + config.Projections.Customizations["telemetry"], + *config.Telemetry, + config.ExternalDomain, + config.ExternalPort, + config.ExternalSecure, + commands, + queries, + eventstoreClient, + config.Login.DefaultOTPEmailURLV2, + config.SystemDefaults.Notifications.FileSystemPath, + keys.User, + keys.SMTP, + keys.SMS, + ) + for _, p := range notify_handler.Projections() { + err := migration.Migrate(ctx, eventstoreClient, p) + logging.WithFields("name", p.String()).OnError(err).Fatal("migration failed") + } +} diff --git a/cmd/start/config.go b/cmd/start/config.go index a682e09ef..709ecaf91 100644 --- a/cmd/start/config.go +++ b/cmd/start/config.go @@ -1,14 +1,14 @@ package start import ( - "encoding/json" - "reflect" "time" "github.com/mitchellh/mapstructure" "github.com/spf13/viper" "github.com/zitadel/logging" + "github.com/zitadel/zitadel/cmd/encryption" + "github.com/zitadel/zitadel/cmd/systemapi" "github.com/zitadel/zitadel/internal/actions" admin_es "github.com/zitadel/zitadel/internal/admin/repository/eventsourcing" internal_authz "github.com/zitadel/zitadel/internal/api/authz" @@ -22,7 +22,6 @@ import ( "github.com/zitadel/zitadel/internal/config/hook" "github.com/zitadel/zitadel/internal/config/network" "github.com/zitadel/zitadel/internal/config/systemdefaults" - "github.com/zitadel/zitadel/internal/crypto" "github.com/zitadel/zitadel/internal/database" "github.com/zitadel/zitadel/internal/domain" "github.com/zitadel/zitadel/internal/eventstore" @@ -59,10 +58,10 @@ type Config struct { AssetStorage static_config.AssetStorageConfig InternalAuthZ internal_authz.Config SystemDefaults systemdefaults.SystemDefaults - EncryptionKeys *encryptionKeyConfig + EncryptionKeys *encryption.EncryptionKeyConfig DefaultInstance command.InstanceSetup AuditLogRetention time.Duration - SystemAPIUsers SystemAPIUsers + SystemAPIUsers systemapi.Users CustomerPortal string Machine *id.Config Actions *actions.Config @@ -92,7 +91,7 @@ func MustNewConfig(v *viper.Viper) *Config { mapstructure.StringToSliceHookFunc(","), database.DecodeHook, actions.HTTPConfigDecodeHook, - systemAPIUsersDecodeHook, + systemapi.UsersDecodeHook, hook.EnumHookFunc(domain.FeatureString), hook.EnumHookFunc(internal_authz.MemberTypeString), )), @@ -113,35 +112,3 @@ func MustNewConfig(v *viper.Viper) *Config { return config } - -type encryptionKeyConfig struct { - DomainVerification *crypto.KeyConfig - IDPConfig *crypto.KeyConfig - OIDC *crypto.KeyConfig - SAML *crypto.KeyConfig - OTP *crypto.KeyConfig - SMS *crypto.KeyConfig - SMTP *crypto.KeyConfig - User *crypto.KeyConfig - CSRFCookieKeyID string - UserAgentCookieKeyID string -} - -type SystemAPIUsers map[string]*internal_authz.SystemAPIUser - -func systemAPIUsersDecodeHook(from, to reflect.Value) (any, error) { - if to.Type() != reflect.TypeOf(SystemAPIUsers{}) { - return from.Interface(), nil - } - - data, ok := from.Interface().(string) - if !ok { - return from.Interface(), nil - } - users := make(SystemAPIUsers) - err := json.Unmarshal([]byte(data), &users) - if err != nil { - return nil, err - } - return users, nil -} diff --git a/cmd/start/start.go b/cmd/start/start.go index 96b1756f5..f7dcdc7c2 100644 --- a/cmd/start/start.go +++ b/cmd/start/start.go @@ -25,6 +25,7 @@ import ( "golang.org/x/net/http2/h2c" "github.com/zitadel/zitadel/cmd/build" + "github.com/zitadel/zitadel/cmd/encryption" "github.com/zitadel/zitadel/cmd/key" cmd_tls "github.com/zitadel/zitadel/cmd/tls" "github.com/zitadel/zitadel/feature" @@ -108,7 +109,7 @@ type Server struct { Config *Config DB *database.DB KeyStorage crypto.KeyStorage - Keys *encryptionKeys + Keys *encryption.EncryptionKeys Eventstore *eventstore.Eventstore Queries *query.Queries AuthzRepo authz_repo.Repository @@ -141,7 +142,7 @@ func startZitadel(ctx context.Context, config *Config, masterKey string, server if err != nil { return fmt.Errorf("cannot start key storage: %w", err) } - keys, err := ensureEncryptionKeys(ctx, config.EncryptionKeys, keyStorage) + keys, err := encryption.EnsureEncryptionKeys(ctx, config.EncryptionKeys, keyStorage) if err != nil { return err } @@ -172,6 +173,7 @@ func startZitadel(ctx context.Context, config *Config, masterKey string, server }, config.AuditLogRetention, config.SystemAPIUsers, + true, ) if err != nil { return fmt.Errorf("cannot start queries: %w", err) @@ -236,7 +238,7 @@ func startZitadel(ctx context.Context, config *Config, masterKey string, server actionsLogstoreSvc := logstore.New(queries, actionsExecutionDBEmitter, actionsExecutionStdoutEmitter) actions.SetLogstoreService(actionsLogstoreSvc) - notification.Start( + notification.Register( ctx, config.Projections.Customizations["notifications"], config.Projections.Customizations["notificationsquotas"], @@ -254,6 +256,7 @@ func startZitadel(ctx context.Context, config *Config, masterKey string, server keys.SMTP, keys.SMS, ) + notification.Start(ctx) router := mux.NewRouter() tlsConfig, err := config.TLS.Config() @@ -313,7 +316,7 @@ func startAPIs( config *Config, store static.Storage, authZRepo authz_repo.Repository, - keys *encryptionKeys, + keys *encryption.EncryptionKeys, permissionCheck domain.PermissionCheck, ) error { repo := struct { diff --git a/cmd/start/start_from_init.go b/cmd/start/start_from_init.go index d07ff89cf..78c0be719 100644 --- a/cmd/start/start_from_init.go +++ b/cmd/start/start_from_init.go @@ -31,6 +31,9 @@ Requirements: initialise.InitAll(cmd.Context(), initialise.MustNewConfig(viper.GetViper())) + err = setup.BindInitProjections(cmd) + logging.OnError(err).Fatal("unable to bind \"init-projections\" flag") + setupConfig := setup.MustNewConfig(viper.GetViper()) setupSteps := setup.MustNewSteps(viper.New()) setup.Setup(setupConfig, setupSteps, masterKey) diff --git a/cmd/start/start_from_setup.go b/cmd/start/start_from_setup.go index ea1bd42a0..ec26f4741 100644 --- a/cmd/start/start_from_setup.go +++ b/cmd/start/start_from_setup.go @@ -29,6 +29,9 @@ Requirements: masterKey, err := key.MasterKey(cmd) logging.OnError(err).Panic("No master key provided") + err = setup.BindInitProjections(cmd) + logging.OnError(err).Fatal("unable to bind \"init-projections\" flag") + setupConfig := setup.MustNewConfig(viper.GetViper()) setupSteps := setup.MustNewSteps(viper.New()) setup.Setup(setupConfig, setupSteps, masterKey) diff --git a/cmd/systemapi/user.go b/cmd/systemapi/user.go new file mode 100644 index 000000000..9393ceceb --- /dev/null +++ b/cmd/systemapi/user.go @@ -0,0 +1,27 @@ +package systemapi + +import ( + "encoding/json" + "reflect" + + "github.com/zitadel/zitadel/internal/api/authz" +) + +type Users map[string]*authz.SystemAPIUser + +func UsersDecodeHook(from, to reflect.Value) (any, error) { + if to.Type() != reflect.TypeOf(Users{}) { + return from.Interface(), nil + } + + data, ok := from.Interface().(string) + if !ok { + return from.Interface(), nil + } + users := make(Users) + err := json.Unmarshal([]byte(data), &users) + if err != nil { + return nil, err + } + return users, nil +} diff --git a/docs/docs/self-hosting/manage/reverseproxy/docker-compose.yaml b/docs/docs/self-hosting/manage/reverseproxy/docker-compose.yaml index 885713731..d391328a5 100644 --- a/docs/docs/self-hosting/manage/reverseproxy/docker-compose.yaml +++ b/docs/docs/self-hosting/manage/reverseproxy/docker-compose.yaml @@ -5,7 +5,7 @@ services: zitadel-disabled-tls: extends: service: zitadel-init - command: 'start-from-setup --masterkey "MasterkeyNeedsToHave32Characters" --config /zitadel.yaml --steps /zitadel.yaml' + command: 'start-from-setup --init-projections --masterkey "MasterkeyNeedsToHave32Characters" --config /zitadel.yaml --steps /zitadel.yaml' environment: - ZITADEL_EXTERNALPORT=80 - ZITADEL_EXTERNALSECURE=false @@ -19,7 +19,7 @@ services: zitadel-external-tls: extends: service: zitadel-init - command: 'start-from-setup --masterkey "MasterkeyNeedsToHave32Characters" --config /zitadel.yaml --steps /zitadel.yaml' + command: 'start-from-setup --init-projections --masterkey "MasterkeyNeedsToHave32Characters" --config /zitadel.yaml --steps /zitadel.yaml' environment: - ZITADEL_EXTERNALPORT=443 - ZITADEL_EXTERNALSECURE=true @@ -33,7 +33,7 @@ services: zitadel-enabled-tls: extends: service: zitadel-init - command: 'start-from-setup --masterkey "MasterkeyNeedsToHave32Characters" --config /zitadel.yaml --steps /zitadel.yaml' + command: 'start-from-setup --init-projections --masterkey "MasterkeyNeedsToHave32Characters" --config /zitadel.yaml --steps /zitadel.yaml' environment: - ZITADEL_EXTERNALPORT=443 - ZITADEL_EXTERNALSECURE=true diff --git a/docs/docs/self-hosting/manage/updating_scaling.md b/docs/docs/self-hosting/manage/updating_scaling.md index 7addca0b0..a716c63a0 100644 --- a/docs/docs/self-hosting/manage/updating_scaling.md +++ b/docs/docs/self-hosting/manage/updating_scaling.md @@ -65,7 +65,7 @@ The init phase is idempotent if executed with the same binary version. ### The Setup Phase -During `zitadel setup`, ZITADEL creates projection tables and migrates existing data. +During `zitadel setup`, ZITADEL creates projection tables and migrates existing data, if `--init-projections` is set. Depending on the ZITADEL version and the runtime resources, this step can take several minutes. When deploying a new ZITADEL version, @@ -85,5 +85,4 @@ Beware, in the background, out-of-date projections [recompute their state by replaying all missed events](/docs/concepts/eventstore/implementation#projections). If a new ZITADEL version is deployed, this can take quite a long time, depending on the amount of events to catch up. -You probably should consider manually migrating these projections first. -Refer to the [release notes for v2.14.0](https://github.com/zitadel/zitadel/releases/tag/v2.14.0) as an example. +You probably should consider providing `--init-projections`-flag to the [Setup Phase](#the-setup-phase) to shift the synchronization time to previous steps and delay the startup phase until events are caught up. \ No newline at end of file diff --git a/docs/docs/support/advisory/a10008.md b/docs/docs/support/advisory/a10008.md new file mode 100644 index 000000000..3bf36b772 --- /dev/null +++ b/docs/docs/support/advisory/a10008.md @@ -0,0 +1,40 @@ +--- +title: Technical Advisory 10008 +--- + +## Date and Version + +Version: 2.44.0 + +Date: 2024-01-25 + +## Description + +Version 2.44.0 introduces a new flag `--init-projections` to `zitadel setup` commands (`setup`, `start-from-setup`, `start-from-init`) + +This flag enables prefilling of newly added or changed projections (database tables) during setup phase instead of start phase which are used to query data, for example users. + +This new feature adds the following fields to the `setup` configuration, previously only used in `start`-command: + +- `AssetStore`: Storage for assets like user avatar, organization logo, icon, font, etc. +- `OIDC` +- `Login` +- `WebAuthNName` +- `Telemetry` +- `SystemAPIUsers` + +If you use different configurations on `setup` and `start` and have overwritten previously mentioned configurations please make sure to also add them to the configuration provided to ZITADEL `setup` command. + +## Statement + +Filling of projections can get time consuming as your system grows and this can cause downtime of self hosted installations of ZITADEL because queries first need to ensure data consistency. + +Before this release, this step was executed after the start of ZITADEL and therefore lead to inconsistent retrieval of data until the projections were up-to-date. + +## Mitigation + +Enable the `--init-projections`-flag in setup phase and make sure the previous deployment of ZITADEL remains active until the new revision started properly. + +## Impact + +Decreases downtime of starting new revisions with new or changed projections dramatically. diff --git a/docs/docs/support/technical_advisory.mdx b/docs/docs/support/technical_advisory.mdx index 94e8b3905..e90508c98 100644 --- a/docs/docs/support/technical_advisory.mdx +++ b/docs/docs/support/technical_advisory.mdx @@ -132,7 +132,7 @@ We understand that these advisories may include breaking changes, and we aim to - A-10006 + A-10007 Additional grant to cockroach database user Breaking Behaviour Change @@ -142,6 +142,18 @@ We understand that these advisories may include breaking changes, and we aim to Upcoming Upcoming + + + A-10008 + + New flag to prefill projections during setup instead of after start + Feature description + + new flag `--init-projections` introduced to `zitadel setup` commands (`setup`, `start-from-setup`, `start-from-init`) + + 2.44.0 + 2024-01-25 + ## Subscribe to our Mailing List @@ -162,7 +174,7 @@ Therefore, it is important to be aware of breaking behavior changes and their po ### Expected downtime during upgrade -Expected downtime during upgrade means that ZITADEL might become unavailable during and upgrade. +Expected downtime during upgrade means that ZITADEL might become unavailable during an upgrade. ZITADEL is built for [zero downtime upgrades](/docs/concepts/architecture/solution#zero-downtime-updates) at upgrades can be executed without downtime by just updating to a more recent version. When deploying certain changes a zero downtime upgrade might not be possible, for example to guarantee data integrity. In such cases we will issue a technical advisory to make you aware of this unexpected behavior. diff --git a/internal/admin/repository/eventsourcing/handler/handler.go b/internal/admin/repository/eventsourcing/handler/handler.go index a1ca9cb43..e4791b70d 100644 --- a/internal/admin/repository/eventsourcing/handler/handler.go +++ b/internal/admin/repository/eventsourcing/handler/handler.go @@ -7,6 +7,7 @@ import ( "github.com/zitadel/zitadel/internal/admin/repository/eventsourcing/view" "github.com/zitadel/zitadel/internal/database" "github.com/zitadel/zitadel/internal/eventstore" + "github.com/zitadel/zitadel/internal/eventstore/handler/v2" handler2 "github.com/zitadel/zitadel/internal/eventstore/handler/v2" "github.com/zitadel/zitadel/internal/static" ) @@ -26,16 +27,28 @@ type ConfigOverwrites struct { MinimumCycleDuration time.Duration } +var projections []*handler.Handler + func Register(ctx context.Context, config Config, view *view.View, static static.Storage) { if static == nil { return } - newStyling(ctx, + projections = append(projections, newStyling(ctx, config.overwrite("Styling"), static, view, - ).Start(ctx) + )) +} + +func Start(ctx context.Context) { + for _, projection := range projections { + projection.Start(ctx) + } +} + +func Projections() []*handler2.Handler { + return projections } func (config Config) overwrite(viewModel string) handler2.Config { diff --git a/internal/admin/repository/eventsourcing/repository.go b/internal/admin/repository/eventsourcing/repository.go index fadab8864..f9ba285a8 100644 --- a/internal/admin/repository/eventsourcing/repository.go +++ b/internal/admin/repository/eventsourcing/repository.go @@ -20,6 +20,7 @@ func Start(ctx context.Context, conf Config, static static.Storage, dbClient *da } admin_handler.Register(ctx, conf.Spooler, view, static) + admin_handler.Start(ctx) return nil } diff --git a/internal/api/http/middleware/access_interceptor.go b/internal/api/http/middleware/access_interceptor.go index 21a07003f..f1dd0182f 100644 --- a/internal/api/http/middleware/access_interceptor.go +++ b/internal/api/http/middleware/access_interceptor.go @@ -93,10 +93,11 @@ func (a *AccessInterceptor) Limit(w http.ResponseWriter, r *http.Request, public remaining := a.logstoreSvc.Limit(ctx, instance.InstanceID()) if remaining != nil { if remaining != nil && *remaining > 0 { - a.SetExhaustedCookie(w, r) - return true + deleteCookie = true + return false } - deleteCookie = true + a.SetExhaustedCookie(w, r) + return true } return false } diff --git a/internal/auth/repository/eventsourcing/handler/handler.go b/internal/auth/repository/eventsourcing/handler/handler.go index e9a468785..03e367829 100644 --- a/internal/auth/repository/eventsourcing/handler/handler.go +++ b/internal/auth/repository/eventsourcing/handler/handler.go @@ -7,6 +7,7 @@ import ( "github.com/zitadel/zitadel/internal/auth/repository/eventsourcing/view" "github.com/zitadel/zitadel/internal/database" "github.com/zitadel/zitadel/internal/eventstore" + "github.com/zitadel/zitadel/internal/eventstore/handler/v2" handler2 "github.com/zitadel/zitadel/internal/eventstore/handler/v2" query2 "github.com/zitadel/zitadel/internal/query" ) @@ -26,28 +27,40 @@ type ConfigOverwrites struct { MinimumCycleDuration time.Duration } +var projections []*handler.Handler + func Register(ctx context.Context, configs Config, view *view.View, queries *query2.Queries) { - newUser(ctx, + projections = append(projections, newUser(ctx, configs.overwrite("User"), view, queries, - ).Start(ctx) + )) - newUserSession(ctx, + projections = append(projections, newUserSession(ctx, configs.overwrite("UserSession"), view, queries, - ).Start(ctx) + )) - newToken(ctx, + projections = append(projections, newToken(ctx, configs.overwrite("Token"), view, - ).Start(ctx) + )) - newRefreshToken(ctx, + projections = append(projections, newRefreshToken(ctx, configs.overwrite("RefreshToken"), view, - ).Start(ctx) + )) +} + +func Start(ctx context.Context) { + for _, projection := range projections { + projection.Start(ctx) + } +} + +func Projections() []*handler2.Handler { + return projections } func (config Config) overwrite(viewModel string) handler2.Config { diff --git a/internal/auth/repository/eventsourcing/repository.go b/internal/auth/repository/eventsourcing/repository.go index ff9f60bdd..84be71631 100644 --- a/internal/auth/repository/eventsourcing/repository.go +++ b/internal/auth/repository/eventsourcing/repository.go @@ -38,6 +38,7 @@ func Start(ctx context.Context, conf Config, systemDefaults sd.SystemDefaults, c } auth_handler.Register(ctx, conf.Spooler, view, queries) + auth_handler.Start(ctx) authReq := cache.Start(dbClient) diff --git a/internal/command/command.go b/internal/command/command.go index d43bd550d..ffc57bd16 100644 --- a/internal/command/command.go +++ b/internal/command/command.go @@ -22,23 +22,6 @@ import ( "github.com/zitadel/zitadel/internal/domain" "github.com/zitadel/zitadel/internal/eventstore" "github.com/zitadel/zitadel/internal/id" - "github.com/zitadel/zitadel/internal/repository/action" - "github.com/zitadel/zitadel/internal/repository/authrequest" - "github.com/zitadel/zitadel/internal/repository/deviceauth" - "github.com/zitadel/zitadel/internal/repository/feature" - "github.com/zitadel/zitadel/internal/repository/idpintent" - instance_repo "github.com/zitadel/zitadel/internal/repository/instance" - "github.com/zitadel/zitadel/internal/repository/keypair" - "github.com/zitadel/zitadel/internal/repository/limits" - "github.com/zitadel/zitadel/internal/repository/milestone" - "github.com/zitadel/zitadel/internal/repository/oidcsession" - "github.com/zitadel/zitadel/internal/repository/org" - proj_repo "github.com/zitadel/zitadel/internal/repository/project" - "github.com/zitadel/zitadel/internal/repository/quota" - "github.com/zitadel/zitadel/internal/repository/restrictions" - "github.com/zitadel/zitadel/internal/repository/session" - usr_repo "github.com/zitadel/zitadel/internal/repository/user" - usr_grant_repo "github.com/zitadel/zitadel/internal/repository/usergrant" "github.com/zitadel/zitadel/internal/static" "github.com/zitadel/zitadel/internal/telemetry/tracing" webauthn_helper "github.com/zitadel/zitadel/internal/webauthn" @@ -151,24 +134,6 @@ func StartCommands( samlCertificateAndKeyGenerator: samlCertificateAndKeyGenerator(defaults.KeyConfig.Size), } - instance_repo.RegisterEventMappers(repo.eventstore) - org.RegisterEventMappers(repo.eventstore) - usr_repo.RegisterEventMappers(repo.eventstore) - usr_grant_repo.RegisterEventMappers(repo.eventstore) - proj_repo.RegisterEventMappers(repo.eventstore) - keypair.RegisterEventMappers(repo.eventstore) - action.RegisterEventMappers(repo.eventstore) - quota.RegisterEventMappers(repo.eventstore) - limits.RegisterEventMappers(repo.eventstore) - restrictions.RegisterEventMappers(repo.eventstore) - session.RegisterEventMappers(repo.eventstore) - idpintent.RegisterEventMappers(repo.eventstore) - authrequest.RegisterEventMappers(repo.eventstore) - oidcsession.RegisterEventMappers(repo.eventstore) - milestone.RegisterEventMappers(repo.eventstore) - feature.RegisterEventMappers(repo.eventstore) - deviceauth.RegisterEventMappers(repo.eventstore) - repo.codeAlg = crypto.NewBCrypt(defaults.SecretGenerators.PasswordSaltCost) repo.userPasswordHasher, err = defaults.PasswordHasher.PasswordHasher() if err != nil { diff --git a/internal/command/main_test.go b/internal/command/main_test.go index 265059f4c..faed3c304 100644 --- a/internal/command/main_test.go +++ b/internal/command/main_test.go @@ -17,22 +17,6 @@ import ( "github.com/zitadel/zitadel/internal/eventstore" "github.com/zitadel/zitadel/internal/eventstore/repository" "github.com/zitadel/zitadel/internal/eventstore/repository/mock" - action_repo "github.com/zitadel/zitadel/internal/repository/action" - "github.com/zitadel/zitadel/internal/repository/authrequest" - "github.com/zitadel/zitadel/internal/repository/deviceauth" - "github.com/zitadel/zitadel/internal/repository/feature" - "github.com/zitadel/zitadel/internal/repository/idpintent" - iam_repo "github.com/zitadel/zitadel/internal/repository/instance" - key_repo "github.com/zitadel/zitadel/internal/repository/keypair" - "github.com/zitadel/zitadel/internal/repository/limits" - "github.com/zitadel/zitadel/internal/repository/oidcsession" - "github.com/zitadel/zitadel/internal/repository/org" - proj_repo "github.com/zitadel/zitadel/internal/repository/project" - quota_repo "github.com/zitadel/zitadel/internal/repository/quota" - "github.com/zitadel/zitadel/internal/repository/restrictions" - "github.com/zitadel/zitadel/internal/repository/session" - usr_repo "github.com/zitadel/zitadel/internal/repository/user" - "github.com/zitadel/zitadel/internal/repository/usergrant" "github.com/zitadel/zitadel/internal/zerrors" ) @@ -49,22 +33,6 @@ func eventstoreExpect(t *testing.T, expects ...expect) *eventstore.Eventstore { Pusher: m.MockPusher, }, ) - iam_repo.RegisterEventMappers(es) - org.RegisterEventMappers(es) - usr_repo.RegisterEventMappers(es) - proj_repo.RegisterEventMappers(es) - usergrant.RegisterEventMappers(es) - key_repo.RegisterEventMappers(es) - action_repo.RegisterEventMappers(es) - session.RegisterEventMappers(es) - idpintent.RegisterEventMappers(es) - authrequest.RegisterEventMappers(es) - oidcsession.RegisterEventMappers(es) - quota_repo.RegisterEventMappers(es) - limits.RegisterEventMappers(es) - restrictions.RegisterEventMappers(es) - feature.RegisterEventMappers(es) - deviceauth.RegisterEventMappers(es) return es } diff --git a/internal/crypto/database/database.go b/internal/crypto/database/database.go index 2d8666fd0..7b27d223a 100644 --- a/internal/crypto/database/database.go +++ b/internal/crypto/database/database.go @@ -11,7 +11,7 @@ import ( "github.com/zitadel/zitadel/internal/zerrors" ) -type database struct { +type Database struct { client *z_db.DB masterKey string encrypt func(key, masterKey string) (encryptedKey string, err error) @@ -24,11 +24,11 @@ const ( encryptionKeysKeyCol = "key" ) -func NewKeyStorage(client *z_db.DB, masterKey string) (*database, error) { +func NewKeyStorage(client *z_db.DB, masterKey string) (*Database, error) { if err := checkMasterKeyLength(masterKey); err != nil { return nil, err } - return &database{ + return &Database{ client: client, masterKey: masterKey, encrypt: crypto.EncryptAESString, @@ -36,7 +36,7 @@ func NewKeyStorage(client *z_db.DB, masterKey string) (*database, error) { }, nil } -func (d *database) ReadKeys() (crypto.Keys, error) { +func (d *Database) ReadKeys() (crypto.Keys, error) { keys := make(map[string]string) stmt, args, err := sq.Select(encryptionKeysIDCol, encryptionKeysKeyCol). From(EncryptionKeysTable). @@ -67,7 +67,7 @@ func (d *database) ReadKeys() (crypto.Keys, error) { return keys, nil } -func (d *database) ReadKey(id string) (_ *crypto.Key, err error) { +func (d *Database) ReadKey(id string) (_ *crypto.Key, err error) { stmt, args, err := sq.Select(encryptionKeysKeyCol). From(EncryptionKeysTable). Where(sq.Eq{encryptionKeysIDCol: id}). @@ -99,7 +99,7 @@ func (d *database) ReadKey(id string) (_ *crypto.Key, err error) { }, nil } -func (d *database) CreateKeys(ctx context.Context, keys ...*crypto.Key) error { +func (d *Database) CreateKeys(ctx context.Context, keys ...*crypto.Key) error { insert := sq.Insert(EncryptionKeysTable). Columns(encryptionKeysIDCol, encryptionKeysKeyCol).PlaceholderFormat(sq.Dollar) for _, key := range keys { diff --git a/internal/crypto/database/database_test.go b/internal/crypto/database/database_test.go index 80d39e058..becbd48d0 100644 --- a/internal/crypto/database/database_test.go +++ b/internal/crypto/database/database_test.go @@ -115,7 +115,7 @@ func Test_database_ReadKeys(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - d := &database{ + d := &Database{ client: tt.fields.client.db, masterKey: tt.fields.masterKey, decrypt: tt.fields.decrypt, @@ -247,7 +247,7 @@ func Test_database_ReadKey(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - d := &database{ + d := &Database{ client: tt.fields.client.db, masterKey: tt.fields.masterKey, decrypt: tt.fields.decrypt, @@ -391,7 +391,7 @@ func Test_database_CreateKeys(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - d := &database{ + d := &Database{ client: tt.fields.client.db, masterKey: tt.fields.masterKey, encrypt: tt.fields.encrypt, diff --git a/internal/eventstore/eventstore.go b/internal/eventstore/eventstore.go index 0bf31afb4..7aeaa53ad 100644 --- a/internal/eventstore/eventstore.go +++ b/internal/eventstore/eventstore.go @@ -12,13 +12,7 @@ import ( // Eventstore abstracts all functions needed to store valid events // and filters the stored events type Eventstore struct { - // TODO: get rid of this mutex, - // or if we scale to >4vCPU use a sync.Map - interceptorMutex sync.RWMutex - eventInterceptors map[EventType]eventTypeInterceptors - eventTypes []string - aggregateTypes []string - PushTimeout time.Duration + PushTimeout time.Duration pusher Pusher querier Querier @@ -28,14 +22,36 @@ type Eventstore struct { instancesMu sync.Mutex } +var ( + eventInterceptors map[EventType]eventTypeInterceptors + eventTypes []string + aggregateTypes []string +) + +// RegisterFilterEventMapper registers a function for mapping an eventstore event to an event +func RegisterFilterEventMapper(aggregateType AggregateType, eventType EventType, mapper func(Event) (Event, error)) { + if mapper == nil || eventType == "" { + return + } + + appendEventType(eventType) + appendAggregateType(aggregateType) + + if eventInterceptors == nil { + eventInterceptors = make(map[EventType]eventTypeInterceptors) + } + interceptor := eventInterceptors[eventType] + interceptor.eventMapper = mapper + eventInterceptors[eventType] = interceptor +} + type eventTypeInterceptors struct { eventMapper func(Event) (Event, error) } func NewEventstore(config *Config) *Eventstore { return &Eventstore{ - eventInterceptors: map[EventType]eventTypeInterceptors{}, - PushTimeout: config.PushTimeout, + PushTimeout: config.PushTimeout, pusher: config.Pusher, querier: config.Querier, @@ -75,11 +91,11 @@ func (es *Eventstore) Push(ctx context.Context, cmds ...Command) ([]Event, error } func (es *Eventstore) EventTypes() []string { - return es.eventTypes + return eventTypes } func (es *Eventstore) AggregateTypes() []string { - return es.aggregateTypes + return aggregateTypes } // Filter filters the stored events based on the searchQuery @@ -105,28 +121,21 @@ func (es *Eventstore) Filter(ctx context.Context, searchQuery *SearchQueryBuilde func (es *Eventstore) mapEvents(events []Event) (mappedEvents []Event, err error) { mappedEvents = make([]Event, len(events)) - - es.interceptorMutex.RLock() - defer es.interceptorMutex.RUnlock() - for i, event := range events { mappedEvents[i], err = es.mapEventLocked(event) if err != nil { return nil, err } } - return mappedEvents, nil } func (es *Eventstore) mapEvent(event Event) (Event, error) { - es.interceptorMutex.RLock() - defer es.interceptorMutex.RUnlock() return es.mapEventLocked(event) } func (es *Eventstore) mapEventLocked(event Event) (Event, error) { - interceptors, ok := es.eventInterceptors[event.Type()] + interceptors, ok := eventInterceptors[event.Type()] if !ok || interceptors.eventMapper == nil { return BaseEventFromRepo(event), nil } @@ -204,24 +213,6 @@ func (es *Eventstore) FilterToQueryReducer(ctx context.Context, r QueryReducer) return es.FilterToReducer(ctx, r.Query(), r) } -// RegisterFilterEventMapper registers a function for mapping an eventstore event to an event -func (es *Eventstore) RegisterFilterEventMapper(aggregateType AggregateType, eventType EventType, mapper func(Event) (Event, error)) *Eventstore { - if mapper == nil || eventType == "" { - return es - } - es.interceptorMutex.Lock() - defer es.interceptorMutex.Unlock() - - es.appendEventType(eventType) - es.appendAggregateType(aggregateType) - - interceptor := es.eventInterceptors[eventType] - interceptor.eventMapper = mapper - es.eventInterceptors[eventType] = interceptor - - return es -} - type Reducer func(event Event) error type Querier interface { @@ -242,18 +233,18 @@ type Pusher interface { Push(ctx context.Context, commands ...Command) (_ []Event, err error) } -func (es *Eventstore) appendEventType(typ EventType) { - i := sort.SearchStrings(es.eventTypes, string(typ)) - if i < len(es.eventTypes) && es.eventTypes[i] == string(typ) { +func appendEventType(typ EventType) { + i := sort.SearchStrings(eventTypes, string(typ)) + if i < len(eventTypes) && eventTypes[i] == string(typ) { return } - es.eventTypes = append(es.eventTypes[:i], append([]string{string(typ)}, es.eventTypes[i:]...)...) + eventTypes = append(eventTypes[:i], append([]string{string(typ)}, eventTypes[i:]...)...) } -func (es *Eventstore) appendAggregateType(typ AggregateType) { - i := sort.SearchStrings(es.aggregateTypes, string(typ)) - if len(es.aggregateTypes) > i && es.aggregateTypes[i] == string(typ) { +func appendAggregateType(typ AggregateType) { + i := sort.SearchStrings(aggregateTypes, string(typ)) + if len(aggregateTypes) > i && aggregateTypes[i] == string(typ) { return } - es.aggregateTypes = append(es.aggregateTypes[:i], append([]string{string(typ)}, es.aggregateTypes[i:]...)...) + aggregateTypes = append(aggregateTypes[:i], append([]string{string(typ)}, aggregateTypes[i:]...)...) } diff --git a/internal/eventstore/eventstore_test.go b/internal/eventstore/eventstore_test.go index fe8400be2..bbbb383bb 100644 --- a/internal/eventstore/eventstore_test.go +++ b/internal/eventstore/eventstore_test.go @@ -139,12 +139,11 @@ func Test_eventstore_RegisterFilterEventMapper(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - es := &Eventstore{ - eventInterceptors: tt.fields.eventMapper, - } - es = es.RegisterFilterEventMapper("test", tt.args.eventType, tt.args.mapper) - if len(es.eventInterceptors) != tt.res.mapperCount { - t.Errorf("unexpected mapper count: want %d, got %d", tt.res.mapperCount, len(es.eventInterceptors)) + + eventInterceptors = tt.fields.eventMapper + RegisterFilterEventMapper("test", tt.args.eventType, tt.args.mapper) + if len(eventInterceptors) != tt.res.mapperCount { + t.Errorf("unexpected mapper count: want %d, got %d", tt.res.mapperCount, len(eventInterceptors)) return } @@ -152,7 +151,7 @@ func Test_eventstore_RegisterFilterEventMapper(t *testing.T) { return } - mapper := es.eventInterceptors[tt.args.eventType] + mapper := eventInterceptors[tt.args.eventType] event, err := mapper.eventMapper(nil) if err != nil { t.Errorf("unexpected error %v", err) @@ -694,15 +693,15 @@ func TestEventstore_Push(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + eventInterceptors = map[EventType]eventTypeInterceptors{} es := &Eventstore{ - pusher: tt.fields.pusher, - eventInterceptors: map[EventType]eventTypeInterceptors{}, + pusher: tt.fields.pusher, } for eventType, mapper := range tt.fields.eventMapper { - es = es.RegisterFilterEventMapper("test", eventType, mapper) + RegisterFilterEventMapper("test", eventType, mapper) } - if len(es.eventInterceptors) != len(tt.fields.eventMapper) { - t.Errorf("register event mapper failed expected mapper amount: %d, got: %d", len(tt.fields.eventMapper), len(es.eventInterceptors)) + if len(eventInterceptors) != len(tt.fields.eventMapper) { + t.Errorf("register event mapper failed expected mapper amount: %d, got: %d", len(tt.fields.eventMapper), len(eventInterceptors)) t.FailNow() } @@ -825,16 +824,16 @@ func TestEventstore_FilterEvents(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + eventInterceptors = map[EventType]eventTypeInterceptors{} es := &Eventstore{ - querier: tt.fields.repo, - eventInterceptors: map[EventType]eventTypeInterceptors{}, + querier: tt.fields.repo, } for eventType, mapper := range tt.fields.eventMapper { - es = es.RegisterFilterEventMapper("test", eventType, mapper) + RegisterFilterEventMapper("test", eventType, mapper) } - if len(es.eventInterceptors) != len(tt.fields.eventMapper) { - t.Errorf("register event mapper failed expected mapper amount: %d, got: %d", len(tt.fields.eventMapper), len(es.eventInterceptors)) + if len(eventInterceptors) != len(tt.fields.eventMapper) { + t.Errorf("register event mapper failed expected mapper amount: %d, got: %d", len(tt.fields.eventMapper), len(eventInterceptors)) t.FailNow() } @@ -1130,14 +1129,13 @@ func TestEventstore_FilterToReducer(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { es := &Eventstore{ - querier: tt.fields.repo, - eventInterceptors: map[EventType]eventTypeInterceptors{}, + querier: tt.fields.repo, } for eventType, mapper := range tt.fields.eventMapper { - es = es.RegisterFilterEventMapper("test", eventType, mapper) + RegisterFilterEventMapper("test", eventType, mapper) } - if len(es.eventInterceptors) != len(tt.fields.eventMapper) { - t.Errorf("register event mapper failed expected mapper amount: %d, got: %d", len(tt.fields.eventMapper), len(es.eventInterceptors)) + if len(eventInterceptors) != len(tt.fields.eventMapper) { + t.Errorf("register event mapper failed expected mapper amount: %d, got: %d", len(tt.fields.eventMapper), len(eventInterceptors)) t.FailNow() } @@ -1246,14 +1244,12 @@ func TestEventstore_mapEvents(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - es := &Eventstore{ - eventInterceptors: map[EventType]eventTypeInterceptors{}, - } + es := &Eventstore{} for eventType, mapper := range tt.fields.eventMapper { - es = es.RegisterFilterEventMapper("test", eventType, mapper) + RegisterFilterEventMapper("test", eventType, mapper) } - if len(es.eventInterceptors) != len(tt.fields.eventMapper) { - t.Errorf("register event mapper failed expected mapper amount: %d, got: %d", len(tt.fields.eventMapper), len(es.eventInterceptors)) + if len(eventInterceptors) != len(tt.fields.eventMapper) { + t.Errorf("register event mapper failed expected mapper amount: %d, got: %d", len(tt.fields.eventMapper), len(eventInterceptors)) t.FailNow() } diff --git a/internal/eventstore/example_test.go b/internal/eventstore/example_test.go index c1051f826..ee053d16d 100644 --- a/internal/eventstore/example_test.go +++ b/internal/eventstore/example_test.go @@ -294,10 +294,10 @@ func TestUserReadModel(t *testing.T) { }, ) - es.RegisterFilterEventMapper(UserAddedEventMapper()). - RegisterFilterEventMapper(UserFirstNameChangedMapper()). - RegisterFilterEventMapper(UserPasswordCheckedMapper()). - RegisterFilterEventMapper(UserDeletedMapper()) + eventstore.RegisterFilterEventMapper(UserAddedEventMapper()) + eventstore.RegisterFilterEventMapper(UserFirstNameChangedMapper()) + eventstore.RegisterFilterEventMapper(UserPasswordCheckedMapper()) + eventstore.RegisterFilterEventMapper(UserDeletedMapper()) events, err := es.Push(context.Background(), NewUserAddedEvent("1", "hodor"), diff --git a/internal/eventstore/handler/v2/event.go b/internal/eventstore/handler/v2/event.go deleted file mode 100644 index f4b722504..000000000 --- a/internal/eventstore/handler/v2/event.go +++ /dev/null @@ -1,52 +0,0 @@ -package handler - -import ( - "context" - - "github.com/zitadel/zitadel/internal/eventstore" -) - -const ( - schedulerSucceeded = eventstore.EventType("system.projections.scheduler.succeeded") - aggregateType = eventstore.AggregateType("system") - aggregateID = "SYSTEM" -) - -func (h *Handler) didProjectionInitialize(ctx context.Context) bool { - events, err := h.es.Filter(ctx, eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). - InstanceID(""). - AddQuery(). - AggregateTypes(aggregateType). - AggregateIDs(aggregateID). - EventTypes(schedulerSucceeded). - EventData(map[string]interface{}{ - "name": h.projection.Name(), - }). - Builder(), - ) - return len(events) > 0 && err == nil -} - -func (h *Handler) setSucceededOnce(ctx context.Context) error { - _, err := h.es.Push(ctx, &ProjectionSucceededEvent{ - BaseEvent: *eventstore.NewBaseEventForPush(ctx, - eventstore.NewAggregate(ctx, aggregateID, aggregateType, "v1"), - schedulerSucceeded, - ), - Name: h.projection.Name(), - }) - return err -} - -type ProjectionSucceededEvent struct { - eventstore.BaseEvent `json:"-"` - Name string `json:"name"` -} - -func (p *ProjectionSucceededEvent) Payload() interface{} { - return p -} - -func (p *ProjectionSucceededEvent) UniqueConstraints() []*eventstore.UniqueConstraint { - return nil -} diff --git a/internal/eventstore/handler/v2/handler.go b/internal/eventstore/handler/v2/handler.go index 36eb1ef13..37bb9718d 100644 --- a/internal/eventstore/handler/v2/handler.go +++ b/internal/eventstore/handler/v2/handler.go @@ -6,20 +6,26 @@ import ( "errors" "math" "math/rand" + "slices" "sync" "time" "github.com/jackc/pgconn" + "github.com/zitadel/logging" + "github.com/zitadel/zitadel/internal/api/authz" "github.com/zitadel/zitadel/internal/api/call" "github.com/zitadel/zitadel/internal/database" "github.com/zitadel/zitadel/internal/eventstore" + "github.com/zitadel/zitadel/internal/migration" + "github.com/zitadel/zitadel/internal/repository/instance" "github.com/zitadel/zitadel/internal/repository/pseudo" ) type EventStore interface { InstanceIDs(ctx context.Context, maxAge time.Duration, forceLoad bool, query *eventstore.SearchQueryBuilder) ([]string, error) + FilterToQueryReducer(ctx context.Context, reducer eventstore.QueryReducer) error Filter(ctx context.Context, queryFactory *eventstore.SearchQueryBuilder) ([]eventstore.Event, error) Push(ctx context.Context, cmds ...eventstore.Command) ([]eventstore.Event, error) } @@ -58,6 +64,70 @@ type Handler struct { triggerWithoutEvents Reduce } +var _ migration.Migration = (*Handler)(nil) + +// Execute implements migration.Migration. +func (h *Handler) Execute(ctx context.Context, startedEvent eventstore.Event) error { + start := time.Now() + logging.WithFields("projection", h.ProjectionName()).Info("projection starts prefilling") + logTicker := time.NewTicker(30 * time.Second) + go func() { + for range logTicker.C { + logging.WithFields("projection", h.ProjectionName()).Info("projection is prefilling") + } + }() + + instanceIDs, err := h.existingInstances(ctx) + if err != nil { + return err + } + + // default amount of workers is 10 + workerCount := 10 + + if h.client.DB.Stats().MaxOpenConnections > 0 { + workerCount = h.client.DB.Stats().MaxOpenConnections / 4 + } + // ensure that at least one worker is active + if workerCount == 0 { + workerCount = 1 + } + // spawn less workers if not all workers needed + if workerCount > len(instanceIDs) { + workerCount = len(instanceIDs) + } + + instances := make(chan string, workerCount) + var wg sync.WaitGroup + wg.Add(workerCount) + for i := 0; i < workerCount; i++ { + go h.executeInstances(ctx, instances, startedEvent, &wg) + } + + for _, instance := range instanceIDs { + instances <- instance + } + + close(instances) + wg.Wait() + + logTicker.Stop() + logging.WithFields("projection", h.ProjectionName(), "took", time.Since(start)).Info("projections ended prefilling") + return nil +} + +func (h *Handler) executeInstances(ctx context.Context, instances <-chan string, startedEvent eventstore.Event, wg *sync.WaitGroup) { + for instance := range instances { + h.triggerInstances(ctx, []string{instance}, WithMaxPosition(startedEvent.Position())) + } + wg.Done() +} + +// String implements migration.Migration. +func (h *Handler) String() string { + return h.ProjectionName() +} + // nowFunc makes [time.Now] mockable type nowFunc func() time.Time @@ -111,21 +181,56 @@ func (h *Handler) Start(ctx context.Context) { go h.subscribe(ctx) } -func (h *Handler) schedule(ctx context.Context) { - // if there was no run before trigger within half a second - start := randomizeStart(0, 0.5) - t := time.NewTimer(start) - didInitialize := h.didProjectionInitialize(ctx) - if didInitialize { - if !t.Stop() { - <-t.C - } - // if there was a trigger before, start the projection - // after a second (should generally be after the not initialized projections) - // and its configured `RequeueEvery` - reset := randomizeStart(1, h.requeueEvery.Seconds()) - t.Reset(reset) +type checkInit struct { + didInit bool + projectionName string +} + +// AppendEvents implements eventstore.QueryReducer. +func (ci *checkInit) AppendEvents(...eventstore.Event) { + ci.didInit = true +} + +// Query implements eventstore.QueryReducer. +func (ci *checkInit) Query() *eventstore.SearchQueryBuilder { + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). + Limit(1). + InstanceID(""). + AddQuery(). + AggregateTypes(migration.SystemAggregate). + AggregateIDs(migration.SystemAggregateID). + EventTypes(migration.DoneType). + EventData(map[string]interface{}{ + "name": ci.projectionName, + }). + Builder() +} + +// Reduce implements eventstore.QueryReducer. +func (*checkInit) Reduce() error { + return nil +} + +var _ eventstore.QueryReducer = (*checkInit)(nil) + +func (h *Handler) didInitialize(ctx context.Context) bool { + initiated := checkInit{ + projectionName: h.ProjectionName(), } + err := h.es.FilterToQueryReducer(ctx, &initiated) + if err != nil { + return false + } + return initiated.didInit +} + +func (h *Handler) schedule(ctx context.Context) { + // start the projection and its configured `RequeueEvery` + reset := randomizeStart(0, h.requeueEvery.Seconds()) + if !h.didInitialize(ctx) { + reset = randomizeStart(0, 0.5) + } + t := time.NewTimer(reset) for { select { @@ -133,40 +238,34 @@ func (h *Handler) schedule(ctx context.Context) { t.Stop() return case <-t.C: - instances, err := h.queryInstances(ctx, didInitialize) + instances, err := h.queryInstances(ctx) h.log().OnError(err).Debug("unable to query instances") - var instanceFailed bool - scheduledCtx := call.WithTimestamp(ctx) - for _, instance := range instances { - instanceCtx := authz.WithInstanceID(scheduledCtx, instance) - - // simple implementation of do while - _, err = h.Trigger(instanceCtx) - instanceFailed = instanceFailed || err != nil - h.log().WithField("instance", instance).OnError(err).Info("scheduled trigger failed") - time.Sleep(h.retryFailedAfter) - // retry if trigger failed - for ; err != nil; _, err = h.Trigger(instanceCtx) { - time.Sleep(h.retryFailedAfter) - instanceFailed = instanceFailed || err != nil - h.log().WithField("instance", instance).OnError(err).Info("scheduled trigger failed") - if err == nil { - break - } - } - } - - if !didInitialize && !instanceFailed { - err = h.setSucceededOnce(ctx) - h.log().OnError(err).Debug("unable to set succeeded once") - didInitialize = err == nil - } + h.triggerInstances(call.WithTimestamp(ctx), instances) t.Reset(h.requeueEvery) } } } +func (h *Handler) triggerInstances(ctx context.Context, instances []string, triggerOpts ...TriggerOpt) { + for _, instance := range instances { + instanceCtx := authz.WithInstanceID(ctx, instance) + + // simple implementation of do while + _, err := h.Trigger(instanceCtx, triggerOpts...) + h.log().WithField("instance", instance).OnError(err).Debug("trigger failed") + time.Sleep(h.retryFailedAfter) + // retry if trigger failed + for ; err != nil; _, err = h.Trigger(instanceCtx, triggerOpts...) { + time.Sleep(h.retryFailedAfter) + h.log().WithField("instance", instance).OnError(err).Debug("trigger failed") + if err == nil { + break + } + } + } +} + func randomizeStart(min, maxSeconds float64) time.Duration { d := min + rand.Float64()*(maxSeconds-min) return time.Duration(d*1000) * time.Millisecond @@ -223,31 +322,84 @@ func checkAdditionalEvents(eventQueue chan eventstore.Event, event eventstore.Ev } } -func (h *Handler) queryInstances(ctx context.Context, didInitialize bool) ([]string, error) { +type existingInstances []string + +// AppendEvents implements eventstore.QueryReducer. +func (ai *existingInstances) AppendEvents(events ...eventstore.Event) { + for _, event := range events { + switch event.Type() { + case instance.InstanceAddedEventType: + *ai = append(*ai, event.Aggregate().InstanceID) + case instance.InstanceRemovedEventType: + slices.DeleteFunc(*ai, func(s string) bool { + return s == event.Aggregate().InstanceID + }) + } + } +} + +// Query implements eventstore.QueryReducer. +func (*existingInstances) Query() *eventstore.SearchQueryBuilder { + return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). + AddQuery(). + AggregateTypes(instance.AggregateType). + EventTypes( + instance.InstanceAddedEventType, + instance.InstanceRemovedEventType, + ). + Builder() +} + +// Reduce implements eventstore.QueryReducer. +// reduce is not used as events are reduced during AppendEvents +func (*existingInstances) Reduce() error { + return nil +} + +var _ eventstore.QueryReducer = (*existingInstances)(nil) + +func (h *Handler) queryInstances(ctx context.Context) ([]string, error) { + if h.handleActiveInstances == 0 { + return h.existingInstances(ctx) + } + query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsInstanceIDs). AwaitOpenTransactions(). AllowTimeTravel(). - ExcludedInstanceID("") - if didInitialize && h.handleActiveInstances > 0 { - query = query. - CreationDateAfter(h.now().Add(-1 * h.handleActiveInstances)) + CreationDateAfter(h.now().Add(-1 * h.handleActiveInstances)) + + return h.es.InstanceIDs(ctx, h.requeueEvery, false, query) +} + +func (h *Handler) existingInstances(ctx context.Context) ([]string, error) { + ai := existingInstances{} + if err := h.es.FilterToQueryReducer(ctx, &ai); err != nil { + return nil, err } - return h.es.InstanceIDs(ctx, h.requeueEvery, !didInitialize, query) + + return ai, nil } type triggerConfig struct { awaitRunning bool + maxPosition float64 } -type triggerOpt func(conf *triggerConfig) +type TriggerOpt func(conf *triggerConfig) -func WithAwaitRunning() triggerOpt { +func WithAwaitRunning() TriggerOpt { return func(conf *triggerConfig) { conf.awaitRunning = true } } -func (h *Handler) Trigger(ctx context.Context, opts ...triggerOpt) (_ context.Context, err error) { +func WithMaxPosition(position float64) TriggerOpt { + return func(conf *triggerConfig) { + conf.maxPosition = position + } +} + +func (h *Handler) Trigger(ctx context.Context, opts ...TriggerOpt) (_ context.Context, err error) { config := new(triggerConfig) for _, opt := range opts { opt(config) @@ -261,7 +413,7 @@ func (h *Handler) Trigger(ctx context.Context, opts ...triggerOpt) (_ context.Co for i := 0; ; i++ { additionalIteration, err := h.processEvents(ctx, config) - h.log().OnError(err).Warn("process events failed") + h.log().OnError(err).Info("process events failed") h.log().WithField("iteration", i).Debug("trigger iteration") if !additionalIteration || err != nil { return call.ResetTimestamp(ctx), err @@ -350,6 +502,10 @@ func (h *Handler) processEvents(ctx context.Context, config *triggerConfig) (add } return additionalIteration, err } + // stop execution if currentState.eventTimestamp >= config.maxCreatedAt + if config.maxPosition != 0 && currentState.position >= config.maxPosition { + return false, nil + } var statements []*Statement statements, additionalIteration, err = h.generateStatements(ctx, tx, currentState) @@ -362,6 +518,7 @@ func (h *Handler) processEvents(ctx context.Context, config *triggerConfig) (add } lastProcessedIndex, err := h.executeStatements(ctx, tx, currentState, statements) + h.log().OnError(err).WithField("lastProcessedIndex", lastProcessedIndex).Debug("execution of statements failed") if lastProcessedIndex < 0 { return false, err } diff --git a/internal/eventstore/repository/search_query.go b/internal/eventstore/repository/search_query.go index a9167607e..86bc2e26d 100644 --- a/internal/eventstore/repository/search_query.go +++ b/internal/eventstore/repository/search_query.go @@ -134,7 +134,6 @@ func QueryFromBuilder(builder *eventstore.SearchQueryBuilder) (*SearchQuery, err for _, f := range []func(builder *eventstore.SearchQueryBuilder, query *SearchQuery) *Filter{ instanceIDFilter, instanceIDsFilter, - excludedInstanceIDFilter, editorUserFilter, resourceOwnerFilter, positionAfterFilter, @@ -184,14 +183,6 @@ func eventSequenceGreaterFilter(builder *eventstore.SearchQueryBuilder, query *S return query.Sequence } -func excludedInstanceIDFilter(builder *eventstore.SearchQueryBuilder, query *SearchQuery) *Filter { - if len(builder.GetExcludedInstanceIDs()) == 0 { - return nil - } - query.ExcludedInstances = NewFilter(FieldInstanceID, database.TextArray[string](builder.GetExcludedInstanceIDs()), OperationNotIn) - return query.ExcludedInstances -} - func creationDateAfterFilter(builder *eventstore.SearchQueryBuilder, query *SearchQuery) *Filter { if builder.GetCreationDateAfter().IsZero() { return nil diff --git a/internal/eventstore/search_query.go b/internal/eventstore/search_query.go index 00b404eab..0c08a260e 100644 --- a/internal/eventstore/search_query.go +++ b/internal/eventstore/search_query.go @@ -19,7 +19,6 @@ type SearchQueryBuilder struct { resourceOwner string instanceID *string instanceIDs []string - excludedInstanceIDs []string editorUser string queries []*SearchQuery tx *sql.Tx @@ -83,10 +82,6 @@ func (b SearchQueryBuilder) GetAwaitOpenTransactions() bool { return b.awaitOpenTransactions } -func (q SearchQueryBuilder) GetExcludedInstanceIDs() []string { - return q.excludedInstanceIDs -} - func (q SearchQueryBuilder) GetEventSequenceGreater() uint64 { return q.eventSequenceGreater } @@ -289,12 +284,6 @@ func (builder *SearchQueryBuilder) SequenceGreater(sequence uint64) *SearchQuery return builder } -// ExcludedInstanceID filters for events not having the given instanceIDs -func (builder *SearchQueryBuilder) ExcludedInstanceID(instanceIDs ...string) *SearchQueryBuilder { - builder.excludedInstanceIDs = instanceIDs - return builder -} - // CreationDateAfter filters for events which happened after the specified time func (builder *SearchQueryBuilder) CreationDateAfter(creationDate time.Time) *SearchQueryBuilder { if creationDate.IsZero() || creationDate.Unix() == 0 { diff --git a/internal/integration/config/zitadel.yaml b/internal/integration/config/zitadel.yaml index f4925881e..707cf180f 100644 --- a/internal/integration/config/zitadel.yaml +++ b/internal/integration/config/zitadel.yaml @@ -49,3 +49,6 @@ SystemAPIUsers: - "SYSTEM_OWNER" - "IAM_OWNER" - "ORG_OWNER" + +InitProjections: + Enabled: true \ No newline at end of file diff --git a/internal/migration/command.go b/internal/migration/command.go index d48f9462d..5ea4d9eb0 100644 --- a/internal/migration/command.go +++ b/internal/migration/command.go @@ -9,6 +9,13 @@ import ( "github.com/zitadel/zitadel/internal/zerrors" ) +func init() { + eventstore.RegisterFilterEventMapper(SystemAggregate, StartedType, SetupMapper) + eventstore.RegisterFilterEventMapper(SystemAggregate, DoneType, SetupMapper) + eventstore.RegisterFilterEventMapper(SystemAggregate, failedType, SetupMapper) + eventstore.RegisterFilterEventMapper(SystemAggregate, repeatableDoneType, SetupMapper) +} + // SetupStep is the command pushed on the eventstore type SetupStep struct { eventstore.BaseEvent `json:"-"` @@ -23,7 +30,7 @@ func setupStartedCmd(ctx context.Context, migration Migration) eventstore.Comman return &SetupStep{ BaseEvent: *eventstore.NewBaseEventForPush( ctx, - eventstore.NewAggregate(ctx, aggregateID, aggregateType, "v1"), + eventstore.NewAggregate(ctx, SystemAggregateID, SystemAggregate, "v1"), StartedType), migration: migration, Name: migration.String(), @@ -32,7 +39,7 @@ func setupStartedCmd(ctx context.Context, migration Migration) eventstore.Comman func setupDoneCmd(ctx context.Context, migration Migration, err error) eventstore.Command { ctx = authz.SetCtxData(service.WithService(ctx, "system"), authz.CtxData{UserID: "system", OrgID: "SYSTEM", ResourceOwner: "SYSTEM"}) - typ := doneType + typ := DoneType var lastRun interface{} if repeatable, ok := migration.(RepeatableMigration); ok { typ = repeatableDoneType @@ -51,7 +58,7 @@ func setupDoneCmd(ctx context.Context, migration Migration, err error) eventstor s.BaseEvent = *eventstore.NewBaseEventForPush( ctx, - eventstore.NewAggregate(ctx, aggregateID, aggregateType, "v1"), + eventstore.NewAggregate(ctx, SystemAggregateID, SystemAggregate, "v1"), typ) return s @@ -79,13 +86,6 @@ func (s *SetupStep) UniqueConstraints() []*eventstore.UniqueConstraint { } } -func RegisterMappers(es *eventstore.Eventstore) { - es.RegisterFilterEventMapper(aggregateType, StartedType, SetupMapper) - es.RegisterFilterEventMapper(aggregateType, doneType, SetupMapper) - es.RegisterFilterEventMapper(aggregateType, failedType, SetupMapper) - es.RegisterFilterEventMapper(aggregateType, repeatableDoneType, SetupMapper) -} - func SetupMapper(event eventstore.Event) (eventstore.Event, error) { step := &SetupStep{ BaseEvent: *eventstore.BaseEventFromRepo(event), diff --git a/internal/migration/migration.go b/internal/migration/migration.go index 5c03f28d5..a2224340a 100644 --- a/internal/migration/migration.go +++ b/internal/migration/migration.go @@ -13,11 +13,11 @@ import ( const ( StartedType = eventstore.EventType("system.migration.started") - doneType = eventstore.EventType("system.migration.done") + DoneType = eventstore.EventType("system.migration.done") failedType = eventstore.EventType("system.migration.failed") repeatableDoneType = eventstore.EventType("system.migration.repeatable.done") - aggregateType = eventstore.AggregateType("system") - aggregateID = "SYSTEM" + SystemAggregate = eventstore.AggregateType("system") + SystemAggregateID = "SYSTEM" ) var ( @@ -26,7 +26,7 @@ var ( type Migration interface { String() string - Execute(context.Context) error + Execute(ctx context.Context, startedEvent eventstore.Event) error } type errCheckerMigration interface { @@ -58,12 +58,13 @@ func Migrate(ctx context.Context, es *eventstore.Eventstore, migration Migration return nil } - if _, err = es.Push(ctx, setupStartedCmd(ctx, migration)); err != nil && !continueOnErr(err) { + startedEvent, err := es.Push(ctx, setupStartedCmd(ctx, migration)) + if err != nil && !continueOnErr(err) { return err } logging.WithFields("name", migration.String()).Info("starting migration") - err = migration.Execute(ctx) + err = migration.Execute(ctx, startedEvent[0]) logging.WithFields("name", migration.String()).OnError(err).Error("migration failed") _, pushErr := es.Push(ctx, setupDoneCmd(ctx, migration, err)) @@ -95,7 +96,7 @@ type cancelMigration struct { } // Execute implements Migration -func (*cancelMigration) Execute(context.Context) error { +func (*cancelMigration) Execute(context.Context, eventstore.Event) error { return nil } diff --git a/internal/migration/step.go b/internal/migration/step.go index ed0ec52ad..036a0a105 100644 --- a/internal/migration/step.go +++ b/internal/migration/step.go @@ -19,9 +19,9 @@ type StepStates struct { func (*StepStates) Query() *eventstore.SearchQueryBuilder { return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). AddQuery(). - AggregateTypes(aggregateType). - AggregateIDs(aggregateID). - EventTypes(StartedType, doneType, repeatableDoneType, failedType). + AggregateTypes(SystemAggregate). + AggregateIDs(SystemAggregateID). + EventTypes(StartedType, DoneType, repeatableDoneType, failedType). Builder() } @@ -38,7 +38,7 @@ func (s *StepStates) Reduce() error { switch step.EventType { case StartedType: state.state = StepStarted - case doneType: + case DoneType: state.state = StepDone case repeatableDoneType: state.state = StepDone diff --git a/internal/notification/projections.go b/internal/notification/projections.go index 341e35146..cdb2a84b2 100644 --- a/internal/notification/projections.go +++ b/internal/notification/projections.go @@ -6,13 +6,16 @@ import ( "github.com/zitadel/zitadel/internal/command" "github.com/zitadel/zitadel/internal/crypto" "github.com/zitadel/zitadel/internal/eventstore" + "github.com/zitadel/zitadel/internal/eventstore/handler/v2" "github.com/zitadel/zitadel/internal/notification/handlers" _ "github.com/zitadel/zitadel/internal/notification/statik" "github.com/zitadel/zitadel/internal/query" "github.com/zitadel/zitadel/internal/query/projection" ) -func Start( +var projections []*handler.Handler + +func Register( ctx context.Context, userHandlerCustomConfig, quotaHandlerCustomConfig, telemetryHandlerCustomConfig projection.CustomConfig, telemetryCfg handlers.TelemetryPusherConfig, @@ -28,9 +31,19 @@ func Start( ) { q := handlers.NewNotificationQueries(queries, es, externalDomain, externalPort, externalSecure, fileSystemPath, userEncryption, smtpEncryption, smsEncryption) c := newChannels(q) - handlers.NewUserNotifier(ctx, projection.ApplyCustomConfig(userHandlerCustomConfig), commands, q, c, otpEmailTmpl).Start(ctx) - handlers.NewQuotaNotifier(ctx, projection.ApplyCustomConfig(quotaHandlerCustomConfig), commands, q, c).Start(ctx) + projections = append(projections, handlers.NewUserNotifier(ctx, projection.ApplyCustomConfig(userHandlerCustomConfig), commands, q, c, otpEmailTmpl)) + projections = append(projections, handlers.NewQuotaNotifier(ctx, projection.ApplyCustomConfig(quotaHandlerCustomConfig), commands, q, c)) if telemetryCfg.Enabled { - handlers.NewTelemetryPusher(ctx, telemetryCfg, projection.ApplyCustomConfig(telemetryHandlerCustomConfig), commands, q, c).Start(ctx) + projections = append(projections, handlers.NewTelemetryPusher(ctx, telemetryCfg, projection.ApplyCustomConfig(telemetryHandlerCustomConfig), commands, q, c)) } } + +func Start(ctx context.Context) { + for _, projection := range projections { + projection.Start(ctx) + } +} + +func Projections() []*handler.Handler { + return projections +} diff --git a/internal/query/projection/eventstore_mock_test.go b/internal/query/projection/eventstore_mock_test.go index 672b19ae3..c1cdf434d 100644 --- a/internal/query/projection/eventstore_mock_test.go +++ b/internal/query/projection/eventstore_mock_test.go @@ -38,6 +38,13 @@ func (m *mockEventStore) Filter(ctx context.Context, queryFactory *eventstore.Se return m.filterResponse[m.filterCounter-1], nil } +func (m *mockEventStore) FilterToQueryReducer(ctx context.Context, reducer eventstore.QueryReducer) error { + m.filterCounter++ + events := m.filterResponse[m.filterCounter-1] + reducer.AppendEvents(events...) + return reducer.Reduce() +} + func (m *mockEventStore) Push(ctx context.Context, cmds ...eventstore.Command) ([]eventstore.Event, error) { m.pushCounter++ return m.pushResponse[m.pushCounter-1], nil diff --git a/internal/query/projection/main_test.go b/internal/query/projection/main_test.go index ac5251921..ba5789746 100644 --- a/internal/query/projection/main_test.go +++ b/internal/query/projection/main_test.go @@ -8,15 +8,6 @@ import ( "github.com/zitadel/zitadel/internal/eventstore" "github.com/zitadel/zitadel/internal/eventstore/repository" "github.com/zitadel/zitadel/internal/eventstore/repository/mock" - action_repo "github.com/zitadel/zitadel/internal/repository/action" - iam_repo "github.com/zitadel/zitadel/internal/repository/instance" - key_repo "github.com/zitadel/zitadel/internal/repository/keypair" - "github.com/zitadel/zitadel/internal/repository/limits" - "github.com/zitadel/zitadel/internal/repository/org" - proj_repo "github.com/zitadel/zitadel/internal/repository/project" - quota_repo "github.com/zitadel/zitadel/internal/repository/quota" - usr_repo "github.com/zitadel/zitadel/internal/repository/user" - "github.com/zitadel/zitadel/internal/repository/usergrant" ) type expect func(mockRepository *mock.MockRepository) @@ -32,15 +23,6 @@ func eventstoreExpect(t *testing.T, expects ...expect) *eventstore.Eventstore { Pusher: m.MockPusher, }, ) - iam_repo.RegisterEventMappers(es) - org.RegisterEventMappers(es) - usr_repo.RegisterEventMappers(es) - proj_repo.RegisterEventMappers(es) - quota_repo.RegisterEventMappers(es) - limits.RegisterEventMappers(es) - usergrant.RegisterEventMappers(es) - key_repo.RegisterEventMappers(es) - action_repo.RegisterEventMappers(es) return es } diff --git a/internal/query/projection/projection.go b/internal/query/projection/projection.go index 055aaa81a..7c67b5cc3 100644 --- a/internal/query/projection/projection.go +++ b/internal/query/projection/projection.go @@ -7,6 +7,7 @@ import ( "github.com/zitadel/zitadel/internal/crypto" "github.com/zitadel/zitadel/internal/database" "github.com/zitadel/zitadel/internal/eventstore/handler/v2" + "github.com/zitadel/zitadel/internal/migration" ) const ( @@ -76,6 +77,8 @@ var ( type projection interface { Start(ctx context.Context) Init(ctx context.Context) error + Trigger(ctx context.Context, opts ...handler.TriggerOpt) (_ context.Context, err error) + migration.Migration } var ( @@ -149,6 +152,10 @@ func Create(ctx context.Context, sqlClient *database.DB, es handler.EventStore, return nil } +func Projections() []projection { + return projections +} + func Init(ctx context.Context) error { for _, p := range projections { if err := p.Init(ctx); err != nil { diff --git a/internal/query/query.go b/internal/query/query.go index 1b48c44a4..6bae5f924 100644 --- a/internal/query/query.go +++ b/internal/query/query.go @@ -18,21 +18,6 @@ import ( "github.com/zitadel/zitadel/internal/eventstore" "github.com/zitadel/zitadel/internal/eventstore/handler/v2" "github.com/zitadel/zitadel/internal/query/projection" - "github.com/zitadel/zitadel/internal/repository/action" - "github.com/zitadel/zitadel/internal/repository/authrequest" - "github.com/zitadel/zitadel/internal/repository/deviceauth" - "github.com/zitadel/zitadel/internal/repository/idpintent" - iam_repo "github.com/zitadel/zitadel/internal/repository/instance" - "github.com/zitadel/zitadel/internal/repository/keypair" - "github.com/zitadel/zitadel/internal/repository/limits" - "github.com/zitadel/zitadel/internal/repository/oidcsession" - "github.com/zitadel/zitadel/internal/repository/org" - "github.com/zitadel/zitadel/internal/repository/project" - "github.com/zitadel/zitadel/internal/repository/quota" - "github.com/zitadel/zitadel/internal/repository/restrictions" - "github.com/zitadel/zitadel/internal/repository/session" - usr_repo "github.com/zitadel/zitadel/internal/repository/user" - "github.com/zitadel/zitadel/internal/repository/usergrant" "github.com/zitadel/zitadel/internal/telemetry/tracing" ) @@ -67,6 +52,7 @@ func StartQueries( permissionCheck func(q *Queries) domain.PermissionCheck, defaultAuditLogRetention time.Duration, systemAPIUsers map[string]*authz.SystemAPIUser, + startProjections bool, ) (repo *Queries, err error) { repo = &Queries{ eventstore: es, @@ -86,21 +72,6 @@ func StartQueries( }, defaultAuditLogRetention: defaultAuditLogRetention, } - iam_repo.RegisterEventMappers(repo.eventstore) - usr_repo.RegisterEventMappers(repo.eventstore) - org.RegisterEventMappers(repo.eventstore) - project.RegisterEventMappers(repo.eventstore) - action.RegisterEventMappers(repo.eventstore) - keypair.RegisterEventMappers(repo.eventstore) - usergrant.RegisterEventMappers(repo.eventstore) - session.RegisterEventMappers(repo.eventstore) - idpintent.RegisterEventMappers(repo.eventstore) - authrequest.RegisterEventMappers(repo.eventstore) - oidcsession.RegisterEventMappers(repo.eventstore) - quota.RegisterEventMappers(repo.eventstore) - limits.RegisterEventMappers(repo.eventstore) - restrictions.RegisterEventMappers(repo.eventstore) - deviceauth.RegisterEventMappers(repo.eventstore) repo.checkPermission = permissionCheck(repo) @@ -108,7 +79,9 @@ func StartQueries( if err != nil { return nil, err } - projection.Start(ctx) + if startProjections { + projection.Start(ctx) + } return repo, nil } diff --git a/internal/query/query_test.go b/internal/query/query_test.go index a7f43bbab..622638a33 100644 --- a/internal/query/query_test.go +++ b/internal/query/query_test.go @@ -10,21 +10,6 @@ import ( "github.com/zitadel/zitadel/internal/eventstore" "github.com/zitadel/zitadel/internal/eventstore/repository" "github.com/zitadel/zitadel/internal/eventstore/repository/mock" - action_repo "github.com/zitadel/zitadel/internal/repository/action" - "github.com/zitadel/zitadel/internal/repository/authrequest" - "github.com/zitadel/zitadel/internal/repository/deviceauth" - "github.com/zitadel/zitadel/internal/repository/feature" - "github.com/zitadel/zitadel/internal/repository/idpintent" - iam_repo "github.com/zitadel/zitadel/internal/repository/instance" - key_repo "github.com/zitadel/zitadel/internal/repository/keypair" - "github.com/zitadel/zitadel/internal/repository/limits" - "github.com/zitadel/zitadel/internal/repository/oidcsession" - "github.com/zitadel/zitadel/internal/repository/org" - proj_repo "github.com/zitadel/zitadel/internal/repository/project" - quota_repo "github.com/zitadel/zitadel/internal/repository/quota" - "github.com/zitadel/zitadel/internal/repository/session" - usr_repo "github.com/zitadel/zitadel/internal/repository/user" - "github.com/zitadel/zitadel/internal/repository/usergrant" ) type expect func(mockRepository *mock.MockRepository) @@ -41,21 +26,6 @@ func expectEventstore(expects ...expect) func(*testing.T) *eventstore.Eventstore Pusher: m.MockPusher, }, ) - iam_repo.RegisterEventMappers(es) - org.RegisterEventMappers(es) - usr_repo.RegisterEventMappers(es) - proj_repo.RegisterEventMappers(es) - usergrant.RegisterEventMappers(es) - key_repo.RegisterEventMappers(es) - action_repo.RegisterEventMappers(es) - session.RegisterEventMappers(es) - idpintent.RegisterEventMappers(es) - authrequest.RegisterEventMappers(es) - oidcsession.RegisterEventMappers(es) - quota_repo.RegisterEventMappers(es) - limits.RegisterEventMappers(es) - feature.RegisterEventMappers(es) - deviceauth.RegisterEventMappers(es) return es } } diff --git a/internal/repository/action/eventstore.go b/internal/repository/action/eventstore.go index c97268302..dd0c399b7 100644 --- a/internal/repository/action/eventstore.go +++ b/internal/repository/action/eventstore.go @@ -2,10 +2,10 @@ package action import "github.com/zitadel/zitadel/internal/eventstore" -func RegisterEventMappers(es *eventstore.Eventstore) { - es.RegisterFilterEventMapper(AggregateType, AddedEventType, AddedEventMapper). - RegisterFilterEventMapper(AggregateType, ChangedEventType, ChangedEventMapper). - RegisterFilterEventMapper(AggregateType, DeactivatedEventType, DeactivatedEventMapper). - RegisterFilterEventMapper(AggregateType, ReactivatedEventType, ReactivatedEventMapper). - RegisterFilterEventMapper(AggregateType, RemovedEventType, RemovedEventMapper) +func init() { + eventstore.RegisterFilterEventMapper(AggregateType, AddedEventType, AddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, ChangedEventType, ChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, DeactivatedEventType, DeactivatedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, ReactivatedEventType, ReactivatedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, RemovedEventType, RemovedEventMapper) } diff --git a/internal/repository/authrequest/eventstore.go b/internal/repository/authrequest/eventstore.go index c1bfed7dc..1e1e08b46 100644 --- a/internal/repository/authrequest/eventstore.go +++ b/internal/repository/authrequest/eventstore.go @@ -2,11 +2,11 @@ package authrequest import "github.com/zitadel/zitadel/internal/eventstore" -func RegisterEventMappers(es *eventstore.Eventstore) { - es.RegisterFilterEventMapper(AggregateType, AddedType, AddedEventMapper). - RegisterFilterEventMapper(AggregateType, SessionLinkedType, SessionLinkedEventMapper). - RegisterFilterEventMapper(AggregateType, CodeAddedType, CodeAddedEventMapper). - RegisterFilterEventMapper(AggregateType, CodeExchangedType, CodeExchangedEventMapper). - RegisterFilterEventMapper(AggregateType, FailedType, FailedEventMapper). - RegisterFilterEventMapper(AggregateType, SucceededType, SucceededEventMapper) +func init() { + eventstore.RegisterFilterEventMapper(AggregateType, AddedType, AddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, SessionLinkedType, SessionLinkedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, CodeAddedType, CodeAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, CodeExchangedType, CodeExchangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, FailedType, FailedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, SucceededType, SucceededEventMapper) } diff --git a/internal/repository/deviceauth/eventstore.go b/internal/repository/deviceauth/eventstore.go index 6ebdf71b6..75ce37c9e 100644 --- a/internal/repository/deviceauth/eventstore.go +++ b/internal/repository/deviceauth/eventstore.go @@ -2,8 +2,8 @@ package deviceauth import "github.com/zitadel/zitadel/internal/eventstore" -func RegisterEventMappers(es *eventstore.Eventstore) { - es.RegisterFilterEventMapper(AggregateType, AddedEventType, eventstore.GenericEventMapper[AddedEvent]). - RegisterFilterEventMapper(AggregateType, ApprovedEventType, eventstore.GenericEventMapper[ApprovedEvent]). - RegisterFilterEventMapper(AggregateType, CanceledEventType, eventstore.GenericEventMapper[CanceledEvent]) +func init() { + eventstore.RegisterFilterEventMapper(AggregateType, AddedEventType, eventstore.GenericEventMapper[AddedEvent]) + eventstore.RegisterFilterEventMapper(AggregateType, ApprovedEventType, eventstore.GenericEventMapper[ApprovedEvent]) + eventstore.RegisterFilterEventMapper(AggregateType, CanceledEventType, eventstore.GenericEventMapper[CanceledEvent]) } diff --git a/internal/repository/feature/eventstore.go b/internal/repository/feature/eventstore.go index 4fe6a3727..41712e2e9 100644 --- a/internal/repository/feature/eventstore.go +++ b/internal/repository/feature/eventstore.go @@ -4,6 +4,6 @@ import ( "github.com/zitadel/zitadel/internal/eventstore" ) -func RegisterEventMappers(es *eventstore.Eventstore) { - es.RegisterFilterEventMapper(AggregateType, DefaultLoginInstanceEventType, eventstore.GenericEventMapper[SetEvent[Boolean]]) +func init() { + eventstore.RegisterFilterEventMapper(AggregateType, DefaultLoginInstanceEventType, eventstore.GenericEventMapper[SetEvent[Boolean]]) } diff --git a/internal/repository/idpintent/eventstore.go b/internal/repository/idpintent/eventstore.go index 1c7417ef0..ea9480397 100644 --- a/internal/repository/idpintent/eventstore.go +++ b/internal/repository/idpintent/eventstore.go @@ -4,11 +4,11 @@ import ( "github.com/zitadel/zitadel/internal/eventstore" ) -func RegisterEventMappers(es *eventstore.Eventstore) { - es.RegisterFilterEventMapper(AggregateType, StartedEventType, StartedEventMapper). - RegisterFilterEventMapper(AggregateType, SucceededEventType, SucceededEventMapper). - RegisterFilterEventMapper(AggregateType, SAMLSucceededEventType, SAMLSucceededEventMapper). - RegisterFilterEventMapper(AggregateType, SAMLRequestEventType, SAMLRequestEventMapper). - RegisterFilterEventMapper(AggregateType, LDAPSucceededEventType, LDAPSucceededEventMapper). - RegisterFilterEventMapper(AggregateType, FailedEventType, FailedEventMapper) +func init() { + eventstore.RegisterFilterEventMapper(AggregateType, StartedEventType, StartedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, SucceededEventType, SucceededEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, SAMLSucceededEventType, SAMLSucceededEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, SAMLRequestEventType, SAMLRequestEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LDAPSucceededEventType, LDAPSucceededEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, FailedEventType, FailedEventMapper) } diff --git a/internal/repository/instance/eventstore.go b/internal/repository/instance/eventstore.go index c9d750e3b..6b21ab6f2 100644 --- a/internal/repository/instance/eventstore.go +++ b/internal/repository/instance/eventstore.go @@ -4,119 +4,119 @@ import ( "github.com/zitadel/zitadel/internal/eventstore" ) -func RegisterEventMappers(es *eventstore.Eventstore) { - es.RegisterFilterEventMapper(AggregateType, DefaultOrgSetEventType, DefaultOrgSetMapper). - RegisterFilterEventMapper(AggregateType, ProjectSetEventType, ProjectSetMapper). - RegisterFilterEventMapper(AggregateType, ConsoleSetEventType, ConsoleSetMapper). - RegisterFilterEventMapper(AggregateType, DefaultLanguageSetEventType, DefaultLanguageSetMapper). - RegisterFilterEventMapper(AggregateType, SecretGeneratorAddedEventType, SecretGeneratorAddedEventMapper). - RegisterFilterEventMapper(AggregateType, SecretGeneratorChangedEventType, SecretGeneratorChangedEventMapper). - RegisterFilterEventMapper(AggregateType, SecretGeneratorRemovedEventType, SecretGeneratorRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, SMTPConfigAddedEventType, SMTPConfigAddedEventMapper). - RegisterFilterEventMapper(AggregateType, SMTPConfigChangedEventType, SMTPConfigChangedEventMapper). - RegisterFilterEventMapper(AggregateType, SMTPConfigPasswordChangedEventType, SMTPConfigPasswordChangedEventMapper). - RegisterFilterEventMapper(AggregateType, SMTPConfigRemovedEventType, SMTPConfigRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, SMSConfigTwilioAddedEventType, SMSConfigTwilioAddedEventMapper). - RegisterFilterEventMapper(AggregateType, SMSConfigTwilioChangedEventType, SMSConfigTwilioChangedEventMapper). - RegisterFilterEventMapper(AggregateType, SMSConfigTwilioTokenChangedEventType, SMSConfigTwilioTokenChangedEventMapper). - RegisterFilterEventMapper(AggregateType, SMSConfigActivatedEventType, SMSConfigActivatedEventMapper). - RegisterFilterEventMapper(AggregateType, SMSConfigDeactivatedEventType, SMSConfigDeactivatedEventMapper). - RegisterFilterEventMapper(AggregateType, SMSConfigRemovedEventType, SMSConfigRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, DebugNotificationProviderFileAddedEventType, DebugNotificationProviderFileAddedEventMapper). - RegisterFilterEventMapper(AggregateType, DebugNotificationProviderFileChangedEventType, DebugNotificationProviderFileChangedEventMapper). - RegisterFilterEventMapper(AggregateType, DebugNotificationProviderFileRemovedEventType, DebugNotificationProviderFileRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, DebugNotificationProviderLogAddedEventType, DebugNotificationProviderLogAddedEventMapper). - RegisterFilterEventMapper(AggregateType, DebugNotificationProviderLogChangedEventType, DebugNotificationProviderLogChangedEventMapper). - RegisterFilterEventMapper(AggregateType, DebugNotificationProviderLogRemovedEventType, DebugNotificationProviderLogRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, OIDCSettingsAddedEventType, OIDCSettingsAddedEventMapper). - RegisterFilterEventMapper(AggregateType, OIDCSettingsChangedEventType, OIDCSettingsChangedEventMapper). - RegisterFilterEventMapper(AggregateType, SecurityPolicySetEventType, SecurityPolicySetEventMapper). - RegisterFilterEventMapper(AggregateType, LabelPolicyAddedEventType, LabelPolicyAddedEventMapper). - RegisterFilterEventMapper(AggregateType, LabelPolicyChangedEventType, LabelPolicyChangedEventMapper). - RegisterFilterEventMapper(AggregateType, LabelPolicyActivatedEventType, LabelPolicyActivatedEventMapper). - RegisterFilterEventMapper(AggregateType, LabelPolicyLogoAddedEventType, LabelPolicyLogoAddedEventMapper). - RegisterFilterEventMapper(AggregateType, LabelPolicyLogoRemovedEventType, LabelPolicyLogoRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, LabelPolicyIconAddedEventType, LabelPolicyIconAddedEventMapper). - RegisterFilterEventMapper(AggregateType, LabelPolicyIconRemovedEventType, LabelPolicyIconRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, LabelPolicyLogoDarkAddedEventType, LabelPolicyLogoDarkAddedEventMapper). - RegisterFilterEventMapper(AggregateType, LabelPolicyLogoDarkRemovedEventType, LabelPolicyLogoDarkRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, LabelPolicyIconDarkAddedEventType, LabelPolicyIconDarkAddedEventMapper). - RegisterFilterEventMapper(AggregateType, LabelPolicyIconDarkRemovedEventType, LabelPolicyIconDarkRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, LabelPolicyFontAddedEventType, LabelPolicyFontAddedEventMapper). - RegisterFilterEventMapper(AggregateType, LabelPolicyFontRemovedEventType, LabelPolicyFontRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, LabelPolicyAssetsRemovedEventType, LabelPolicyAssetsRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, LoginPolicyAddedEventType, LoginPolicyAddedEventMapper). - RegisterFilterEventMapper(AggregateType, LoginPolicyChangedEventType, LoginPolicyChangedEventMapper). - RegisterFilterEventMapper(AggregateType, DomainPolicyAddedEventType, DomainPolicyAddedEventMapper). - RegisterFilterEventMapper(AggregateType, DomainPolicyChangedEventType, DomainPolicyChangedEventMapper). - RegisterFilterEventMapper(AggregateType, PasswordAgePolicyAddedEventType, PasswordAgePolicyAddedEventMapper). - RegisterFilterEventMapper(AggregateType, PasswordAgePolicyChangedEventType, PasswordAgePolicyChangedEventMapper). - RegisterFilterEventMapper(AggregateType, PasswordComplexityPolicyAddedEventType, PasswordComplexityPolicyAddedEventMapper). - RegisterFilterEventMapper(AggregateType, PasswordComplexityPolicyChangedEventType, PasswordComplexityPolicyChangedEventMapper). - RegisterFilterEventMapper(AggregateType, LockoutPolicyAddedEventType, LockoutPolicyAddedEventMapper). - RegisterFilterEventMapper(AggregateType, LockoutPolicyChangedEventType, LockoutPolicyChangedEventMapper). - RegisterFilterEventMapper(AggregateType, PrivacyPolicyAddedEventType, PrivacyPolicyAddedEventMapper). - RegisterFilterEventMapper(AggregateType, PrivacyPolicyChangedEventType, PrivacyPolicyChangedEventMapper). - RegisterFilterEventMapper(AggregateType, MemberAddedEventType, MemberAddedEventMapper). - RegisterFilterEventMapper(AggregateType, MemberChangedEventType, MemberChangedEventMapper). - RegisterFilterEventMapper(AggregateType, MemberRemovedEventType, MemberRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, MemberCascadeRemovedEventType, MemberCascadeRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, IDPConfigAddedEventType, IDPConfigAddedEventMapper). - RegisterFilterEventMapper(AggregateType, IDPConfigChangedEventType, IDPConfigChangedEventMapper). - RegisterFilterEventMapper(AggregateType, IDPConfigRemovedEventType, IDPConfigRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, IDPConfigDeactivatedEventType, IDPConfigDeactivatedEventMapper). - RegisterFilterEventMapper(AggregateType, IDPConfigReactivatedEventType, IDPConfigReactivatedEventMapper). - RegisterFilterEventMapper(AggregateType, IDPOIDCConfigAddedEventType, IDPOIDCConfigAddedEventMapper). - RegisterFilterEventMapper(AggregateType, IDPOIDCConfigChangedEventType, IDPOIDCConfigChangedEventMapper). - RegisterFilterEventMapper(AggregateType, IDPJWTConfigAddedEventType, IDPJWTConfigAddedEventMapper). - RegisterFilterEventMapper(AggregateType, IDPJWTConfigChangedEventType, IDPJWTConfigChangedEventMapper). - RegisterFilterEventMapper(AggregateType, OAuthIDPAddedEventType, OAuthIDPAddedEventMapper). - RegisterFilterEventMapper(AggregateType, OAuthIDPChangedEventType, OAuthIDPChangedEventMapper). - RegisterFilterEventMapper(AggregateType, OIDCIDPAddedEventType, OIDCIDPAddedEventMapper). - RegisterFilterEventMapper(AggregateType, OIDCIDPChangedEventType, OIDCIDPChangedEventMapper). - RegisterFilterEventMapper(AggregateType, OIDCIDPMigratedAzureADEventType, OIDCIDPMigratedAzureADEventMapper). - RegisterFilterEventMapper(AggregateType, OIDCIDPMigratedGoogleEventType, OIDCIDPMigratedGoogleEventMapper). - RegisterFilterEventMapper(AggregateType, JWTIDPAddedEventType, JWTIDPAddedEventMapper). - RegisterFilterEventMapper(AggregateType, JWTIDPChangedEventType, JWTIDPChangedEventMapper). - RegisterFilterEventMapper(AggregateType, AzureADIDPAddedEventType, AzureADIDPAddedEventMapper). - RegisterFilterEventMapper(AggregateType, AzureADIDPChangedEventType, AzureADIDPChangedEventMapper). - RegisterFilterEventMapper(AggregateType, GitHubIDPAddedEventType, GitHubIDPAddedEventMapper). - RegisterFilterEventMapper(AggregateType, GitHubIDPChangedEventType, GitHubIDPChangedEventMapper). - RegisterFilterEventMapper(AggregateType, GitHubEnterpriseIDPAddedEventType, GitHubEnterpriseIDPAddedEventMapper). - RegisterFilterEventMapper(AggregateType, GitHubEnterpriseIDPChangedEventType, GitHubEnterpriseIDPChangedEventMapper). - RegisterFilterEventMapper(AggregateType, GitLabIDPAddedEventType, GitLabIDPAddedEventMapper). - RegisterFilterEventMapper(AggregateType, GitLabIDPChangedEventType, GitLabIDPChangedEventMapper). - RegisterFilterEventMapper(AggregateType, GitLabSelfHostedIDPAddedEventType, GitLabSelfHostedIDPAddedEventMapper). - RegisterFilterEventMapper(AggregateType, GitLabSelfHostedIDPChangedEventType, GitLabSelfHostedIDPChangedEventMapper). - RegisterFilterEventMapper(AggregateType, GoogleIDPAddedEventType, GoogleIDPAddedEventMapper). - RegisterFilterEventMapper(AggregateType, GoogleIDPChangedEventType, GoogleIDPChangedEventMapper). - RegisterFilterEventMapper(AggregateType, LDAPIDPAddedEventType, LDAPIDPAddedEventMapper). - RegisterFilterEventMapper(AggregateType, LDAPIDPChangedEventType, LDAPIDPChangedEventMapper). - RegisterFilterEventMapper(AggregateType, AppleIDPAddedEventType, AppleIDPAddedEventMapper). - RegisterFilterEventMapper(AggregateType, AppleIDPChangedEventType, AppleIDPChangedEventMapper). - RegisterFilterEventMapper(AggregateType, SAMLIDPAddedEventType, SAMLIDPAddedEventMapper). - RegisterFilterEventMapper(AggregateType, SAMLIDPChangedEventType, SAMLIDPChangedEventMapper). - RegisterFilterEventMapper(AggregateType, IDPRemovedEventType, IDPRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, LoginPolicyIDPProviderAddedEventType, IdentityProviderAddedEventMapper). - RegisterFilterEventMapper(AggregateType, LoginPolicyIDPProviderRemovedEventType, IdentityProviderRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, LoginPolicyIDPProviderCascadeRemovedEventType, IdentityProviderCascadeRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, LoginPolicySecondFactorAddedEventType, SecondFactorAddedEventMapper). - RegisterFilterEventMapper(AggregateType, LoginPolicySecondFactorRemovedEventType, SecondFactorRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, LoginPolicyMultiFactorAddedEventType, MultiFactorAddedEventMapper). - RegisterFilterEventMapper(AggregateType, LoginPolicyMultiFactorRemovedEventType, MultiFactorRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, MailTemplateAddedEventType, MailTemplateAddedEventMapper). - RegisterFilterEventMapper(AggregateType, MailTemplateChangedEventType, MailTemplateChangedEventMapper). - RegisterFilterEventMapper(AggregateType, MailTextAddedEventType, MailTextAddedEventMapper). - RegisterFilterEventMapper(AggregateType, MailTextChangedEventType, MailTextChangedEventMapper). - RegisterFilterEventMapper(AggregateType, CustomTextSetEventType, CustomTextSetEventMapper). - RegisterFilterEventMapper(AggregateType, CustomTextRemovedEventType, CustomTextRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, CustomTextTemplateRemovedEventType, CustomTextTemplateRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, InstanceDomainAddedEventType, DomainAddedEventMapper). - RegisterFilterEventMapper(AggregateType, InstanceDomainPrimarySetEventType, DomainPrimarySetEventMapper). - RegisterFilterEventMapper(AggregateType, InstanceDomainRemovedEventType, DomainRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, InstanceAddedEventType, InstanceAddedEventMapper). - RegisterFilterEventMapper(AggregateType, InstanceChangedEventType, InstanceChangedEventMapper). - RegisterFilterEventMapper(AggregateType, InstanceRemovedEventType, InstanceRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, NotificationPolicyAddedEventType, NotificationPolicyAddedEventMapper). - RegisterFilterEventMapper(AggregateType, NotificationPolicyChangedEventType, NotificationPolicyChangedEventMapper) +func init() { + eventstore.RegisterFilterEventMapper(AggregateType, DefaultOrgSetEventType, DefaultOrgSetMapper) + eventstore.RegisterFilterEventMapper(AggregateType, ProjectSetEventType, ProjectSetMapper) + eventstore.RegisterFilterEventMapper(AggregateType, ConsoleSetEventType, ConsoleSetMapper) + eventstore.RegisterFilterEventMapper(AggregateType, DefaultLanguageSetEventType, DefaultLanguageSetMapper) + eventstore.RegisterFilterEventMapper(AggregateType, SecretGeneratorAddedEventType, SecretGeneratorAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, SecretGeneratorChangedEventType, SecretGeneratorChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, SecretGeneratorRemovedEventType, SecretGeneratorRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, SMTPConfigAddedEventType, SMTPConfigAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, SMTPConfigChangedEventType, SMTPConfigChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, SMTPConfigPasswordChangedEventType, SMTPConfigPasswordChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, SMTPConfigRemovedEventType, SMTPConfigRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, SMSConfigTwilioAddedEventType, SMSConfigTwilioAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, SMSConfigTwilioChangedEventType, SMSConfigTwilioChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, SMSConfigTwilioTokenChangedEventType, SMSConfigTwilioTokenChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, SMSConfigActivatedEventType, SMSConfigActivatedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, SMSConfigDeactivatedEventType, SMSConfigDeactivatedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, SMSConfigRemovedEventType, SMSConfigRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, DebugNotificationProviderFileAddedEventType, DebugNotificationProviderFileAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, DebugNotificationProviderFileChangedEventType, DebugNotificationProviderFileChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, DebugNotificationProviderFileRemovedEventType, DebugNotificationProviderFileRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, DebugNotificationProviderLogAddedEventType, DebugNotificationProviderLogAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, DebugNotificationProviderLogChangedEventType, DebugNotificationProviderLogChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, DebugNotificationProviderLogRemovedEventType, DebugNotificationProviderLogRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, OIDCSettingsAddedEventType, OIDCSettingsAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, OIDCSettingsChangedEventType, OIDCSettingsChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, SecurityPolicySetEventType, SecurityPolicySetEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LabelPolicyAddedEventType, LabelPolicyAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LabelPolicyChangedEventType, LabelPolicyChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LabelPolicyActivatedEventType, LabelPolicyActivatedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LabelPolicyLogoAddedEventType, LabelPolicyLogoAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LabelPolicyLogoRemovedEventType, LabelPolicyLogoRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LabelPolicyIconAddedEventType, LabelPolicyIconAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LabelPolicyIconRemovedEventType, LabelPolicyIconRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LabelPolicyLogoDarkAddedEventType, LabelPolicyLogoDarkAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LabelPolicyLogoDarkRemovedEventType, LabelPolicyLogoDarkRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LabelPolicyIconDarkAddedEventType, LabelPolicyIconDarkAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LabelPolicyIconDarkRemovedEventType, LabelPolicyIconDarkRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LabelPolicyFontAddedEventType, LabelPolicyFontAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LabelPolicyFontRemovedEventType, LabelPolicyFontRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LabelPolicyAssetsRemovedEventType, LabelPolicyAssetsRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LoginPolicyAddedEventType, LoginPolicyAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LoginPolicyChangedEventType, LoginPolicyChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, DomainPolicyAddedEventType, DomainPolicyAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, DomainPolicyChangedEventType, DomainPolicyChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, PasswordAgePolicyAddedEventType, PasswordAgePolicyAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, PasswordAgePolicyChangedEventType, PasswordAgePolicyChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, PasswordComplexityPolicyAddedEventType, PasswordComplexityPolicyAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, PasswordComplexityPolicyChangedEventType, PasswordComplexityPolicyChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LockoutPolicyAddedEventType, LockoutPolicyAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LockoutPolicyChangedEventType, LockoutPolicyChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, PrivacyPolicyAddedEventType, PrivacyPolicyAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, PrivacyPolicyChangedEventType, PrivacyPolicyChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MemberAddedEventType, MemberAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MemberChangedEventType, MemberChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MemberRemovedEventType, MemberRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MemberCascadeRemovedEventType, MemberCascadeRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, IDPConfigAddedEventType, IDPConfigAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, IDPConfigChangedEventType, IDPConfigChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, IDPConfigRemovedEventType, IDPConfigRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, IDPConfigDeactivatedEventType, IDPConfigDeactivatedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, IDPConfigReactivatedEventType, IDPConfigReactivatedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, IDPOIDCConfigAddedEventType, IDPOIDCConfigAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, IDPOIDCConfigChangedEventType, IDPOIDCConfigChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, IDPJWTConfigAddedEventType, IDPJWTConfigAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, IDPJWTConfigChangedEventType, IDPJWTConfigChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, OAuthIDPAddedEventType, OAuthIDPAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, OAuthIDPChangedEventType, OAuthIDPChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, OIDCIDPAddedEventType, OIDCIDPAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, OIDCIDPChangedEventType, OIDCIDPChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, OIDCIDPMigratedAzureADEventType, OIDCIDPMigratedAzureADEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, OIDCIDPMigratedGoogleEventType, OIDCIDPMigratedGoogleEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, JWTIDPAddedEventType, JWTIDPAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, JWTIDPChangedEventType, JWTIDPChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, AzureADIDPAddedEventType, AzureADIDPAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, AzureADIDPChangedEventType, AzureADIDPChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, GitHubIDPAddedEventType, GitHubIDPAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, GitHubIDPChangedEventType, GitHubIDPChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, GitHubEnterpriseIDPAddedEventType, GitHubEnterpriseIDPAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, GitHubEnterpriseIDPChangedEventType, GitHubEnterpriseIDPChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, GitLabIDPAddedEventType, GitLabIDPAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, GitLabIDPChangedEventType, GitLabIDPChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, GitLabSelfHostedIDPAddedEventType, GitLabSelfHostedIDPAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, GitLabSelfHostedIDPChangedEventType, GitLabSelfHostedIDPChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, GoogleIDPAddedEventType, GoogleIDPAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, GoogleIDPChangedEventType, GoogleIDPChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LDAPIDPAddedEventType, LDAPIDPAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LDAPIDPChangedEventType, LDAPIDPChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, AppleIDPAddedEventType, AppleIDPAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, AppleIDPChangedEventType, AppleIDPChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, SAMLIDPAddedEventType, SAMLIDPAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, SAMLIDPChangedEventType, SAMLIDPChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, IDPRemovedEventType, IDPRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LoginPolicyIDPProviderAddedEventType, IdentityProviderAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LoginPolicyIDPProviderRemovedEventType, IdentityProviderRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LoginPolicyIDPProviderCascadeRemovedEventType, IdentityProviderCascadeRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LoginPolicySecondFactorAddedEventType, SecondFactorAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LoginPolicySecondFactorRemovedEventType, SecondFactorRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LoginPolicyMultiFactorAddedEventType, MultiFactorAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LoginPolicyMultiFactorRemovedEventType, MultiFactorRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MailTemplateAddedEventType, MailTemplateAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MailTemplateChangedEventType, MailTemplateChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MailTextAddedEventType, MailTextAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MailTextChangedEventType, MailTextChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, CustomTextSetEventType, CustomTextSetEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, CustomTextRemovedEventType, CustomTextRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, CustomTextTemplateRemovedEventType, CustomTextTemplateRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, InstanceDomainAddedEventType, DomainAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, InstanceDomainPrimarySetEventType, DomainPrimarySetEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, InstanceDomainRemovedEventType, DomainRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, InstanceAddedEventType, InstanceAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, InstanceChangedEventType, InstanceChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, InstanceRemovedEventType, InstanceRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, NotificationPolicyAddedEventType, NotificationPolicyAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, NotificationPolicyChangedEventType, NotificationPolicyChangedEventMapper) } diff --git a/internal/repository/keypair/eventstore.go b/internal/repository/keypair/eventstore.go index 8fde03134..7c4db2dfc 100644 --- a/internal/repository/keypair/eventstore.go +++ b/internal/repository/keypair/eventstore.go @@ -4,7 +4,7 @@ import ( "github.com/zitadel/zitadel/internal/eventstore" ) -func RegisterEventMappers(es *eventstore.Eventstore) { - es.RegisterFilterEventMapper(AggregateType, AddedEventType, AddedEventMapper) - es.RegisterFilterEventMapper(AggregateType, AddedCertificateEventType, AddedCertificateEventMapper) +func init() { + eventstore.RegisterFilterEventMapper(AggregateType, AddedEventType, AddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, AddedCertificateEventType, AddedCertificateEventMapper) } diff --git a/internal/repository/limits/eventstore.go b/internal/repository/limits/eventstore.go index 5c2ab16c4..3bbb604ee 100644 --- a/internal/repository/limits/eventstore.go +++ b/internal/repository/limits/eventstore.go @@ -4,7 +4,7 @@ import ( "github.com/zitadel/zitadel/internal/eventstore" ) -func RegisterEventMappers(es *eventstore.Eventstore) { - es.RegisterFilterEventMapper(AggregateType, SetEventType, SetEventMapper). - RegisterFilterEventMapper(AggregateType, ResetEventType, ResetEventMapper) +func init() { + eventstore.RegisterFilterEventMapper(AggregateType, SetEventType, SetEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, ResetEventType, ResetEventMapper) } diff --git a/internal/repository/milestone/eventstore.go b/internal/repository/milestone/eventstore.go index 4f82b0819..18b94d702 100644 --- a/internal/repository/milestone/eventstore.go +++ b/internal/repository/milestone/eventstore.go @@ -4,6 +4,6 @@ import ( "github.com/zitadel/zitadel/internal/eventstore" ) -func RegisterEventMappers(es *eventstore.Eventstore) { - es.RegisterFilterEventMapper(AggregateType, PushedEventType, PushedEventMapper) +func init() { + eventstore.RegisterFilterEventMapper(AggregateType, PushedEventType, PushedEventMapper) } diff --git a/internal/repository/oidcsession/eventstore.go b/internal/repository/oidcsession/eventstore.go index 091bcf5d4..4fe6f1abc 100644 --- a/internal/repository/oidcsession/eventstore.go +++ b/internal/repository/oidcsession/eventstore.go @@ -4,12 +4,12 @@ import ( "github.com/zitadel/zitadel/internal/eventstore" ) -func RegisterEventMappers(es *eventstore.Eventstore) { - es.RegisterFilterEventMapper(AggregateType, AddedType, eventstore.GenericEventMapper[AddedEvent]). - RegisterFilterEventMapper(AggregateType, AccessTokenAddedType, eventstore.GenericEventMapper[AccessTokenAddedEvent]). - RegisterFilterEventMapper(AggregateType, AccessTokenRevokedType, eventstore.GenericEventMapper[AccessTokenRevokedEvent]). - RegisterFilterEventMapper(AggregateType, RefreshTokenAddedType, eventstore.GenericEventMapper[RefreshTokenAddedEvent]). - RegisterFilterEventMapper(AggregateType, RefreshTokenRenewedType, eventstore.GenericEventMapper[RefreshTokenRenewedEvent]). - RegisterFilterEventMapper(AggregateType, RefreshTokenRevokedType, eventstore.GenericEventMapper[RefreshTokenRevokedEvent]) +func init() { + eventstore.RegisterFilterEventMapper(AggregateType, AddedType, eventstore.GenericEventMapper[AddedEvent]) + eventstore.RegisterFilterEventMapper(AggregateType, AccessTokenAddedType, eventstore.GenericEventMapper[AccessTokenAddedEvent]) + eventstore.RegisterFilterEventMapper(AggregateType, AccessTokenRevokedType, eventstore.GenericEventMapper[AccessTokenRevokedEvent]) + eventstore.RegisterFilterEventMapper(AggregateType, RefreshTokenAddedType, eventstore.GenericEventMapper[RefreshTokenAddedEvent]) + eventstore.RegisterFilterEventMapper(AggregateType, RefreshTokenRenewedType, eventstore.GenericEventMapper[RefreshTokenRenewedEvent]) + eventstore.RegisterFilterEventMapper(AggregateType, RefreshTokenRevokedType, eventstore.GenericEventMapper[RefreshTokenRevokedEvent]) } diff --git a/internal/repository/org/eventstore.go b/internal/repository/org/eventstore.go index ca24c58f9..d1efa75df 100644 --- a/internal/repository/org/eventstore.go +++ b/internal/repository/org/eventstore.go @@ -4,114 +4,114 @@ import ( "github.com/zitadel/zitadel/internal/eventstore" ) -func RegisterEventMappers(es *eventstore.Eventstore) { - es.RegisterFilterEventMapper(AggregateType, OrgAddedEventType, OrgAddedEventMapper). - RegisterFilterEventMapper(AggregateType, OrgChangedEventType, OrgChangedEventMapper). - RegisterFilterEventMapper(AggregateType, OrgDeactivatedEventType, OrgDeactivatedEventMapper). - RegisterFilterEventMapper(AggregateType, OrgReactivatedEventType, OrgReactivatedEventMapper). - RegisterFilterEventMapper(AggregateType, OrgRemovedEventType, OrgRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, OrgDomainAddedEventType, DomainAddedEventMapper). - RegisterFilterEventMapper(AggregateType, OrgDomainVerificationAddedEventType, DomainVerificationAddedEventMapper). - RegisterFilterEventMapper(AggregateType, OrgDomainVerificationFailedEventType, DomainVerificationFailedEventMapper). - RegisterFilterEventMapper(AggregateType, OrgDomainVerifiedEventType, DomainVerifiedEventMapper). - RegisterFilterEventMapper(AggregateType, OrgDomainPrimarySetEventType, DomainPrimarySetEventMapper). - RegisterFilterEventMapper(AggregateType, OrgDomainRemovedEventType, DomainRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, MemberAddedEventType, MemberAddedEventMapper). - RegisterFilterEventMapper(AggregateType, MemberChangedEventType, MemberChangedEventMapper). - RegisterFilterEventMapper(AggregateType, MemberRemovedEventType, MemberRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, MemberCascadeRemovedEventType, MemberCascadeRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, LabelPolicyAddedEventType, LabelPolicyAddedEventMapper). - RegisterFilterEventMapper(AggregateType, LabelPolicyChangedEventType, LabelPolicyChangedEventMapper). - RegisterFilterEventMapper(AggregateType, LabelPolicyActivatedEventType, LabelPolicyActivatedEventMapper). - RegisterFilterEventMapper(AggregateType, LabelPolicyRemovedEventType, LabelPolicyRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, LabelPolicyLogoAddedEventType, LabelPolicyLogoAddedEventMapper). - RegisterFilterEventMapper(AggregateType, LabelPolicyLogoRemovedEventType, LabelPolicyLogoRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, LabelPolicyIconAddedEventType, LabelPolicyIconAddedEventMapper). - RegisterFilterEventMapper(AggregateType, LabelPolicyIconRemovedEventType, LabelPolicyIconRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, LabelPolicyLogoDarkAddedEventType, LabelPolicyLogoDarkAddedEventMapper). - RegisterFilterEventMapper(AggregateType, LabelPolicyLogoDarkRemovedEventType, LabelPolicyLogoDarkRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, LabelPolicyIconDarkAddedEventType, LabelPolicyIconDarkAddedEventMapper). - RegisterFilterEventMapper(AggregateType, LabelPolicyIconDarkRemovedEventType, LabelPolicyIconDarkRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, LabelPolicyFontAddedEventType, LabelPolicyFontAddedEventMapper). - RegisterFilterEventMapper(AggregateType, LabelPolicyFontRemovedEventType, LabelPolicyFontRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, LabelPolicyAssetsRemovedEventType, LabelPolicyAssetsRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, LoginPolicyAddedEventType, LoginPolicyAddedEventMapper). - RegisterFilterEventMapper(AggregateType, LoginPolicyChangedEventType, LoginPolicyChangedEventMapper). - RegisterFilterEventMapper(AggregateType, LoginPolicyRemovedEventType, LoginPolicyRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, LoginPolicySecondFactorAddedEventType, SecondFactorAddedEventEventMapper). - RegisterFilterEventMapper(AggregateType, LoginPolicySecondFactorRemovedEventType, SecondFactorRemovedEventEventMapper). - RegisterFilterEventMapper(AggregateType, LoginPolicyMultiFactorAddedEventType, MultiFactorAddedEventEventMapper). - RegisterFilterEventMapper(AggregateType, LoginPolicyMultiFactorRemovedEventType, MultiFactorRemovedEventEventMapper). - RegisterFilterEventMapper(AggregateType, LoginPolicyIDPProviderAddedEventType, IdentityProviderAddedEventMapper). - RegisterFilterEventMapper(AggregateType, LoginPolicyIDPProviderRemovedEventType, IdentityProviderRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, LoginPolicyIDPProviderCascadeRemovedEventType, IdentityProviderCascadeRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, DomainPolicyAddedEventType, DomainPolicyAddedEventMapper). - RegisterFilterEventMapper(AggregateType, DomainPolicyChangedEventType, DomainPolicyChangedEventMapper). - RegisterFilterEventMapper(AggregateType, DomainPolicyRemovedEventType, DomainPolicyRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, PasswordAgePolicyAddedEventType, PasswordAgePolicyAddedEventMapper). - RegisterFilterEventMapper(AggregateType, PasswordAgePolicyChangedEventType, PasswordAgePolicyChangedEventMapper). - RegisterFilterEventMapper(AggregateType, PasswordAgePolicyRemovedEventType, PasswordAgePolicyRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, PasswordComplexityPolicyAddedEventType, PasswordComplexityPolicyAddedEventMapper). - RegisterFilterEventMapper(AggregateType, PasswordComplexityPolicyChangedEventType, PasswordComplexityPolicyChangedEventMapper). - RegisterFilterEventMapper(AggregateType, PasswordComplexityPolicyRemovedEventType, PasswordComplexityPolicyRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, LockoutPolicyAddedEventType, LockoutPolicyAddedEventMapper). - RegisterFilterEventMapper(AggregateType, LockoutPolicyChangedEventType, LockoutPolicyChangedEventMapper). - RegisterFilterEventMapper(AggregateType, LockoutPolicyRemovedEventType, LockoutPolicyRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, PrivacyPolicyAddedEventType, PrivacyPolicyAddedEventMapper). - RegisterFilterEventMapper(AggregateType, PrivacyPolicyChangedEventType, PrivacyPolicyChangedEventMapper). - RegisterFilterEventMapper(AggregateType, PrivacyPolicyRemovedEventType, PrivacyPolicyRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, MailTemplateAddedEventType, MailTemplateAddedEventMapper). - RegisterFilterEventMapper(AggregateType, MailTemplateChangedEventType, MailTemplateChangedEventMapper). - RegisterFilterEventMapper(AggregateType, MailTemplateRemovedEventType, MailTemplateRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, MailTextAddedEventType, MailTextAddedEventMapper). - RegisterFilterEventMapper(AggregateType, MailTextChangedEventType, MailTextChangedEventMapper). - RegisterFilterEventMapper(AggregateType, MailTextRemovedEventType, MailTextRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, CustomTextSetEventType, CustomTextSetEventMapper). - RegisterFilterEventMapper(AggregateType, CustomTextRemovedEventType, CustomTextRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, CustomTextTemplateRemovedEventType, CustomTextTemplateRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, IDPConfigAddedEventType, IDPConfigAddedEventMapper). - RegisterFilterEventMapper(AggregateType, IDPConfigChangedEventType, IDPConfigChangedEventMapper). - RegisterFilterEventMapper(AggregateType, IDPConfigRemovedEventType, IDPConfigRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, IDPConfigDeactivatedEventType, IDPConfigDeactivatedEventMapper). - RegisterFilterEventMapper(AggregateType, IDPConfigReactivatedEventType, IDPConfigReactivatedEventMapper). - RegisterFilterEventMapper(AggregateType, IDPOIDCConfigAddedEventType, IDPOIDCConfigAddedEventMapper). - RegisterFilterEventMapper(AggregateType, IDPOIDCConfigChangedEventType, IDPOIDCConfigChangedEventMapper). - RegisterFilterEventMapper(AggregateType, IDPJWTConfigAddedEventType, IDPJWTConfigAddedEventMapper). - RegisterFilterEventMapper(AggregateType, IDPJWTConfigChangedEventType, IDPJWTConfigChangedEventMapper). - RegisterFilterEventMapper(AggregateType, OAuthIDPAddedEventType, OAuthIDPAddedEventMapper). - RegisterFilterEventMapper(AggregateType, OAuthIDPChangedEventType, OAuthIDPChangedEventMapper). - RegisterFilterEventMapper(AggregateType, OIDCIDPAddedEventType, OIDCIDPAddedEventMapper). - RegisterFilterEventMapper(AggregateType, OIDCIDPChangedEventType, OIDCIDPChangedEventMapper). - RegisterFilterEventMapper(AggregateType, OIDCIDPMigratedAzureADEventType, OIDCIDPMigratedAzureADEventMapper). - RegisterFilterEventMapper(AggregateType, OIDCIDPMigratedGoogleEventType, OIDCIDPMigratedGoogleEventMapper). - RegisterFilterEventMapper(AggregateType, JWTIDPAddedEventType, JWTIDPAddedEventMapper). - RegisterFilterEventMapper(AggregateType, JWTIDPChangedEventType, JWTIDPChangedEventMapper). - RegisterFilterEventMapper(AggregateType, AzureADIDPAddedEventType, AzureADIDPAddedEventMapper). - RegisterFilterEventMapper(AggregateType, AzureADIDPChangedEventType, AzureADIDPChangedEventMapper). - RegisterFilterEventMapper(AggregateType, GitHubIDPAddedEventType, GitHubIDPAddedEventMapper). - RegisterFilterEventMapper(AggregateType, GitHubIDPChangedEventType, GitHubIDPChangedEventMapper). - RegisterFilterEventMapper(AggregateType, GitHubEnterpriseIDPAddedEventType, GitHubEnterpriseIDPAddedEventMapper). - RegisterFilterEventMapper(AggregateType, GitHubEnterpriseIDPChangedEventType, GitHubEnterpriseIDPChangedEventMapper). - RegisterFilterEventMapper(AggregateType, GitLabIDPAddedEventType, GitLabIDPAddedEventMapper). - RegisterFilterEventMapper(AggregateType, GitLabIDPChangedEventType, GitLabIDPChangedEventMapper). - RegisterFilterEventMapper(AggregateType, GitLabSelfHostedIDPAddedEventType, GitLabSelfHostedIDPAddedEventMapper). - RegisterFilterEventMapper(AggregateType, GitLabSelfHostedIDPChangedEventType, GitLabSelfHostedIDPChangedEventMapper). - RegisterFilterEventMapper(AggregateType, GoogleIDPAddedEventType, GoogleIDPAddedEventMapper). - RegisterFilterEventMapper(AggregateType, GoogleIDPChangedEventType, GoogleIDPChangedEventMapper). - RegisterFilterEventMapper(AggregateType, LDAPIDPAddedEventType, LDAPIDPAddedEventMapper). - RegisterFilterEventMapper(AggregateType, LDAPIDPChangedEventType, LDAPIDPChangedEventMapper). - RegisterFilterEventMapper(AggregateType, AppleIDPAddedEventType, AppleIDPAddedEventMapper). - RegisterFilterEventMapper(AggregateType, AppleIDPChangedEventType, AppleIDPChangedEventMapper). - RegisterFilterEventMapper(AggregateType, SAMLIDPAddedEventType, SAMLIDPAddedEventMapper). - RegisterFilterEventMapper(AggregateType, SAMLIDPChangedEventType, SAMLIDPChangedEventMapper). - RegisterFilterEventMapper(AggregateType, IDPRemovedEventType, IDPRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, TriggerActionsSetEventType, TriggerActionsSetEventMapper). - RegisterFilterEventMapper(AggregateType, TriggerActionsCascadeRemovedEventType, TriggerActionsCascadeRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, FlowClearedEventType, FlowClearedEventMapper). - RegisterFilterEventMapper(AggregateType, MetadataSetType, MetadataSetEventMapper). - RegisterFilterEventMapper(AggregateType, MetadataRemovedType, MetadataRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, MetadataRemovedAllType, MetadataRemovedAllEventMapper). - RegisterFilterEventMapper(AggregateType, NotificationPolicyAddedEventType, NotificationPolicyAddedEventMapper). - RegisterFilterEventMapper(AggregateType, NotificationPolicyChangedEventType, NotificationPolicyChangedEventMapper). - RegisterFilterEventMapper(AggregateType, NotificationPolicyRemovedEventType, NotificationPolicyRemovedEventMapper) +func init() { + eventstore.RegisterFilterEventMapper(AggregateType, OrgAddedEventType, OrgAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, OrgChangedEventType, OrgChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, OrgDeactivatedEventType, OrgDeactivatedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, OrgReactivatedEventType, OrgReactivatedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, OrgRemovedEventType, OrgRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, OrgDomainAddedEventType, DomainAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, OrgDomainVerificationAddedEventType, DomainVerificationAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, OrgDomainVerificationFailedEventType, DomainVerificationFailedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, OrgDomainVerifiedEventType, DomainVerifiedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, OrgDomainPrimarySetEventType, DomainPrimarySetEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, OrgDomainRemovedEventType, DomainRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MemberAddedEventType, MemberAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MemberChangedEventType, MemberChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MemberRemovedEventType, MemberRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MemberCascadeRemovedEventType, MemberCascadeRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LabelPolicyAddedEventType, LabelPolicyAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LabelPolicyChangedEventType, LabelPolicyChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LabelPolicyActivatedEventType, LabelPolicyActivatedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LabelPolicyRemovedEventType, LabelPolicyRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LabelPolicyLogoAddedEventType, LabelPolicyLogoAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LabelPolicyLogoRemovedEventType, LabelPolicyLogoRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LabelPolicyIconAddedEventType, LabelPolicyIconAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LabelPolicyIconRemovedEventType, LabelPolicyIconRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LabelPolicyLogoDarkAddedEventType, LabelPolicyLogoDarkAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LabelPolicyLogoDarkRemovedEventType, LabelPolicyLogoDarkRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LabelPolicyIconDarkAddedEventType, LabelPolicyIconDarkAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LabelPolicyIconDarkRemovedEventType, LabelPolicyIconDarkRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LabelPolicyFontAddedEventType, LabelPolicyFontAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LabelPolicyFontRemovedEventType, LabelPolicyFontRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LabelPolicyAssetsRemovedEventType, LabelPolicyAssetsRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LoginPolicyAddedEventType, LoginPolicyAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LoginPolicyChangedEventType, LoginPolicyChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LoginPolicyRemovedEventType, LoginPolicyRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LoginPolicySecondFactorAddedEventType, SecondFactorAddedEventEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LoginPolicySecondFactorRemovedEventType, SecondFactorRemovedEventEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LoginPolicyMultiFactorAddedEventType, MultiFactorAddedEventEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LoginPolicyMultiFactorRemovedEventType, MultiFactorRemovedEventEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LoginPolicyIDPProviderAddedEventType, IdentityProviderAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LoginPolicyIDPProviderRemovedEventType, IdentityProviderRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LoginPolicyIDPProviderCascadeRemovedEventType, IdentityProviderCascadeRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, DomainPolicyAddedEventType, DomainPolicyAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, DomainPolicyChangedEventType, DomainPolicyChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, DomainPolicyRemovedEventType, DomainPolicyRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, PasswordAgePolicyAddedEventType, PasswordAgePolicyAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, PasswordAgePolicyChangedEventType, PasswordAgePolicyChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, PasswordAgePolicyRemovedEventType, PasswordAgePolicyRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, PasswordComplexityPolicyAddedEventType, PasswordComplexityPolicyAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, PasswordComplexityPolicyChangedEventType, PasswordComplexityPolicyChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, PasswordComplexityPolicyRemovedEventType, PasswordComplexityPolicyRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LockoutPolicyAddedEventType, LockoutPolicyAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LockoutPolicyChangedEventType, LockoutPolicyChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LockoutPolicyRemovedEventType, LockoutPolicyRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, PrivacyPolicyAddedEventType, PrivacyPolicyAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, PrivacyPolicyChangedEventType, PrivacyPolicyChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, PrivacyPolicyRemovedEventType, PrivacyPolicyRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MailTemplateAddedEventType, MailTemplateAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MailTemplateChangedEventType, MailTemplateChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MailTemplateRemovedEventType, MailTemplateRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MailTextAddedEventType, MailTextAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MailTextChangedEventType, MailTextChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MailTextRemovedEventType, MailTextRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, CustomTextSetEventType, CustomTextSetEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, CustomTextRemovedEventType, CustomTextRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, CustomTextTemplateRemovedEventType, CustomTextTemplateRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, IDPConfigAddedEventType, IDPConfigAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, IDPConfigChangedEventType, IDPConfigChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, IDPConfigRemovedEventType, IDPConfigRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, IDPConfigDeactivatedEventType, IDPConfigDeactivatedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, IDPConfigReactivatedEventType, IDPConfigReactivatedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, IDPOIDCConfigAddedEventType, IDPOIDCConfigAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, IDPOIDCConfigChangedEventType, IDPOIDCConfigChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, IDPJWTConfigAddedEventType, IDPJWTConfigAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, IDPJWTConfigChangedEventType, IDPJWTConfigChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, OAuthIDPAddedEventType, OAuthIDPAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, OAuthIDPChangedEventType, OAuthIDPChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, OIDCIDPAddedEventType, OIDCIDPAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, OIDCIDPChangedEventType, OIDCIDPChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, OIDCIDPMigratedAzureADEventType, OIDCIDPMigratedAzureADEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, OIDCIDPMigratedGoogleEventType, OIDCIDPMigratedGoogleEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, JWTIDPAddedEventType, JWTIDPAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, JWTIDPChangedEventType, JWTIDPChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, AzureADIDPAddedEventType, AzureADIDPAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, AzureADIDPChangedEventType, AzureADIDPChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, GitHubIDPAddedEventType, GitHubIDPAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, GitHubIDPChangedEventType, GitHubIDPChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, GitHubEnterpriseIDPAddedEventType, GitHubEnterpriseIDPAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, GitHubEnterpriseIDPChangedEventType, GitHubEnterpriseIDPChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, GitLabIDPAddedEventType, GitLabIDPAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, GitLabIDPChangedEventType, GitLabIDPChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, GitLabSelfHostedIDPAddedEventType, GitLabSelfHostedIDPAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, GitLabSelfHostedIDPChangedEventType, GitLabSelfHostedIDPChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, GoogleIDPAddedEventType, GoogleIDPAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, GoogleIDPChangedEventType, GoogleIDPChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LDAPIDPAddedEventType, LDAPIDPAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LDAPIDPChangedEventType, LDAPIDPChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, AppleIDPAddedEventType, AppleIDPAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, AppleIDPChangedEventType, AppleIDPChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, SAMLIDPAddedEventType, SAMLIDPAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, SAMLIDPChangedEventType, SAMLIDPChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, IDPRemovedEventType, IDPRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, TriggerActionsSetEventType, TriggerActionsSetEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, TriggerActionsCascadeRemovedEventType, TriggerActionsCascadeRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, FlowClearedEventType, FlowClearedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MetadataSetType, MetadataSetEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MetadataRemovedType, MetadataRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MetadataRemovedAllType, MetadataRemovedAllEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, NotificationPolicyAddedEventType, NotificationPolicyAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, NotificationPolicyChangedEventType, NotificationPolicyChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, NotificationPolicyRemovedEventType, NotificationPolicyRemovedEventMapper) } diff --git a/internal/repository/project/eventstore.go b/internal/repository/project/eventstore.go index 41afbd31a..6e9bccbd3 100644 --- a/internal/repository/project/eventstore.go +++ b/internal/repository/project/eventstore.go @@ -4,44 +4,44 @@ import ( "github.com/zitadel/zitadel/internal/eventstore" ) -func RegisterEventMappers(es *eventstore.Eventstore) { - es.RegisterFilterEventMapper(AggregateType, ProjectAddedType, ProjectAddedEventMapper). - RegisterFilterEventMapper(AggregateType, ProjectChangedType, ProjectChangeEventMapper). - RegisterFilterEventMapper(AggregateType, ProjectDeactivatedType, ProjectDeactivatedEventMapper). - RegisterFilterEventMapper(AggregateType, ProjectReactivatedType, ProjectReactivatedEventMapper). - RegisterFilterEventMapper(AggregateType, ProjectRemovedType, ProjectRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, MemberAddedType, MemberAddedEventMapper). - RegisterFilterEventMapper(AggregateType, MemberChangedType, MemberChangedEventMapper). - RegisterFilterEventMapper(AggregateType, MemberRemovedType, MemberRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, MemberCascadeRemovedType, MemberCascadeRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, RoleAddedType, RoleAddedEventMapper). - RegisterFilterEventMapper(AggregateType, RoleChangedType, RoleChangedEventMapper). - RegisterFilterEventMapper(AggregateType, RoleRemovedType, RoleRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, GrantAddedType, GrantAddedEventMapper). - RegisterFilterEventMapper(AggregateType, GrantChangedType, GrantChangedEventMapper). - RegisterFilterEventMapper(AggregateType, GrantCascadeChangedType, GrantCascadeChangedEventMapper). - RegisterFilterEventMapper(AggregateType, GrantDeactivatedType, GrantDeactivateEventMapper). - RegisterFilterEventMapper(AggregateType, GrantReactivatedType, GrantReactivatedEventMapper). - RegisterFilterEventMapper(AggregateType, GrantRemovedType, GrantRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, GrantMemberAddedType, GrantMemberAddedEventMapper). - RegisterFilterEventMapper(AggregateType, GrantMemberChangedType, GrantMemberChangedEventMapper). - RegisterFilterEventMapper(AggregateType, GrantMemberRemovedType, GrantMemberRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, GrantMemberCascadeRemovedType, GrantMemberCascadeRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, ApplicationAddedType, ApplicationAddedEventMapper). - RegisterFilterEventMapper(AggregateType, ApplicationChangedType, ApplicationChangedEventMapper). - RegisterFilterEventMapper(AggregateType, ApplicationRemovedType, ApplicationRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, ApplicationDeactivatedType, ApplicationDeactivatedEventMapper). - RegisterFilterEventMapper(AggregateType, ApplicationReactivatedType, ApplicationReactivatedEventMapper). - RegisterFilterEventMapper(AggregateType, OIDCConfigAddedType, OIDCConfigAddedEventMapper). - RegisterFilterEventMapper(AggregateType, OIDCConfigChangedType, OIDCConfigChangedEventMapper). - RegisterFilterEventMapper(AggregateType, OIDCConfigSecretChangedType, OIDCConfigSecretChangedEventMapper). - RegisterFilterEventMapper(AggregateType, OIDCClientSecretCheckSucceededType, OIDCConfigSecretCheckSucceededEventMapper). - RegisterFilterEventMapper(AggregateType, OIDCClientSecretCheckFailedType, OIDCConfigSecretCheckFailedEventMapper). - RegisterFilterEventMapper(AggregateType, APIConfigAddedType, APIConfigAddedEventMapper). - RegisterFilterEventMapper(AggregateType, APIConfigChangedType, APIConfigChangedEventMapper). - RegisterFilterEventMapper(AggregateType, APIConfigSecretChangedType, APIConfigSecretChangedEventMapper). - RegisterFilterEventMapper(AggregateType, ApplicationKeyAddedEventType, ApplicationKeyAddedEventMapper). - RegisterFilterEventMapper(AggregateType, ApplicationKeyRemovedEventType, ApplicationKeyRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, SAMLConfigAddedType, SAMLConfigAddedEventMapper). - RegisterFilterEventMapper(AggregateType, SAMLConfigChangedType, SAMLConfigChangedEventMapper) +func init() { + eventstore.RegisterFilterEventMapper(AggregateType, ProjectAddedType, ProjectAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, ProjectChangedType, ProjectChangeEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, ProjectDeactivatedType, ProjectDeactivatedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, ProjectReactivatedType, ProjectReactivatedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, ProjectRemovedType, ProjectRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MemberAddedType, MemberAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MemberChangedType, MemberChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MemberRemovedType, MemberRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MemberCascadeRemovedType, MemberCascadeRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, RoleAddedType, RoleAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, RoleChangedType, RoleChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, RoleRemovedType, RoleRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, GrantAddedType, GrantAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, GrantChangedType, GrantChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, GrantCascadeChangedType, GrantCascadeChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, GrantDeactivatedType, GrantDeactivateEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, GrantReactivatedType, GrantReactivatedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, GrantRemovedType, GrantRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, GrantMemberAddedType, GrantMemberAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, GrantMemberChangedType, GrantMemberChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, GrantMemberRemovedType, GrantMemberRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, GrantMemberCascadeRemovedType, GrantMemberCascadeRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, ApplicationAddedType, ApplicationAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, ApplicationChangedType, ApplicationChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, ApplicationRemovedType, ApplicationRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, ApplicationDeactivatedType, ApplicationDeactivatedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, ApplicationReactivatedType, ApplicationReactivatedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, OIDCConfigAddedType, OIDCConfigAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, OIDCConfigChangedType, OIDCConfigChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, OIDCConfigSecretChangedType, OIDCConfigSecretChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, OIDCClientSecretCheckSucceededType, OIDCConfigSecretCheckSucceededEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, OIDCClientSecretCheckFailedType, OIDCConfigSecretCheckFailedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, APIConfigAddedType, APIConfigAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, APIConfigChangedType, APIConfigChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, APIConfigSecretChangedType, APIConfigSecretChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, ApplicationKeyAddedEventType, ApplicationKeyAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, ApplicationKeyRemovedEventType, ApplicationKeyRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, SAMLConfigAddedType, SAMLConfigAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, SAMLConfigChangedType, SAMLConfigChangedEventMapper) } diff --git a/internal/repository/quota/eventstore.go b/internal/repository/quota/eventstore.go index f651e58e2..bf31c3e56 100644 --- a/internal/repository/quota/eventstore.go +++ b/internal/repository/quota/eventstore.go @@ -4,13 +4,13 @@ import ( "github.com/zitadel/zitadel/internal/eventstore" ) -func RegisterEventMappers(es *eventstore.Eventstore) { +func init() { // AddedEventType is not emitted anymore. // For ease of use, old events are directly mapped to SetEvent. // This works, because the data structures are compatible. - es.RegisterFilterEventMapper(AggregateType, AddedEventType, SetEventMapper). - RegisterFilterEventMapper(AggregateType, SetEventType, SetEventMapper). - RegisterFilterEventMapper(AggregateType, RemovedEventType, RemovedEventMapper). - RegisterFilterEventMapper(AggregateType, NotificationDueEventType, NotificationDueEventMapper). - RegisterFilterEventMapper(AggregateType, NotifiedEventType, NotifiedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, AddedEventType, SetEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, SetEventType, SetEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, RemovedEventType, RemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, NotificationDueEventType, NotificationDueEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, NotifiedEventType, NotifiedEventMapper) } diff --git a/internal/repository/restrictions/eventstore.go b/internal/repository/restrictions/eventstore.go index b1633244d..ee72d3dc4 100644 --- a/internal/repository/restrictions/eventstore.go +++ b/internal/repository/restrictions/eventstore.go @@ -4,6 +4,6 @@ import ( "github.com/zitadel/zitadel/internal/eventstore" ) -func RegisterEventMappers(es *eventstore.Eventstore) { - es.RegisterFilterEventMapper(AggregateType, SetEventType, SetEventMapper) +func init() { + eventstore.RegisterFilterEventMapper(AggregateType, SetEventType, SetEventMapper) } diff --git a/internal/repository/session/eventstore.go b/internal/repository/session/eventstore.go index ccd95d666..40384743d 100644 --- a/internal/repository/session/eventstore.go +++ b/internal/repository/session/eventstore.go @@ -2,22 +2,22 @@ package session import "github.com/zitadel/zitadel/internal/eventstore" -func RegisterEventMappers(es *eventstore.Eventstore) { - es.RegisterFilterEventMapper(AggregateType, AddedType, AddedEventMapper). - RegisterFilterEventMapper(AggregateType, UserCheckedType, UserCheckedEventMapper). - RegisterFilterEventMapper(AggregateType, PasswordCheckedType, PasswordCheckedEventMapper). - RegisterFilterEventMapper(AggregateType, IntentCheckedType, IntentCheckedEventMapper). - RegisterFilterEventMapper(AggregateType, WebAuthNChallengedType, eventstore.GenericEventMapper[WebAuthNChallengedEvent]). - RegisterFilterEventMapper(AggregateType, WebAuthNCheckedType, eventstore.GenericEventMapper[WebAuthNCheckedEvent]). - RegisterFilterEventMapper(AggregateType, TOTPCheckedType, eventstore.GenericEventMapper[TOTPCheckedEvent]). - RegisterFilterEventMapper(AggregateType, OTPSMSChallengedType, eventstore.GenericEventMapper[OTPSMSChallengedEvent]). - RegisterFilterEventMapper(AggregateType, OTPSMSSentType, eventstore.GenericEventMapper[OTPSMSSentEvent]). - RegisterFilterEventMapper(AggregateType, OTPSMSCheckedType, eventstore.GenericEventMapper[OTPSMSCheckedEvent]). - RegisterFilterEventMapper(AggregateType, OTPEmailChallengedType, eventstore.GenericEventMapper[OTPEmailChallengedEvent]). - RegisterFilterEventMapper(AggregateType, OTPEmailSentType, eventstore.GenericEventMapper[OTPEmailSentEvent]). - RegisterFilterEventMapper(AggregateType, OTPEmailCheckedType, eventstore.GenericEventMapper[OTPEmailCheckedEvent]). - RegisterFilterEventMapper(AggregateType, TokenSetType, TokenSetEventMapper). - RegisterFilterEventMapper(AggregateType, MetadataSetType, MetadataSetEventMapper). - RegisterFilterEventMapper(AggregateType, LifetimeSetType, eventstore.GenericEventMapper[LifetimeSetEvent]). - RegisterFilterEventMapper(AggregateType, TerminateType, TerminateEventMapper) +func init() { + eventstore.RegisterFilterEventMapper(AggregateType, AddedType, AddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserCheckedType, UserCheckedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, PasswordCheckedType, PasswordCheckedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, IntentCheckedType, IntentCheckedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, WebAuthNChallengedType, eventstore.GenericEventMapper[WebAuthNChallengedEvent]) + eventstore.RegisterFilterEventMapper(AggregateType, WebAuthNCheckedType, eventstore.GenericEventMapper[WebAuthNCheckedEvent]) + eventstore.RegisterFilterEventMapper(AggregateType, TOTPCheckedType, eventstore.GenericEventMapper[TOTPCheckedEvent]) + eventstore.RegisterFilterEventMapper(AggregateType, OTPSMSChallengedType, eventstore.GenericEventMapper[OTPSMSChallengedEvent]) + eventstore.RegisterFilterEventMapper(AggregateType, OTPSMSSentType, eventstore.GenericEventMapper[OTPSMSSentEvent]) + eventstore.RegisterFilterEventMapper(AggregateType, OTPSMSCheckedType, eventstore.GenericEventMapper[OTPSMSCheckedEvent]) + eventstore.RegisterFilterEventMapper(AggregateType, OTPEmailChallengedType, eventstore.GenericEventMapper[OTPEmailChallengedEvent]) + eventstore.RegisterFilterEventMapper(AggregateType, OTPEmailSentType, eventstore.GenericEventMapper[OTPEmailSentEvent]) + eventstore.RegisterFilterEventMapper(AggregateType, OTPEmailCheckedType, eventstore.GenericEventMapper[OTPEmailCheckedEvent]) + eventstore.RegisterFilterEventMapper(AggregateType, TokenSetType, TokenSetEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MetadataSetType, MetadataSetEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, LifetimeSetType, eventstore.GenericEventMapper[LifetimeSetEvent]) + eventstore.RegisterFilterEventMapper(AggregateType, TerminateType, TerminateEventMapper) } diff --git a/internal/repository/user/eventstore.go b/internal/repository/user/eventstore.go index 289d8af40..e326a3fdd 100644 --- a/internal/repository/user/eventstore.go +++ b/internal/repository/user/eventstore.go @@ -4,134 +4,134 @@ import ( "github.com/zitadel/zitadel/internal/eventstore" ) -func RegisterEventMappers(es *eventstore.Eventstore) { - es.RegisterFilterEventMapper(AggregateType, UserV1AddedType, HumanAddedEventMapper). - RegisterFilterEventMapper(AggregateType, UserV1RegisteredType, HumanRegisteredEventMapper). - RegisterFilterEventMapper(AggregateType, UserV1InitialCodeAddedType, HumanInitialCodeAddedEventMapper). - RegisterFilterEventMapper(AggregateType, UserV1InitialCodeSentType, HumanInitialCodeSentEventMapper). - RegisterFilterEventMapper(AggregateType, UserV1InitializedCheckSucceededType, HumanInitializedCheckSucceededEventMapper). - RegisterFilterEventMapper(AggregateType, UserV1InitializedCheckFailedType, HumanInitializedCheckFailedEventMapper). - RegisterFilterEventMapper(AggregateType, UserV1SignedOutType, HumanSignedOutEventMapper). - RegisterFilterEventMapper(AggregateType, UserV1PasswordChangedType, HumanPasswordChangedEventMapper). - RegisterFilterEventMapper(AggregateType, UserV1PasswordCodeAddedType, HumanPasswordCodeAddedEventMapper). - RegisterFilterEventMapper(AggregateType, UserV1PasswordCodeSentType, HumanPasswordCodeSentEventMapper). - RegisterFilterEventMapper(AggregateType, UserV1PasswordCheckSucceededType, HumanPasswordCheckSucceededEventMapper). - RegisterFilterEventMapper(AggregateType, UserV1PasswordCheckFailedType, HumanPasswordCheckFailedEventMapper). - RegisterFilterEventMapper(AggregateType, UserV1EmailChangedType, HumanEmailChangedEventMapper). - RegisterFilterEventMapper(AggregateType, UserV1EmailVerifiedType, HumanEmailVerifiedEventMapper). - RegisterFilterEventMapper(AggregateType, UserV1EmailVerificationFailedType, HumanEmailVerificationFailedEventMapper). - RegisterFilterEventMapper(AggregateType, UserV1EmailCodeAddedType, HumanEmailCodeAddedEventMapper). - RegisterFilterEventMapper(AggregateType, UserV1EmailCodeSentType, HumanEmailCodeSentEventMapper). - RegisterFilterEventMapper(AggregateType, UserV1PhoneChangedType, HumanPhoneChangedEventMapper). - RegisterFilterEventMapper(AggregateType, UserV1PhoneRemovedType, HumanPhoneRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, UserV1PhoneVerifiedType, HumanPhoneVerifiedEventMapper). - RegisterFilterEventMapper(AggregateType, UserV1PhoneVerificationFailedType, HumanPhoneVerificationFailedEventMapper). - RegisterFilterEventMapper(AggregateType, UserV1PhoneCodeAddedType, HumanPhoneCodeAddedEventMapper). - RegisterFilterEventMapper(AggregateType, UserV1PhoneCodeSentType, HumanPhoneCodeSentEventMapper). - RegisterFilterEventMapper(AggregateType, UserV1ProfileChangedType, HumanProfileChangedEventMapper). - RegisterFilterEventMapper(AggregateType, UserV1AddressChangedType, HumanAddressChangedEventMapper). - RegisterFilterEventMapper(AggregateType, UserV1MFAInitSkippedType, HumanMFAInitSkippedEventMapper). - RegisterFilterEventMapper(AggregateType, UserV1MFAOTPAddedType, HumanOTPAddedEventMapper). - RegisterFilterEventMapper(AggregateType, UserV1MFAOTPVerifiedType, HumanOTPVerifiedEventMapper). - RegisterFilterEventMapper(AggregateType, UserV1MFAOTPRemovedType, HumanOTPRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, UserV1MFAOTPCheckSucceededType, HumanOTPCheckSucceededEventMapper). - RegisterFilterEventMapper(AggregateType, UserV1MFAOTPCheckFailedType, HumanOTPCheckFailedEventMapper). - RegisterFilterEventMapper(AggregateType, UserLockedType, UserLockedEventMapper). - RegisterFilterEventMapper(AggregateType, UserUnlockedType, UserUnlockedEventMapper). - RegisterFilterEventMapper(AggregateType, UserDeactivatedType, UserDeactivatedEventMapper). - RegisterFilterEventMapper(AggregateType, UserReactivatedType, UserReactivatedEventMapper). - RegisterFilterEventMapper(AggregateType, UserRemovedType, UserRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, UserTokenAddedType, UserTokenAddedEventMapper). - RegisterFilterEventMapper(AggregateType, UserTokenRemovedType, UserTokenRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, UserDomainClaimedType, DomainClaimedEventMapper). - RegisterFilterEventMapper(AggregateType, UserDomainClaimedSentType, DomainClaimedSentEventMapper). - RegisterFilterEventMapper(AggregateType, UserUserNameChangedType, UsernameChangedEventMapper). - RegisterFilterEventMapper(AggregateType, MetadataSetType, MetadataSetEventMapper). - RegisterFilterEventMapper(AggregateType, MetadataRemovedType, MetadataRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, MetadataRemovedAllType, MetadataRemovedAllEventMapper). - RegisterFilterEventMapper(AggregateType, HumanAddedType, HumanAddedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanRegisteredType, HumanRegisteredEventMapper). - RegisterFilterEventMapper(AggregateType, HumanInitialCodeAddedType, HumanInitialCodeAddedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanInitialCodeSentType, HumanInitialCodeSentEventMapper). - RegisterFilterEventMapper(AggregateType, HumanInitializedCheckSucceededType, HumanInitializedCheckSucceededEventMapper). - RegisterFilterEventMapper(AggregateType, HumanInitializedCheckFailedType, HumanInitializedCheckFailedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanSignedOutType, HumanSignedOutEventMapper). - RegisterFilterEventMapper(AggregateType, HumanPasswordChangedType, HumanPasswordChangedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanPasswordCodeAddedType, HumanPasswordCodeAddedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanPasswordCodeSentType, HumanPasswordCodeSentEventMapper). - RegisterFilterEventMapper(AggregateType, HumanPasswordChangeSentType, HumanPasswordChangeSentEventMapper). - RegisterFilterEventMapper(AggregateType, HumanPasswordCheckSucceededType, HumanPasswordCheckSucceededEventMapper). - RegisterFilterEventMapper(AggregateType, HumanPasswordCheckFailedType, HumanPasswordCheckFailedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanPasswordHashUpdatedType, eventstore.GenericEventMapper[HumanPasswordHashUpdatedEvent]). - RegisterFilterEventMapper(AggregateType, UserIDPLinkAddedType, UserIDPLinkAddedEventMapper). - RegisterFilterEventMapper(AggregateType, UserIDPLinkRemovedType, UserIDPLinkRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, UserIDPLinkCascadeRemovedType, UserIDPLinkCascadeRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, UserIDPLoginCheckSucceededType, UserIDPCheckSucceededEventMapper). - RegisterFilterEventMapper(AggregateType, UserIDPExternalIDMigratedType, eventstore.GenericEventMapper[UserIDPExternalIDMigratedEvent]). - RegisterFilterEventMapper(AggregateType, UserIDPExternalUsernameChangedType, eventstore.GenericEventMapper[UserIDPExternalUsernameEvent]). - RegisterFilterEventMapper(AggregateType, HumanEmailChangedType, HumanEmailChangedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanEmailVerifiedType, HumanEmailVerifiedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanEmailVerificationFailedType, HumanEmailVerificationFailedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanEmailCodeAddedType, HumanEmailCodeAddedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanEmailCodeSentType, HumanEmailCodeSentEventMapper). - RegisterFilterEventMapper(AggregateType, HumanPhoneChangedType, HumanPhoneChangedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanPhoneRemovedType, HumanPhoneRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanPhoneVerifiedType, HumanPhoneVerifiedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanPhoneVerificationFailedType, HumanPhoneVerificationFailedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanPhoneCodeAddedType, HumanPhoneCodeAddedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanPhoneCodeSentType, HumanPhoneCodeSentEventMapper). - RegisterFilterEventMapper(AggregateType, HumanProfileChangedType, HumanProfileChangedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanAvatarAddedType, HumanAvatarAddedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanAvatarRemovedType, HumanAvatarRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanAddressChangedType, HumanAddressChangedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanMFAInitSkippedType, HumanMFAInitSkippedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanMFAOTPAddedType, HumanOTPAddedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanMFAOTPVerifiedType, HumanOTPVerifiedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanMFAOTPRemovedType, HumanOTPRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanMFAOTPCheckSucceededType, HumanOTPCheckSucceededEventMapper). - RegisterFilterEventMapper(AggregateType, HumanMFAOTPCheckFailedType, HumanOTPCheckFailedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanOTPSMSAddedType, eventstore.GenericEventMapper[HumanOTPSMSAddedEvent]). - RegisterFilterEventMapper(AggregateType, HumanOTPSMSRemovedType, eventstore.GenericEventMapper[HumanOTPSMSRemovedEvent]). - RegisterFilterEventMapper(AggregateType, HumanOTPSMSCodeAddedType, eventstore.GenericEventMapper[HumanOTPSMSCodeAddedEvent]). - RegisterFilterEventMapper(AggregateType, HumanOTPSMSCodeSentType, eventstore.GenericEventMapper[HumanOTPSMSCodeSentEvent]). - RegisterFilterEventMapper(AggregateType, HumanOTPSMSCheckSucceededType, eventstore.GenericEventMapper[HumanOTPSMSCheckSucceededEvent]). - RegisterFilterEventMapper(AggregateType, HumanOTPSMSCheckFailedType, eventstore.GenericEventMapper[HumanOTPSMSCheckFailedEvent]). - RegisterFilterEventMapper(AggregateType, HumanOTPEmailAddedType, eventstore.GenericEventMapper[HumanOTPEmailAddedEvent]). - RegisterFilterEventMapper(AggregateType, HumanOTPEmailRemovedType, eventstore.GenericEventMapper[HumanOTPEmailRemovedEvent]). - RegisterFilterEventMapper(AggregateType, HumanOTPEmailCodeAddedType, eventstore.GenericEventMapper[HumanOTPEmailCodeAddedEvent]). - RegisterFilterEventMapper(AggregateType, HumanOTPEmailCodeSentType, eventstore.GenericEventMapper[HumanOTPEmailCodeSentEvent]). - RegisterFilterEventMapper(AggregateType, HumanOTPEmailCheckSucceededType, eventstore.GenericEventMapper[HumanOTPEmailCheckSucceededEvent]). - RegisterFilterEventMapper(AggregateType, HumanOTPEmailCheckFailedType, eventstore.GenericEventMapper[HumanOTPEmailCheckFailedEvent]). - RegisterFilterEventMapper(AggregateType, HumanU2FTokenAddedType, HumanU2FAddedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanU2FTokenVerifiedType, HumanU2FVerifiedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanU2FTokenSignCountChangedType, HumanU2FSignCountChangedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanU2FTokenRemovedType, HumanU2FRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanU2FTokenBeginLoginType, HumanU2FBeginLoginEventMapper). - RegisterFilterEventMapper(AggregateType, HumanU2FTokenCheckSucceededType, HumanU2FCheckSucceededEventMapper). - RegisterFilterEventMapper(AggregateType, HumanU2FTokenCheckFailedType, HumanU2FCheckFailedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanPasswordlessTokenAddedType, HumanPasswordlessAddedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanPasswordlessTokenVerifiedType, HumanPasswordlessVerifiedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanPasswordlessTokenSignCountChangedType, HumanPasswordlessSignCountChangedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanPasswordlessTokenRemovedType, HumanPasswordlessRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanPasswordlessTokenBeginLoginType, HumanPasswordlessBeginLoginEventMapper). - RegisterFilterEventMapper(AggregateType, HumanPasswordlessTokenCheckSucceededType, HumanPasswordlessCheckSucceededEventMapper). - RegisterFilterEventMapper(AggregateType, HumanPasswordlessTokenCheckFailedType, HumanPasswordlessCheckFailedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanPasswordlessInitCodeAddedType, HumanPasswordlessInitCodeAddedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanPasswordlessInitCodeRequestedType, HumanPasswordlessInitCodeRequestedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanPasswordlessInitCodeSentType, HumanPasswordlessInitCodeSentEventMapper). - RegisterFilterEventMapper(AggregateType, HumanPasswordlessInitCodeCheckFailedType, HumanPasswordlessInitCodeCodeCheckFailedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanPasswordlessInitCodeCheckSucceededType, HumanPasswordlessInitCodeCodeCheckSucceededEventMapper). - RegisterFilterEventMapper(AggregateType, HumanRefreshTokenAddedType, HumanRefreshTokenAddedEventMapper). - RegisterFilterEventMapper(AggregateType, HumanRefreshTokenRenewedType, HumanRefreshTokenRenewedEventEventMapper). - RegisterFilterEventMapper(AggregateType, HumanRefreshTokenRemovedType, HumanRefreshTokenRemovedEventEventMapper). - RegisterFilterEventMapper(AggregateType, MachineAddedEventType, MachineAddedEventMapper). - RegisterFilterEventMapper(AggregateType, MachineChangedEventType, MachineChangedEventMapper). - RegisterFilterEventMapper(AggregateType, MachineKeyAddedEventType, MachineKeyAddedEventMapper). - RegisterFilterEventMapper(AggregateType, MachineKeyRemovedEventType, MachineKeyRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, PersonalAccessTokenAddedType, PersonalAccessTokenAddedEventMapper). - RegisterFilterEventMapper(AggregateType, PersonalAccessTokenRemovedType, PersonalAccessTokenRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, MachineSecretSetType, MachineSecretSetEventMapper). - RegisterFilterEventMapper(AggregateType, MachineSecretRemovedType, MachineSecretRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, MachineSecretCheckSucceededType, MachineSecretCheckSucceededEventMapper). - RegisterFilterEventMapper(AggregateType, MachineSecretCheckFailedType, MachineSecretCheckFailedEventMapper) +func init() { + eventstore.RegisterFilterEventMapper(AggregateType, UserV1AddedType, HumanAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserV1RegisteredType, HumanRegisteredEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserV1InitialCodeAddedType, HumanInitialCodeAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserV1InitialCodeSentType, HumanInitialCodeSentEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserV1InitializedCheckSucceededType, HumanInitializedCheckSucceededEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserV1InitializedCheckFailedType, HumanInitializedCheckFailedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserV1SignedOutType, HumanSignedOutEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserV1PasswordChangedType, HumanPasswordChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserV1PasswordCodeAddedType, HumanPasswordCodeAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserV1PasswordCodeSentType, HumanPasswordCodeSentEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserV1PasswordCheckSucceededType, HumanPasswordCheckSucceededEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserV1PasswordCheckFailedType, HumanPasswordCheckFailedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserV1EmailChangedType, HumanEmailChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserV1EmailVerifiedType, HumanEmailVerifiedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserV1EmailVerificationFailedType, HumanEmailVerificationFailedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserV1EmailCodeAddedType, HumanEmailCodeAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserV1EmailCodeSentType, HumanEmailCodeSentEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserV1PhoneChangedType, HumanPhoneChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserV1PhoneRemovedType, HumanPhoneRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserV1PhoneVerifiedType, HumanPhoneVerifiedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserV1PhoneVerificationFailedType, HumanPhoneVerificationFailedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserV1PhoneCodeAddedType, HumanPhoneCodeAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserV1PhoneCodeSentType, HumanPhoneCodeSentEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserV1ProfileChangedType, HumanProfileChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserV1AddressChangedType, HumanAddressChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserV1MFAInitSkippedType, HumanMFAInitSkippedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserV1MFAOTPAddedType, HumanOTPAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserV1MFAOTPVerifiedType, HumanOTPVerifiedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserV1MFAOTPRemovedType, HumanOTPRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserV1MFAOTPCheckSucceededType, HumanOTPCheckSucceededEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserV1MFAOTPCheckFailedType, HumanOTPCheckFailedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserLockedType, UserLockedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserUnlockedType, UserUnlockedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserDeactivatedType, UserDeactivatedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserReactivatedType, UserReactivatedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserRemovedType, UserRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserTokenAddedType, UserTokenAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserTokenRemovedType, UserTokenRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserDomainClaimedType, DomainClaimedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserDomainClaimedSentType, DomainClaimedSentEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserUserNameChangedType, UsernameChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MetadataSetType, MetadataSetEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MetadataRemovedType, MetadataRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MetadataRemovedAllType, MetadataRemovedAllEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanAddedType, HumanAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanRegisteredType, HumanRegisteredEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanInitialCodeAddedType, HumanInitialCodeAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanInitialCodeSentType, HumanInitialCodeSentEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanInitializedCheckSucceededType, HumanInitializedCheckSucceededEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanInitializedCheckFailedType, HumanInitializedCheckFailedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanSignedOutType, HumanSignedOutEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanPasswordChangedType, HumanPasswordChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanPasswordCodeAddedType, HumanPasswordCodeAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanPasswordCodeSentType, HumanPasswordCodeSentEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanPasswordChangeSentType, HumanPasswordChangeSentEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanPasswordCheckSucceededType, HumanPasswordCheckSucceededEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanPasswordCheckFailedType, HumanPasswordCheckFailedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanPasswordHashUpdatedType, eventstore.GenericEventMapper[HumanPasswordHashUpdatedEvent]) + eventstore.RegisterFilterEventMapper(AggregateType, UserIDPLinkAddedType, UserIDPLinkAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserIDPLinkRemovedType, UserIDPLinkRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserIDPLinkCascadeRemovedType, UserIDPLinkCascadeRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserIDPLoginCheckSucceededType, UserIDPCheckSucceededEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserIDPExternalIDMigratedType, eventstore.GenericEventMapper[UserIDPExternalIDMigratedEvent]) + eventstore.RegisterFilterEventMapper(AggregateType, UserIDPExternalUsernameChangedType, eventstore.GenericEventMapper[UserIDPExternalUsernameEvent]) + eventstore.RegisterFilterEventMapper(AggregateType, HumanEmailChangedType, HumanEmailChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanEmailVerifiedType, HumanEmailVerifiedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanEmailVerificationFailedType, HumanEmailVerificationFailedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanEmailCodeAddedType, HumanEmailCodeAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanEmailCodeSentType, HumanEmailCodeSentEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanPhoneChangedType, HumanPhoneChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanPhoneRemovedType, HumanPhoneRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanPhoneVerifiedType, HumanPhoneVerifiedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanPhoneVerificationFailedType, HumanPhoneVerificationFailedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanPhoneCodeAddedType, HumanPhoneCodeAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanPhoneCodeSentType, HumanPhoneCodeSentEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanProfileChangedType, HumanProfileChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanAvatarAddedType, HumanAvatarAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanAvatarRemovedType, HumanAvatarRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanAddressChangedType, HumanAddressChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanMFAInitSkippedType, HumanMFAInitSkippedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanMFAOTPAddedType, HumanOTPAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanMFAOTPVerifiedType, HumanOTPVerifiedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanMFAOTPRemovedType, HumanOTPRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanMFAOTPCheckSucceededType, HumanOTPCheckSucceededEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanMFAOTPCheckFailedType, HumanOTPCheckFailedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanOTPSMSAddedType, eventstore.GenericEventMapper[HumanOTPSMSAddedEvent]) + eventstore.RegisterFilterEventMapper(AggregateType, HumanOTPSMSRemovedType, eventstore.GenericEventMapper[HumanOTPSMSRemovedEvent]) + eventstore.RegisterFilterEventMapper(AggregateType, HumanOTPSMSCodeAddedType, eventstore.GenericEventMapper[HumanOTPSMSCodeAddedEvent]) + eventstore.RegisterFilterEventMapper(AggregateType, HumanOTPSMSCodeSentType, eventstore.GenericEventMapper[HumanOTPSMSCodeSentEvent]) + eventstore.RegisterFilterEventMapper(AggregateType, HumanOTPSMSCheckSucceededType, eventstore.GenericEventMapper[HumanOTPSMSCheckSucceededEvent]) + eventstore.RegisterFilterEventMapper(AggregateType, HumanOTPSMSCheckFailedType, eventstore.GenericEventMapper[HumanOTPSMSCheckFailedEvent]) + eventstore.RegisterFilterEventMapper(AggregateType, HumanOTPEmailAddedType, eventstore.GenericEventMapper[HumanOTPEmailAddedEvent]) + eventstore.RegisterFilterEventMapper(AggregateType, HumanOTPEmailRemovedType, eventstore.GenericEventMapper[HumanOTPEmailRemovedEvent]) + eventstore.RegisterFilterEventMapper(AggregateType, HumanOTPEmailCodeAddedType, eventstore.GenericEventMapper[HumanOTPEmailCodeAddedEvent]) + eventstore.RegisterFilterEventMapper(AggregateType, HumanOTPEmailCodeSentType, eventstore.GenericEventMapper[HumanOTPEmailCodeSentEvent]) + eventstore.RegisterFilterEventMapper(AggregateType, HumanOTPEmailCheckSucceededType, eventstore.GenericEventMapper[HumanOTPEmailCheckSucceededEvent]) + eventstore.RegisterFilterEventMapper(AggregateType, HumanOTPEmailCheckFailedType, eventstore.GenericEventMapper[HumanOTPEmailCheckFailedEvent]) + eventstore.RegisterFilterEventMapper(AggregateType, HumanU2FTokenAddedType, HumanU2FAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanU2FTokenVerifiedType, HumanU2FVerifiedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanU2FTokenSignCountChangedType, HumanU2FSignCountChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanU2FTokenRemovedType, HumanU2FRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanU2FTokenBeginLoginType, HumanU2FBeginLoginEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanU2FTokenCheckSucceededType, HumanU2FCheckSucceededEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanU2FTokenCheckFailedType, HumanU2FCheckFailedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanPasswordlessTokenAddedType, HumanPasswordlessAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanPasswordlessTokenVerifiedType, HumanPasswordlessVerifiedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanPasswordlessTokenSignCountChangedType, HumanPasswordlessSignCountChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanPasswordlessTokenRemovedType, HumanPasswordlessRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanPasswordlessTokenBeginLoginType, HumanPasswordlessBeginLoginEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanPasswordlessTokenCheckSucceededType, HumanPasswordlessCheckSucceededEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanPasswordlessTokenCheckFailedType, HumanPasswordlessCheckFailedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanPasswordlessInitCodeAddedType, HumanPasswordlessInitCodeAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanPasswordlessInitCodeRequestedType, HumanPasswordlessInitCodeRequestedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanPasswordlessInitCodeSentType, HumanPasswordlessInitCodeSentEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanPasswordlessInitCodeCheckFailedType, HumanPasswordlessInitCodeCodeCheckFailedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanPasswordlessInitCodeCheckSucceededType, HumanPasswordlessInitCodeCodeCheckSucceededEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanRefreshTokenAddedType, HumanRefreshTokenAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanRefreshTokenRenewedType, HumanRefreshTokenRenewedEventEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, HumanRefreshTokenRemovedType, HumanRefreshTokenRemovedEventEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MachineAddedEventType, MachineAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MachineChangedEventType, MachineChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MachineKeyAddedEventType, MachineKeyAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MachineKeyRemovedEventType, MachineKeyRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, PersonalAccessTokenAddedType, PersonalAccessTokenAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, PersonalAccessTokenRemovedType, PersonalAccessTokenRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MachineSecretSetType, MachineSecretSetEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MachineSecretRemovedType, MachineSecretRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MachineSecretCheckSucceededType, MachineSecretCheckSucceededEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MachineSecretCheckFailedType, MachineSecretCheckFailedEventMapper) } diff --git a/internal/repository/usergrant/eventstore.go b/internal/repository/usergrant/eventstore.go index e93619eec..c62ec6347 100644 --- a/internal/repository/usergrant/eventstore.go +++ b/internal/repository/usergrant/eventstore.go @@ -4,12 +4,12 @@ import ( "github.com/zitadel/zitadel/internal/eventstore" ) -func RegisterEventMappers(es *eventstore.Eventstore) { - es.RegisterFilterEventMapper(AggregateType, UserGrantAddedType, UserGrantAddedEventMapper). - RegisterFilterEventMapper(AggregateType, UserGrantChangedType, UserGrantChangedEventMapper). - RegisterFilterEventMapper(AggregateType, UserGrantCascadeChangedType, UserGrantCascadeChangedEventMapper). - RegisterFilterEventMapper(AggregateType, UserGrantRemovedType, UserGrantRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, UserGrantCascadeRemovedType, UserGrantCascadeRemovedEventMapper). - RegisterFilterEventMapper(AggregateType, UserGrantDeactivatedType, UserGrantDeactivatedEventMapper). - RegisterFilterEventMapper(AggregateType, UserGrantReactivatedType, UserGrantReactivatedEventMapper) +func init() { + eventstore.RegisterFilterEventMapper(AggregateType, UserGrantAddedType, UserGrantAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserGrantChangedType, UserGrantChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserGrantCascadeChangedType, UserGrantCascadeChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserGrantRemovedType, UserGrantRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserGrantCascadeRemovedType, UserGrantCascadeRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserGrantDeactivatedType, UserGrantDeactivatedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, UserGrantReactivatedType, UserGrantReactivatedEventMapper) }