mirror of
https://github.com/zitadel/zitadel.git
synced 2025-08-12 07:37:31 +00:00
Merge branch 'error-handling' into rt-domains
This commit is contained in:
@@ -4,8 +4,6 @@ import (
|
||||
"context"
|
||||
"errors"
|
||||
|
||||
"github.com/jackc/pgx/v5/pgconn"
|
||||
|
||||
"github.com/zitadel/zitadel/backend/v3/domain"
|
||||
"github.com/zitadel/zitadel/backend/v3/storage/database"
|
||||
)
|
||||
@@ -69,28 +67,7 @@ func (i *instance) Create(ctx context.Context, instance *domain.Instance) error
|
||||
builder.AppendArgs(instance.ID, instance.Name, instance.DefaultOrgID, instance.IAMProjectID, instance.ConsoleClientID, instance.ConsoleAppID, instance.DefaultLanguage)
|
||||
builder.WriteString(createInstanceStmt)
|
||||
|
||||
err := i.client.QueryRow(ctx, builder.String(), builder.Args()...).Scan(&instance.CreatedAt, &instance.UpdatedAt)
|
||||
if err != nil {
|
||||
var pgErr *pgconn.PgError
|
||||
if errors.As(err, &pgErr) {
|
||||
// constraint violation
|
||||
if pgErr.Code == "23514" {
|
||||
if pgErr.ConstraintName == "instances_name_check" {
|
||||
return errors.New("instance name not provided")
|
||||
}
|
||||
if pgErr.ConstraintName == "instances_id_check" {
|
||||
return errors.New("instance id not provided")
|
||||
}
|
||||
}
|
||||
// duplicate
|
||||
if pgErr.Code == "23505" {
|
||||
if pgErr.ConstraintName == "instances_pkey" {
|
||||
return errors.New("instance id already exists")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return err
|
||||
return i.client.QueryRow(ctx, builder.String(), builder.Args()...).Scan(&instance.CreatedAt, &instance.UpdatedAt)
|
||||
}
|
||||
|
||||
// Update implements [domain.InstanceRepository].
|
||||
@@ -109,8 +86,7 @@ func (i instance) Update(ctx context.Context, id string, changes ...database.Cha
|
||||
|
||||
stmt := builder.String()
|
||||
|
||||
rowsAffected, err := i.client.Exec(ctx, stmt, builder.Args()...)
|
||||
return rowsAffected, err
|
||||
return i.client.Exec(ctx, stmt, builder.Args()...)
|
||||
}
|
||||
|
||||
// Delete implements [domain.InstanceRepository].
|
||||
@@ -205,9 +181,6 @@ func scanInstance(ctx context.Context, querier database.Querier, builder *databa
|
||||
|
||||
instance := new(domain.Instance)
|
||||
if err := rows.(database.CollectableRows).CollectExactlyOneRow(instance); err != nil {
|
||||
if err.Error() == "no rows in result set" {
|
||||
return nil, ErrResourceDoesNotExist
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -221,12 +194,6 @@ func scanInstances(ctx context.Context, querier database.Querier, builder *datab
|
||||
}
|
||||
|
||||
if err := rows.(database.CollectableRows).Collect(&instances); err != nil {
|
||||
// if no results returned, this is not a error
|
||||
// it just means the instance was not found
|
||||
// the caller should check if the returned instance is nil
|
||||
if err.Error() == "no rows in result set" {
|
||||
return nil, nil
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
@@ -2,7 +2,6 @@ package repository_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
@@ -55,7 +54,7 @@ func TestCreateInstance(t *testing.T) {
|
||||
}
|
||||
return instance
|
||||
}(),
|
||||
err: errors.New("instance name not provided"),
|
||||
err: new(database.CheckError),
|
||||
},
|
||||
{
|
||||
name: "adding same instance twice",
|
||||
@@ -80,7 +79,7 @@ func TestCreateInstance(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
return &inst
|
||||
},
|
||||
err: errors.New("instance id already exists"),
|
||||
err: new(database.UniqueError),
|
||||
},
|
||||
func() struct {
|
||||
name string
|
||||
@@ -146,7 +145,7 @@ func TestCreateInstance(t *testing.T) {
|
||||
}
|
||||
return instance
|
||||
}(),
|
||||
err: errors.New("instance id not provided"),
|
||||
err: new(database.CheckError),
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
@@ -164,7 +163,7 @@ func TestCreateInstance(t *testing.T) {
|
||||
// create instance
|
||||
beforeCreate := time.Now()
|
||||
err := instanceRepo.Create(ctx, instance)
|
||||
assert.Equal(t, tt.err, err)
|
||||
assert.ErrorIs(t, err, tt.err)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
@@ -263,7 +262,7 @@ func TestUpdateInstance(t *testing.T) {
|
||||
return &inst
|
||||
},
|
||||
rowsAffected: 0,
|
||||
getErr: repository.ErrResourceDoesNotExist,
|
||||
getErr: new(database.NoRowFoundError),
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
@@ -342,7 +341,7 @@ func TestGetInstance(t *testing.T) {
|
||||
}
|
||||
return &inst
|
||||
},
|
||||
err: repository.ErrResourceDoesNotExist,
|
||||
err: new(database.NoRowFoundError),
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
@@ -360,7 +359,7 @@ func TestGetInstance(t *testing.T) {
|
||||
instance.ID,
|
||||
)
|
||||
if tt.err != nil {
|
||||
require.Equal(t, tt.err, err)
|
||||
require.ErrorIs(t, err, tt.err)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -655,7 +654,7 @@ func TestDeleteInstance(t *testing.T) {
|
||||
instance, err := instanceRepo.Get(ctx,
|
||||
tt.instanceID,
|
||||
)
|
||||
require.Equal(t, err, repository.ErrResourceDoesNotExist)
|
||||
require.ErrorIs(t, err, new(database.NoRowFoundError))
|
||||
assert.Nil(t, instance)
|
||||
})
|
||||
}
|
||||
|
@@ -244,12 +244,6 @@ func scanOrganizations(ctx context.Context, querier database.Querier, builder *d
|
||||
|
||||
organizations := []*domain.Organization{}
|
||||
if err := rows.(database.CollectableRows).Collect(&organizations); err != nil {
|
||||
// if no results returned, this is not a error
|
||||
// it just means the organization was not found
|
||||
// the caller should check if the returned organization is nil
|
||||
if err.Error() == "no rows in result set" {
|
||||
return nil, nil
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
return organizations, nil
|
||||
|
@@ -2,7 +2,6 @@ package repository_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
@@ -29,7 +28,7 @@ func TestCreateOrganization(t *testing.T) {
|
||||
}
|
||||
instanceRepo := repository.InstanceRepository(pool)
|
||||
err := instanceRepo.Create(t.Context(), &instance)
|
||||
assert.Nil(t, err)
|
||||
require.NoError(t, err)
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
@@ -64,7 +63,7 @@ func TestCreateOrganization(t *testing.T) {
|
||||
}
|
||||
return organization
|
||||
}(),
|
||||
err: errors.New("organization name not provided"),
|
||||
err: new(database.CheckError),
|
||||
},
|
||||
{
|
||||
name: "adding org with same id twice",
|
||||
@@ -86,7 +85,7 @@ func TestCreateOrganization(t *testing.T) {
|
||||
org.Name = gofakeit.Name()
|
||||
return &org
|
||||
},
|
||||
err: errors.New("organization id already exists"),
|
||||
err: new(database.UniqueError),
|
||||
},
|
||||
{
|
||||
name: "adding org with same name twice",
|
||||
@@ -108,7 +107,7 @@ func TestCreateOrganization(t *testing.T) {
|
||||
org.ID = gofakeit.Name()
|
||||
return &org
|
||||
},
|
||||
err: errors.New("organization name already exists for instance"),
|
||||
err: new(database.UniqueError),
|
||||
},
|
||||
func() struct {
|
||||
name string
|
||||
@@ -181,7 +180,7 @@ func TestCreateOrganization(t *testing.T) {
|
||||
}
|
||||
return organization
|
||||
}(),
|
||||
err: errors.New("organization id not provided"),
|
||||
err: new(database.CheckError),
|
||||
},
|
||||
{
|
||||
name: "adding organization with no instance id",
|
||||
@@ -195,7 +194,7 @@ func TestCreateOrganization(t *testing.T) {
|
||||
}
|
||||
return organization
|
||||
}(),
|
||||
err: errors.New("invalid instance id"),
|
||||
err: new(database.ForeignKeyError),
|
||||
},
|
||||
{
|
||||
name: "adding organization with non existent instance id",
|
||||
@@ -210,7 +209,7 @@ func TestCreateOrganization(t *testing.T) {
|
||||
}
|
||||
return organization
|
||||
}(),
|
||||
err: errors.New("invalid instance id"),
|
||||
err: new(database.ForeignKeyError),
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
@@ -228,7 +227,7 @@ func TestCreateOrganization(t *testing.T) {
|
||||
// create organization
|
||||
beforeCreate := time.Now()
|
||||
err = organizationRepo.Create(ctx, organization)
|
||||
assert.Equal(t, tt.err, err)
|
||||
assert.ErrorIs(t, err, tt.err)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
@@ -265,7 +264,7 @@ func TestUpdateOrganization(t *testing.T) {
|
||||
}
|
||||
instanceRepo := repository.InstanceRepository(pool)
|
||||
err := instanceRepo.Create(t.Context(), &instance)
|
||||
assert.Nil(t, err)
|
||||
require.NoError(t, err)
|
||||
organizationRepo := repository.OrganizationRepository(pool)
|
||||
|
||||
tests := []struct {
|
||||
@@ -417,7 +416,7 @@ func TestGetOrganization(t *testing.T) {
|
||||
}
|
||||
instanceRepo := repository.InstanceRepository(pool)
|
||||
err := instanceRepo.Create(t.Context(), &instance)
|
||||
assert.Nil(t, err)
|
||||
require.NoError(t, err)
|
||||
|
||||
orgRepo := repository.OrganizationRepository(pool)
|
||||
|
||||
@@ -497,7 +496,7 @@ func TestGetOrganization(t *testing.T) {
|
||||
return &org
|
||||
},
|
||||
orgIdentifierCondition: orgRepo.NameCondition("non-existent-instance-name"),
|
||||
err: repository.ErrResourceDoesNotExist,
|
||||
err: new(database.NoRowFoundError),
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
@@ -516,7 +515,7 @@ func TestGetOrganization(t *testing.T) {
|
||||
org.InstanceID,
|
||||
)
|
||||
if tt.err != nil {
|
||||
require.Equal(t, tt.err, err)
|
||||
require.ErrorIs(t, tt.err, err)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -553,7 +552,7 @@ func TestListOrganization(t *testing.T) {
|
||||
}
|
||||
instanceRepo := repository.InstanceRepository(pool)
|
||||
err = instanceRepo.Create(ctx, &instance)
|
||||
assert.Nil(t, err)
|
||||
require.NoError(t, err)
|
||||
|
||||
type test struct {
|
||||
name string
|
||||
@@ -800,7 +799,7 @@ func TestDeleteOrganization(t *testing.T) {
|
||||
}
|
||||
instanceRepo := repository.InstanceRepository(pool)
|
||||
err := instanceRepo.Create(t.Context(), &instance)
|
||||
assert.Nil(t, err)
|
||||
require.NoError(t, err)
|
||||
|
||||
type test struct {
|
||||
name string
|
||||
@@ -933,7 +932,7 @@ func TestDeleteOrganization(t *testing.T) {
|
||||
tt.orgIdentifierCondition,
|
||||
instanceId,
|
||||
)
|
||||
require.Equal(t, err, repository.ErrResourceDoesNotExist)
|
||||
require.ErrorIs(t, err, new(database.NoRowFoundError))
|
||||
assert.Nil(t, organization)
|
||||
})
|
||||
}
|
||||
|
@@ -1,13 +1,9 @@
|
||||
package repository
|
||||
|
||||
import (
|
||||
"errors"
|
||||
|
||||
"github.com/zitadel/zitadel/backend/v3/storage/database"
|
||||
)
|
||||
|
||||
var ErrResourceDoesNotExist = errors.New("resource does not exist")
|
||||
|
||||
type repository struct {
|
||||
client database.QueryExecutor
|
||||
}
|
||||
|
Reference in New Issue
Block a user