mirror of
https://github.com/zitadel/zitadel.git
synced 2024-12-12 11:04:25 +00:00
fix(eventstore): differentiate unique constraint error (#6832)
* fix(eventstore): differentiate unique constraint error format * docs: add comment to eventstore vars * fix(eventstore): return correct error type if unique constraint already exists
This commit is contained in:
parent
a4626f9bdb
commit
f8bf8ea256
@ -6,8 +6,12 @@ import (
|
|||||||
"github.com/zitadel/zitadel/internal/database"
|
"github.com/zitadel/zitadel/internal/database"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
// pushPlaceholderFmt defines how data are inserted into the events table
|
// pushPlaceholderFmt defines how data are inserted into the events table
|
||||||
var pushPlaceholderFmt string
|
pushPlaceholderFmt string
|
||||||
|
// uniqueConstraintPlaceholderFmt defines the format of the unique constraint error returned from the database
|
||||||
|
uniqueConstraintPlaceholderFmt string
|
||||||
|
)
|
||||||
|
|
||||||
type Eventstore struct {
|
type Eventstore struct {
|
||||||
client *database.DB
|
client *database.DB
|
||||||
@ -17,8 +21,10 @@ func NewEventstore(client *database.DB) *Eventstore {
|
|||||||
switch client.Type() {
|
switch client.Type() {
|
||||||
case "cockroach":
|
case "cockroach":
|
||||||
pushPlaceholderFmt = "($%d, $%d, $%d, $%d, $%d, $%d, $%d, $%d, $%d, hlc_to_timestamp(cluster_logical_timestamp()), cluster_logical_timestamp(), $%d)"
|
pushPlaceholderFmt = "($%d, $%d, $%d, $%d, $%d, $%d, $%d, $%d, $%d, hlc_to_timestamp(cluster_logical_timestamp()), cluster_logical_timestamp(), $%d)"
|
||||||
|
uniqueConstraintPlaceholderFmt = "('%s', '%s', '%s')"
|
||||||
case "postgres":
|
case "postgres":
|
||||||
pushPlaceholderFmt = "($%d, $%d, $%d, $%d, $%d, $%d, $%d, $%d, $%d, statement_timestamp(), EXTRACT(EPOCH FROM clock_timestamp()), $%d)"
|
pushPlaceholderFmt = "($%d, $%d, $%d, $%d, $%d, $%d, $%d, $%d, $%d, statement_timestamp(), EXTRACT(EPOCH FROM clock_timestamp()), $%d)"
|
||||||
|
uniqueConstraintPlaceholderFmt = "(%s, %s, %s)"
|
||||||
}
|
}
|
||||||
|
|
||||||
return &Eventstore{client: client}
|
return &Eventstore{client: client}
|
||||||
|
@ -37,15 +37,15 @@ func handleUniqueConstraints(ctx context.Context, tx *sql.Tx, commands []eventst
|
|||||||
case eventstore.UniqueConstraintAdd:
|
case eventstore.UniqueConstraintAdd:
|
||||||
addPlaceholders = append(addPlaceholders, fmt.Sprintf("($%d, $%d, $%d)", len(addArgs)+1, len(addArgs)+2, len(addArgs)+3))
|
addPlaceholders = append(addPlaceholders, fmt.Sprintf("($%d, $%d, $%d)", len(addArgs)+1, len(addArgs)+2, len(addArgs)+3))
|
||||||
addArgs = append(addArgs, command.Aggregate().InstanceID, constraint.UniqueType, constraint.UniqueField)
|
addArgs = append(addArgs, command.Aggregate().InstanceID, constraint.UniqueType, constraint.UniqueField)
|
||||||
addConstraints[fmt.Sprintf("('%s', '%s', '%s')", command.Aggregate().InstanceID, constraint.UniqueType, constraint.UniqueField)] = constraint
|
addConstraints[fmt.Sprintf(uniqueConstraintPlaceholderFmt, command.Aggregate().InstanceID, constraint.UniqueType, constraint.UniqueField)] = constraint
|
||||||
case eventstore.UniqueConstraintRemove:
|
case eventstore.UniqueConstraintRemove:
|
||||||
deletePlaceholders = append(deletePlaceholders, fmt.Sprintf("(instance_id = $%d AND unique_type = $%d AND unique_field = $%d)", len(deleteArgs)+1, len(deleteArgs)+2, len(deleteArgs)+3))
|
deletePlaceholders = append(deletePlaceholders, fmt.Sprintf("(instance_id = $%d AND unique_type = $%d AND unique_field = $%d)", len(deleteArgs)+1, len(deleteArgs)+2, len(deleteArgs)+3))
|
||||||
deleteArgs = append(deleteArgs, command.Aggregate().InstanceID, constraint.UniqueType, constraint.UniqueField)
|
deleteArgs = append(deleteArgs, command.Aggregate().InstanceID, constraint.UniqueType, constraint.UniqueField)
|
||||||
deleteConstraints[fmt.Sprintf("('%s', '%s', '%s')", command.Aggregate().InstanceID, constraint.UniqueType, constraint.UniqueField)] = constraint
|
deleteConstraints[fmt.Sprintf(uniqueConstraintPlaceholderFmt, command.Aggregate().InstanceID, constraint.UniqueType, constraint.UniqueField)] = constraint
|
||||||
case eventstore.UniqueConstraintInstanceRemove:
|
case eventstore.UniqueConstraintInstanceRemove:
|
||||||
deletePlaceholders = append(deletePlaceholders, fmt.Sprintf("(instance_id = $%d)", len(deleteArgs)+1))
|
deletePlaceholders = append(deletePlaceholders, fmt.Sprintf("(instance_id = $%d)", len(deleteArgs)+1))
|
||||||
deleteArgs = append(deleteArgs, command.Aggregate().InstanceID)
|
deleteArgs = append(deleteArgs, command.Aggregate().InstanceID)
|
||||||
deleteConstraints[fmt.Sprintf("('%s', '%s', '%s')", command.Aggregate().InstanceID, constraint.UniqueType, constraint.UniqueField)] = constraint
|
deleteConstraints[fmt.Sprintf(uniqueConstraintPlaceholderFmt, command.Aggregate().InstanceID, constraint.UniqueType, constraint.UniqueField)] = constraint
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -69,7 +69,7 @@ func handleUniqueConstraints(ctx context.Context, tx *sql.Tx, commands []eventst
|
|||||||
if constraint := constraintFromErr(err, addConstraints); constraint != nil {
|
if constraint := constraintFromErr(err, addConstraints); constraint != nil {
|
||||||
errMessage = constraint.ErrorMessage
|
errMessage = constraint.ErrorMessage
|
||||||
}
|
}
|
||||||
return errs.ThrowInternal(err, "V3-DKcYh", errMessage)
|
return errs.ThrowAlreadyExists(err, "V3-DKcYh", errMessage)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
Loading…
Reference in New Issue
Block a user