mirror of
https://github.com/zitadel/zitadel.git
synced 2025-08-11 20:27:32 +00:00
fixup! Merge branch 'main' into fix_adding_org_same_id_twice
This commit is contained in:
96
cmd/setup/60.go
Normal file
96
cmd/setup/60.go
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
package setup
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/zitadel/zitadel/internal/database"
|
||||||
|
"github.com/zitadel/zitadel/internal/eventstore"
|
||||||
|
eventstoreV3 "github.com/zitadel/zitadel/internal/eventstore/v3"
|
||||||
|
"github.com/zitadel/zitadel/internal/repository/org"
|
||||||
|
)
|
||||||
|
|
||||||
|
type AddIDUniqueConstraintsForOrgs struct {
|
||||||
|
dbClient *database.DB
|
||||||
|
eventstore *eventstore.Eventstore
|
||||||
|
}
|
||||||
|
|
||||||
|
type orgsReadModel struct {
|
||||||
|
eventstore.ReadModel
|
||||||
|
}
|
||||||
|
|
||||||
|
func (orm *orgsReadModel) AppendEvents(events ...eventstore.Event) {
|
||||||
|
orm.ReadModel.AppendEvents(events...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (orm *orgsReadModel) Reduce() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type OrgAddEventUpdateIDUniqueConstraint struct {
|
||||||
|
*org.OrgAddedEvent
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *OrgAddEventUpdateIDUniqueConstraint) UniqueConstraints() []*eventstore.UniqueConstraint {
|
||||||
|
return []*eventstore.UniqueConstraint{org.NewAddOrgIDUniqueConstraint(e.Aggregate().ID)}
|
||||||
|
}
|
||||||
|
|
||||||
|
type OrgRemoveEventUpdateIDUniqueConstraint struct {
|
||||||
|
*org.OrgRemovedEvent
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *OrgRemoveEventUpdateIDUniqueConstraint) UniqueConstraints() []*eventstore.UniqueConstraint {
|
||||||
|
return []*eventstore.UniqueConstraint{org.NewRemoveOrgIDUniqueConstraint(e.Aggregate().ID)}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (mig *AddIDUniqueConstraintsForOrgs) Execute(ctx context.Context, _ eventstore.Event) error {
|
||||||
|
orm := orgsReadModel{}
|
||||||
|
sqb := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||||
|
AddQuery().
|
||||||
|
EventTypes(
|
||||||
|
org.OrgAddedEventType,
|
||||||
|
org.OrgRemovedEventType,
|
||||||
|
).
|
||||||
|
Builder()
|
||||||
|
|
||||||
|
err := mig.eventstore.FilterToReducer(context.Background(), sqb, &orm)
|
||||||
|
if err != nil {
|
||||||
|
}
|
||||||
|
|
||||||
|
tx, err := mig.dbClient.BeginTx(ctx, nil)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
if err == nil {
|
||||||
|
tx.Commit()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
for _, event := range orm.Events {
|
||||||
|
switch event := event.(type) {
|
||||||
|
case *org.OrgAddedEvent:
|
||||||
|
orgAddUpdateUniqueIDConstraint := OrgAddEventUpdateIDUniqueConstraint{event}
|
||||||
|
err = eventstoreV3.HandleUniqueConstraints(ctx, tx, []eventstore.Command{&orgAddUpdateUniqueIDConstraint})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
case *org.OrgRemovedEvent:
|
||||||
|
orgRemoveUpdateUniqueIDConstraint := OrgRemoveEventUpdateIDUniqueConstraint{event}
|
||||||
|
err = eventstoreV3.HandleUniqueConstraints(ctx, tx, []eventstore.Command{&orgRemoveUpdateUniqueIDConstraint})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*AddIDUniqueConstraintsForOrgs) String() string {
|
||||||
|
return "60_add_id_unique_constraints_for_orgs"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *AddIDUniqueConstraintsForOrgs) Check(lastRun map[string]interface{}) bool {
|
||||||
|
return true
|
||||||
|
}
|
@@ -217,6 +217,7 @@ func Setup(ctx context.Context, config *Config, steps *Steps, masterKey string)
|
|||||||
steps.s56IDPTemplate6SAMLFederatedLogout = &IDPTemplate6SAMLFederatedLogout{dbClient: dbClient}
|
steps.s56IDPTemplate6SAMLFederatedLogout = &IDPTemplate6SAMLFederatedLogout{dbClient: dbClient}
|
||||||
steps.s57CreateResourceCounts = &CreateResourceCounts{dbClient: dbClient}
|
steps.s57CreateResourceCounts = &CreateResourceCounts{dbClient: dbClient}
|
||||||
steps.s58ReplaceLoginNames3View = &ReplaceLoginNames3View{dbClient: dbClient}
|
steps.s58ReplaceLoginNames3View = &ReplaceLoginNames3View{dbClient: dbClient}
|
||||||
|
steps.s60AddUIDniqueConstraintsForOrgs = &AddIDUniqueConstraintsForOrgs{eventstore: eventstoreClient, dbClient: dbClient}
|
||||||
|
|
||||||
err = projection.Create(ctx, dbClient, eventstoreClient, config.Projections, nil, nil, nil)
|
err = projection.Create(ctx, dbClient, eventstoreClient, config.Projections, nil, nil, nil)
|
||||||
logging.OnError(err).Fatal("unable to start projections")
|
logging.OnError(err).Fatal("unable to start projections")
|
||||||
@@ -264,6 +265,7 @@ func Setup(ctx context.Context, config *Config, steps *Steps, masterKey string)
|
|||||||
steps.s56IDPTemplate6SAMLFederatedLogout,
|
steps.s56IDPTemplate6SAMLFederatedLogout,
|
||||||
steps.s57CreateResourceCounts,
|
steps.s57CreateResourceCounts,
|
||||||
steps.s58ReplaceLoginNames3View,
|
steps.s58ReplaceLoginNames3View,
|
||||||
|
steps.s60AddUIDniqueConstraintsForOrgs,
|
||||||
} {
|
} {
|
||||||
setupErr = executeMigration(ctx, eventstoreClient, step, "migration failed")
|
setupErr = executeMigration(ctx, eventstoreClient, step, "migration failed")
|
||||||
if setupErr != nil {
|
if setupErr != nil {
|
||||||
|
@@ -67,7 +67,7 @@ func (es *Eventstore) writeCommands(ctx context.Context, client database.Context
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = handleUniqueConstraints(ctx, tx, commands); err != nil {
|
if err = HandleUniqueConstraints(ctx, tx, commands); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -57,7 +57,7 @@ func (es *Eventstore) pushWithoutFunc(ctx context.Context, client database.Conte
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = handleUniqueConstraints(ctx, tx, commands); err != nil {
|
if err = HandleUniqueConstraints(ctx, tx, commands); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -25,7 +25,7 @@ var (
|
|||||||
addConstraintStmt string
|
addConstraintStmt string
|
||||||
)
|
)
|
||||||
|
|
||||||
func handleUniqueConstraints(ctx context.Context, tx database.Tx, commands []eventstore.Command) (err error) {
|
func HandleUniqueConstraints(ctx context.Context, tx database.Tx, commands []eventstore.Command) (err error) {
|
||||||
ctx, span := tracing.NewSpan(ctx)
|
ctx, span := tracing.NewSpan(ctx)
|
||||||
defer func() { span.EndWithError(err) }()
|
defer func() { span.EndWithError(err) }()
|
||||||
|
|
||||||
|
@@ -12,6 +12,7 @@ import (
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
uniqueOrgname = "org_name"
|
uniqueOrgname = "org_name"
|
||||||
|
uniqueOrgID = "org_id"
|
||||||
OrgAddedEventType = orgEventTypePrefix + "added"
|
OrgAddedEventType = orgEventTypePrefix + "added"
|
||||||
OrgChangedEventType = orgEventTypePrefix + "changed"
|
OrgChangedEventType = orgEventTypePrefix + "changed"
|
||||||
OrgDeactivatedEventType = orgEventTypePrefix + "deactivated"
|
OrgDeactivatedEventType = orgEventTypePrefix + "deactivated"
|
||||||
@@ -25,14 +26,14 @@ const (
|
|||||||
|
|
||||||
func NewAddOrgIDUniqueConstraint(orgID string) *eventstore.UniqueConstraint {
|
func NewAddOrgIDUniqueConstraint(orgID string) *eventstore.UniqueConstraint {
|
||||||
return eventstore.NewAddEventUniqueConstraint(
|
return eventstore.NewAddEventUniqueConstraint(
|
||||||
uniqueOrgname,
|
uniqueOrgID,
|
||||||
orgID,
|
orgID,
|
||||||
"Errors.Org.AlreadyExists")
|
"Errors.Org.AlreadyExists")
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewRemoveOrgIDUniqueConstraint(orgID string) *eventstore.UniqueConstraint {
|
func NewRemoveOrgIDUniqueConstraint(orgID string) *eventstore.UniqueConstraint {
|
||||||
return eventstore.NewRemoveUniqueConstraint(
|
return eventstore.NewRemoveUniqueConstraint(
|
||||||
uniqueOrgname,
|
uniqueOrgID,
|
||||||
orgID)
|
orgID)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user