diff --git a/internal/command/instance_domain_test.go b/internal/command/instance_domain_test.go index 923bcf347e..e2e5ecabb7 100644 --- a/internal/command/instance_domain_test.go +++ b/internal/command/instance_domain_test.go @@ -133,7 +133,7 @@ func TestCommandSide_AddInstanceDomain(t *testing.T) { newOIDCAppChangedEventInstanceDomain(context.Background(), "consoleApplicationID", "projectID", "org1"), ), }, - uniqueConstraintsFromEventConstraintWithInstanceID("INSTANCE", instance.NewAddInstanceDomainUniqueConstraint("domain.ch")), + uniqueConstraintsFromEventConstraint(instance.NewAddInstanceDomainUniqueConstraint("domain.ch")), ), ), externalSecure: true, @@ -348,7 +348,7 @@ func TestCommandSide_RemoveInstanceDomain(t *testing.T) { "domain.ch", )), }, - uniqueConstraintsFromEventConstraintWithInstanceID("INSTANCE", instance.NewRemoveInstanceDomainUniqueConstraint("domain.ch")), + uniqueConstraintsFromEventConstraint(instance.NewRemoveInstanceDomainUniqueConstraint("domain.ch")), ), ), }, diff --git a/internal/eventstore/eventstore.go b/internal/eventstore/eventstore.go index 8e58d9a89f..0641b349ac 100644 --- a/internal/eventstore/eventstore.go +++ b/internal/eventstore/eventstore.go @@ -104,10 +104,14 @@ func commandsToRepository(instanceID string, cmds []Command) (events []*reposito func uniqueConstraintsToRepository(instanceID string, constraints []*EventUniqueConstraint) (uniqueConstraints []*repository.UniqueConstraint) { uniqueConstraints = make([]*repository.UniqueConstraint, len(constraints)) for i, constraint := range constraints { + var id string + if !constraint.IsGlobal { + id = instanceID + } uniqueConstraints[i] = &repository.UniqueConstraint{ UniqueType: constraint.UniqueType, UniqueField: constraint.UniqueField, - InstanceID: instanceID, + InstanceID: id, Action: uniqueConstraintActionToRepository(constraint.Action), ErrorMessage: constraint.ErrorMessage, } diff --git a/internal/eventstore/unique_constraint.go b/internal/eventstore/unique_constraint.go index d7593923db..36a9f3a1ad 100644 --- a/internal/eventstore/unique_constraint.go +++ b/internal/eventstore/unique_constraint.go @@ -9,6 +9,8 @@ type EventUniqueConstraint struct { Action UniqueConstraintAction //ErrorMessage defines the translation file key for the error message ErrorMessage string + //IsGlobal defines if the unique constraint is globally unique or just within a single instance + IsGlobal bool } type UniqueConstraintAction int32 @@ -39,3 +41,27 @@ func NewRemoveEventUniqueConstraint( Action: UniqueConstraintRemove, } } + +func NewAddGlobalEventUniqueConstraint( + uniqueType, + uniqueField, + errMessage string) *EventUniqueConstraint { + return &EventUniqueConstraint{ + UniqueType: uniqueType, + UniqueField: uniqueField, + ErrorMessage: errMessage, + IsGlobal: true, + Action: UniqueConstraintAdd, + } +} + +func NewRemoveGlobalEventUniqueConstraint( + uniqueType, + uniqueField string) *EventUniqueConstraint { + return &EventUniqueConstraint{ + UniqueType: uniqueType, + UniqueField: uniqueField, + IsGlobal: true, + Action: UniqueConstraintRemove, + } +} diff --git a/internal/migration/command.go b/internal/migration/command.go index 81c0b3b4b0..16ac4eb188 100644 --- a/internal/migration/command.go +++ b/internal/migration/command.go @@ -73,15 +73,15 @@ func (s *SetupStep) UniqueConstraints() []*eventstore.EventUniqueConstraint { switch s.Type() { case startedType: return []*eventstore.EventUniqueConstraint{ - eventstore.NewAddEventUniqueConstraint("migration_started", s.migration.String(), "Errors.Step.Started.AlreadyExists"), + eventstore.NewAddGlobalEventUniqueConstraint("migration_started", s.migration.String(), "Errors.Step.Started.AlreadyExists"), } case failedType: return []*eventstore.EventUniqueConstraint{ - eventstore.NewRemoveEventUniqueConstraint("migration_started", s.migration.String()), + eventstore.NewRemoveGlobalEventUniqueConstraint("migration_started", s.migration.String()), } default: return []*eventstore.EventUniqueConstraint{ - eventstore.NewAddEventUniqueConstraint("migration_done", s.migration.String(), "Errors.Step.Done.AlreadyExists"), + eventstore.NewAddGlobalEventUniqueConstraint("migration_done", s.migration.String(), "Errors.Step.Done.AlreadyExists"), } } } diff --git a/internal/repository/instance/domain.go b/internal/repository/instance/domain.go index 0e227abfd0..807ed5b925 100644 --- a/internal/repository/instance/domain.go +++ b/internal/repository/instance/domain.go @@ -19,14 +19,14 @@ const ( ) func NewAddInstanceDomainUniqueConstraint(orgDomain string) *eventstore.EventUniqueConstraint { - return eventstore.NewAddEventUniqueConstraint( + return eventstore.NewAddGlobalEventUniqueConstraint( UniqueInstanceDomain, orgDomain, "Errors.Instance.Domain.AlreadyExists") } func NewRemoveInstanceDomainUniqueConstraint(orgDomain string) *eventstore.EventUniqueConstraint { - return eventstore.NewRemoveEventUniqueConstraint( + return eventstore.NewRemoveGlobalEventUniqueConstraint( UniqueInstanceDomain, orgDomain) } diff --git a/internal/repository/instance/eventstore.go b/internal/repository/instance/eventstore.go index d816bb46d1..8b318964d8 100644 --- a/internal/repository/instance/eventstore.go +++ b/internal/repository/instance/eventstore.go @@ -15,7 +15,6 @@ func RegisterEventMappers(es *eventstore.Eventstore) { RegisterFilterEventMapper(SMTPConfigAddedEventType, SMTPConfigAddedEventMapper). RegisterFilterEventMapper(SMTPConfigChangedEventType, SMTPConfigChangedEventMapper). RegisterFilterEventMapper(SMTPConfigPasswordChangedEventType, SMTPConfigPasswordChangedEventMapper). - RegisterFilterEventMapper(UniqueConstraintsMigratedEventType, MigrateUniqueConstraintEventMapper). RegisterFilterEventMapper(SMSConfigTwilioAddedEventType, SMSConfigTwilioAddedEventMapper). RegisterFilterEventMapper(SMSConfigTwilioChangedEventType, SMSConfigTwilioChangedEventMapper). RegisterFilterEventMapper(SMSConfigTwilioTokenChangedEventType, SMSConfigTwilioTokenChangedEventMapper). diff --git a/internal/repository/instance/migrate_unique_constraints.go b/internal/repository/instance/migrate_unique_constraints.go deleted file mode 100644 index 93a58b1edf..0000000000 --- a/internal/repository/instance/migrate_unique_constraints.go +++ /dev/null @@ -1,59 +0,0 @@ -package instance - -import ( - "context" - - "github.com/zitadel/zitadel/internal/domain" - "github.com/zitadel/zitadel/internal/eventstore" - - "github.com/zitadel/zitadel/internal/eventstore/repository" -) - -const ( - UniqueConstraintsMigratedEventType eventstore.EventType = "iam.unique.constraints.migrated" -) - -type MigrateUniqueConstraintEvent struct { - eventstore.BaseEvent `json:"-"` - - uniqueConstraintMigrations []*domain.UniqueConstraintMigration `json:"-"` -} - -func NewAddMigrateUniqueConstraint(uniqueMigration *domain.UniqueConstraintMigration) *eventstore.EventUniqueConstraint { - return eventstore.NewAddEventUniqueConstraint( - uniqueMigration.UniqueType, - uniqueMigration.UniqueField, - uniqueMigration.ErrorMessage) -} - -func (e *MigrateUniqueConstraintEvent) Data() interface{} { - return nil -} - -func (e *MigrateUniqueConstraintEvent) UniqueConstraints() []*eventstore.EventUniqueConstraint { - constraints := make([]*eventstore.EventUniqueConstraint, len(e.uniqueConstraintMigrations)) - for i, uniqueMigration := range e.uniqueConstraintMigrations { - constraints[i] = NewAddMigrateUniqueConstraint(uniqueMigration) - } - return constraints -} - -func NewMigrateUniqueConstraintEvent( - ctx context.Context, - aggregate *eventstore.Aggregate, - uniqueConstraintMigrations []*domain.UniqueConstraintMigration) *MigrateUniqueConstraintEvent { - return &MigrateUniqueConstraintEvent{ - BaseEvent: *eventstore.NewBaseEventForPush( - ctx, - aggregate, - UniqueConstraintsMigratedEventType, - ), - uniqueConstraintMigrations: uniqueConstraintMigrations, - } -} - -func MigrateUniqueConstraintEventMapper(event *repository.Event) (eventstore.Event, error) { - return &MigrateUniqueConstraintEvent{ - BaseEvent: *eventstore.BaseEventFromRepo(event), - }, nil -}